A modern, network-enabled music player platform built on Rockbox technology. rockboxd.tsiry-sandratraina.com
rust deno navidrome airplay libadwaita zig mpris snapcast mpd rockbox audio subsonic
2

Configure Feed

Select the types of activity you want to include in your feed.

fix(rockbox-codecs): route raw ADTS "aac" streams to aac_bsf, not the MP4 codec

`afmt_for_ext("aac")` mapped raw ADTS/HE-AAC streams (content-type
audio/aac / audio/aacp) to AFMT_MP4_AAC, whose libm4a demuxer needs
moov/mdat atoms and fails outright on a raw ADTS frame stream — HE-AAC
internet radio played silence. Map "aac" to AFMT_AAC_BSF (the bitstream
decoder), matching Rockbox's own get_afmt_from_content_type() and the
.aac file-extension table. .m4a/.mp4 keep AFMT_MP4_AAC (they use the
seekable/file route, not forward streaming).

Verified: the alt64 aacPlus stream now decodes at 44100 Hz (SBR active).

Bump the affected crate chain (patch): rockbox-codecs 0.2.1,
rockbox-playback 0.4.1, rockbox-ffi 0.3.1, and rockbox-wasm 0.1.2
(ships the recompiled core).

+19 -11
+3 -3
Cargo.lock
··· 9637 9637 9638 9638 [[package]] 9639 9639 name = "rockbox-codecs" 9640 - version = "0.2.0" 9640 + version = "0.2.1" 9641 9641 dependencies = [ 9642 9642 "cc", 9643 9643 "cpal", ··· 9743 9743 9744 9744 [[package]] 9745 9745 name = "rockbox-ffi" 9746 - version = "0.3.0" 9746 + version = "0.3.1" 9747 9747 dependencies = [ 9748 9748 "rockbox-codecs", 9749 9749 "rockbox-dsp", ··· 9991 9991 9992 9992 [[package]] 9993 9993 name = "rockbox-playback" 9994 - version = "0.4.0" 9994 + version = "0.4.1" 9995 9995 dependencies = [ 9996 9996 "cpal", 9997 9997 "reqwest",
+1 -1
bindings/wasm/package.json
··· 1 1 { 2 2 "name": "rockbox-wasm", 3 - "version": "0.1.1", 3 + "version": "0.1.2", 4 4 "description": "Rockbox audio decoders + DSP compiled to WebAssembly — a batteries-included browser player (FLAC/MP3/Vorbis/Opus/ALAC/AAC/WavPack/…, 10-band parametric EQ, live internet radio) with the wasm bundled in.", 5 5 "license": "GPL-2.0-or-later", 6 6 "author": "Tsiry Sandratraina",
+1 -1
crates/rockbox-codecs/Cargo.toml
··· 1 1 [package] 2 2 name = "rockbox-codecs" 3 - version = "0.2.0" 3 + version = "0.2.1" 4 4 description = "Rockbox audio decoders (FLAC, MP3, Vorbis, ALAC, WavPack, WAV/ADPCM, …) as a reusable decoding library" 5 5 authors = { workspace = true } 6 6 edition = { workspace = true }
+9 -1
crates/rockbox-codecs/shim/rbcodec_shim.c
··· 772 772 return AFMT_OPUS; 773 773 if (!strcasecmp(ext, "flac")) 774 774 return AFMT_FLAC; 775 + /* A raw "aac" stream is an ADTS/ADIF bitstream (content-type audio/aac, 776 + * audio/aacp, audio/x-aac), NOT an MP4 container — so it must use the 777 + * bitstream decoder (aac_bsf), the same mapping Rockbox's own 778 + * get_afmt_from_content_type() and the .aac file extension use. Routing it 779 + * to AFMT_MP4_AAC runs the libm4a demuxer, which needs moov/mdat atoms and 780 + * fails outright on a raw ADTS frame stream (HE-AAC radio played silence). 781 + * The MP4 container path is only reachable via .m4a/.mp4, which stream 782 + * through the seekable/file route (moov isn't self-describing forward). */ 775 783 if (!strcasecmp(ext, "aac")) 776 - return AFMT_MP4_AAC; 784 + return AFMT_AAC_BSF; 777 785 if (!strcasecmp(ext, "m4a") || !strcasecmp(ext, "mp4")) 778 786 return AFMT_MP4_AAC; 779 787 if (!strcasecmp(ext, "wv"))
+3 -3
crates/rockbox-ffi/Cargo.toml
··· 1 1 [package] 2 2 name = "rockbox-ffi" 3 - version = "0.3.0" 3 + version = "0.3.1" 4 4 description = "Flat C ABI over rockbox-dsp + rockbox-metadata + rockbox-playback, for language bindings (Python, TypeScript, Elixir, Gleam, …)" 5 5 authors = { workspace = true } 6 6 edition = { workspace = true } ··· 25 25 player = ["dep:rockbox-playback"] 26 26 27 27 [dependencies] 28 - rockbox-codecs = { version = "0.2.0", path = "../rockbox-codecs" } 28 + rockbox-codecs = { version = "0.2.1", path = "../rockbox-codecs" } 29 29 rockbox-dsp = { version = "0.3.0", path = "../rockbox-dsp" } 30 30 rockbox-metadata = { version = "0.1.0", path = "../rockbox-metadata" } 31 - rockbox-playback = { version = "0.4.0", path = "../rockbox-playback", optional = true } 31 + rockbox-playback = { version = "0.4.1", path = "../rockbox-playback", optional = true } 32 32 serde = { workspace = true } 33 33 serde_json = { workspace = true }
+2 -2
crates/rockbox-playback/Cargo.toml
··· 1 1 [package] 2 2 name = "rockbox-playback" 3 - version = "0.4.0" 3 + version = "0.4.1" 4 4 description = "Audio playback engine over rockbox-codecs + rockbox-dsp + cpal — native ReplayGain and Rockbox crossfade" 5 5 authors = { workspace = true } 6 6 edition = { workspace = true } ··· 18 18 19 19 [dependencies] 20 20 rockbox-metadata = { version = "0.1.0", path = "../rockbox-metadata" } 21 - rockbox-codecs = { version = "0.2.0", path = "../rockbox-codecs" } 21 + rockbox-codecs = { version = "0.2.1", path = "../rockbox-codecs" } 22 22 rockbox-dsp = { version = "0.3.0", path = "../rockbox-dsp" } 23 23 cpal = "0.15" 24 24 reqwest = { version = "0.12", default-features = false, features = [