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
Memory Index#
- Project: HTTP stream playback — rockbox-zig branch
copilot/add-http-stream-playback-support; fixes to metadata parsers and netstream crate for HTTP(S) playback - Feedback: stale binary caused silent failures — always rebuild
target/release/rockboxafter changing C/Rust code;librockbox.arelink does not happen automatically - Project: Snapcast FIFO audio output — pcm-fifo sink setup, startup order, snapserver config workaround for macOS
- Feedback: use tracing for logging — never use eprintln!/println! in Rust; always use tracing::debug/info/warn/error
- Project: Squeezelite PCM sink — squeezelite output via Slim Protocol TCP + HTTP PCM stream; crates/slim/, PCM_SINK_SQUEEZELITE=3, key bugs: tv_nsec overflow, HTTP kick loop, 36s watchdog
- Feedback: Slim Protocol keepalive required — send audg on every STMt heartbeat or squeezelite disconnects after 36s; full-volume audg is 9 bytes
- Project: GPUI context menu positioning pattern — context menus must be rendered at LibraryPage root div level, not inside nested entities like FilesView
- Project: Expo mobile app — rockbox-zig/expo React Native + NativeWind client mirroring the GPUI desktop UI, mock data today
- Feedback: Expo app — always use NativeWind, no inline styles — className-only styling rule; never combine function
stylewithclassName - Project: Expo module — symmetric peer — phone runs full embedded rockboxd (firmware + codecs + gRPC/GraphQL/HTTP/MPD servers + AAudio sink + mDNS advertise) AND keeps the tonic LAN client to control other peers
- Feedback: Android embedded daemon — always FTS5, never typesense — search backend on Android cdylib must use the
fts5Cargo feature; no typesense subprocess - Project: Codec loading — desktop dlopen vs Android static-link —
.codecfiles are dlopen'd.so/.dylibon desktop; Android blocks dlopen from app dirs so codecs must be statically linked into the cdylib (the model Rockbox hardware targets already use) - Project: Android codecs use BINFMT_STATIC — concrete plan: add 3rd CONFIG_BINFMT value + CODECS_STATIC make flag + per-codec __header rename + lc-android.c table loader
- Project: rockbox-sys depends on Zig-exported rb_* symbols — 18 extern symbols in crates/sys/src/lib.rs come from zig/src/main.zig wrappers; need a C compat layer (rb_zig_compat.c) for the Android cdylib
- Feedback: macOS Mach-O underscore prefix in objcopy --redefine-sym — pass both
name=newand_name=_newto handle both Mach-O and ELF; verified during CODECS_STATIC smoke test - Feedback: Android cdylib needs --features embedded-daemon + --platform 26 — without
embedded-daemonCargo feature the .so is a 6 MB remote-only client; AAudio needs API 26 sysroot - Project: Android cdylib needs both ROCKBOX_SERVER and CONFIG_SERVER —
apps/main.c:486gates server_init() call on ROCKBOX_SERVER;apps/SOURCES:314gates the .c COMPILATION on CONFIG_SERVER — define both - Feedback: Android FGS — startForeground within 5s of every startForegroundService — every onStartCommand action branch must reach refreshNotification() or Android kills the process
- Project: Android codec filename split — CODECS_STATIC vs Java-shell — metadata.h's CODEC_PREFIX/EXTENSION must use
<name>.codec(notlibNAME.so) when CODECS_STATIC, or every play call dies with "Codec: cannot read file" - Project: CODECS_STATIC ci-symbol type collision —
apps/codecs.c::ci(264-byte struct) silently merges with each codec'scodec_crt0.c::ci(8-byte pointer); fix is firmware-side rename tofirmware_ci - Feedback: pcm_sink set_freq receives an INDEX, not Hz — translate via
hw_freq_sampr[idx]before handing to the OS API or you get chipmunk audio - Project: fw_bus removal + POSIX threads migration — fw_bus deleted; all handlers use
rb::with_kernel_lock; all targets now HAVE_POSIX_THREADS; PLAYER_MUTEX removed; with_kernel_lock is panic-safe via KernelGuard RAII - Project: pcm-aaudio pthread races kernel mid-stream pcmbuf reconfig — narrower race window in
pcmbuf_init; wrapped in pcm_play_lock/unlock as defence-in-depth - Project: stale thread->blocker → wakeup_thread NULL-fn-ptr crash — root cause was missing kernel lock on external OS threads; fixed by with_kernel_lock
- Project: Embeddable desktop library (librockboxd.a) — crates/embed + zig build lib → fat static archive; gpui embeds daemon directly, no external rockboxd process