All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
sdk/python/, sdk/ruby/, sdk/elixir/, sdk/gleam/, sdk/clojure/) — each ships with examples covering playback, queue, library search, saved/smart playlists, volume/EQ, browse, devices, Bluetooth, and pluginssdk/typescript/examples/) plus a Bluetooth API (api/bluetooth.ts) and a getVolume / VolumeInfo endpoint on api/sound.tsbrowse.displayName and album.copyrightMessageMp3Entry metadata (title, artist, album, duration, etc.) from the DB Track record in the playlist handlers when Rockbox cannot read tags locallymin_w_0 / flex_shrink_0 to the flex containerscrates/upnp/src/api/get_covers_base() instead of the hardcoded http://localhost:6062/covers/ basecrates/server) migrated from a custom request/response layer to Actix-web — handlers now accept web::Data, web::Path, and web::Query and return actix_web::Result<HttpResponse>; blocking C FFI work is offloaded to web::blockOnceLock instead of being created per-thread, reducing overhead and avoiding nested-runtime panicsRLIMIT_NOFILE is raised to 4 096 at startup on Unix to accommodate large music librariesstop and pause are now non-blocking — they use audio_queue_post so they can safely be called from any OS thread; audio_hard_stop posts Q_AUDIO_STOP with data=2 and the audio thread frees audiobuf_handle itself, preventing cross-thread freesweb::block threads to avoid starving Actix worker threads and prevent nested tokio/reqwest blocking contextsfetchGlobalStatus() (gRPC GetGlobalStatus) instead of getDevices() to avoid spurious UNIMPLEMENTED errors on probestd::sync::mpsc to avoid cross-runtime waker issues when bridging Tokio → GPUIobserve_global registrations in GPUI now call .detach() instead of silently dropping the subscription handleNULL/blank and YYYY-MM-DD HH:MM:SS timestamps in the library database to RFC3339 so SQLx DateTime<Utc> decoding no longer failsINNER JOIN and filter out empty-string IDs, excluding bogus entries from resultsprintln!/eprintln! diagnostics in crates/controls and crates/mpd replaced with tracing::error!~/.config/rockbox.org/device-id, so the registered mDNS service name remains stable between daemon restarts instead of changing on every launchscan_mdns() in the daemon registers itself via mDNS; the GPUI app and macOS app gain a Server Picker UI that enumerates nearby rockboxd instances and switches without restart; a notification triggers one-shot syncs to re-run on server changealbum_art_uri is returned from UPnP directory listings; save_audio_metadata downloads and caches the cover when no embedded art is present; remote metadata is persisted concurrently (semaphore-limited) without blocking C/FFIcopyright_message field on the Album GraphQL type, displayed in AlbumDetails alongside a formatted release datetypesense-server into the final imagerockbox CLI (bluetooth scan, bluetooth devices, bluetooth connect <address>, bluetooth disconnect <address>) — Linux only, talks to a running rockboxd via gRPCbluetoothDevices query, bluetoothScan / bluetoothConnect / bluetoothDisconnect mutations) now call rockbox-bluetooth directly instead of going through the HTTP server — eliminates an extra round-trip on LinuxBluetoothService gRPC RPC renamed from Connect to ConnectDevice to avoid a name collision with tonic's auto-generated transport connect constructor, which caused a compile error (duplicate definitions with name connect).task ID now encodes both mode and path so a mode change with a nil path correctly triggers a reloadsnapcast icon/colour entryrefresh() only sets isLoading when the device list is emptynetstream) no longer permanently breaks after a failed seek: seek_to() now only replaces the active response on success, so a failed Range request leaves the stream readable at the current positionTYPE_ID3 handles for remote tracks that fail to open now send BUFFER_EVENT_FINISHED with an empty mp3entry instead of silently never posting Q_AUDIO_FINISH_LOAD_TRACK, which caused the track-loading chain to stall on playlist restore with many queued UPnP tracks) to direct-child (>) combinator so the .no-play guard is respectednormalize_volume = true in settings.toml) — RMS-based AGC with asymmetric attack/release, similar to Spotify's "Normalize Volume"; applied across all PCM sinks (SDL, FIFO, AirPlay, Squeezelite, UPnP, Chromecast, Snapcast TCP)GET /player/volume REST endpoint returning { volume, min, max }volume GraphQL query returning live current volume with min/max rangeuseGetVolumeQuery GraphQL hook in the web UIget_current_volume() gRPC client helper in the GPUI appdiv with SeekBar component)min/max on the MUI SliderglobalSettings.volume in GraphQL now returns the live current volume via rb::sound::current(0) instead of a hardcoded 0VOLUME_MIN_DB constant in GPUI corrected from -74 to -80 (SDL target range)SoundCurrent gRPC instead of the stale saved settingadjust_volume now has audible effect on all non-SDL PCM sinks (FIFO, AirPlay, Squeezelite, UPnP, Chromecast, Snapcast TCP) — SW volume scaling (pcm_copy_buffer) was not being applied in any of these sinksaudio_output = "snapcast_tcp") — streams S16LE PCM directly to a Snapcast tcp:// source; compatible with snapserver v0.35+getvol / setvol handlers now correctly map the Rockbox dB range (−80..0) to the MPD 0–100 scale@rockbox/sdk) for controlling rockboxd from Node.js / browser applicationsaudio_output = "chromecast") — streams WAV over HTTP and controls playback via the Cast Media protocolupnp_server_enabled), MediaRenderer:1 (upnp_renderer_enabled), and UPnP PCM sink (audio_output = "upnp") with auto-renderer discoveryairplay_receivers list in settings.toml supports sending to multiple RAOP receivers simultaneouslyaudio_output = "squeezelite") — Slim Protocol TCP server + HTTP PCM broadcast; supports unlimited concurrent squeezelite clients with independent reader cursorsStreamLibrary gRPC server-streaming RPC — pushes library updates to clients when a scan completesdebug level instead of warn to reduce noiseCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |