SqueezeRadio playback runtime
The development radio now runs the original SqueezeRadio playback layer without loading StandaloneRadio or HTTPSProxy. Public distribution is still paused; historical releases are not this implementation. Tested on one Squeezebox Radio (baby) with stock 7.7.3 r16676 firmware.
Application layer
SqueezePlayer.lua: station lifecycle, format selection, ICY metadata, reconnects with capped retry frequency, stop/resume and firmware decoder control. It synchronizes the local firmware player mode and sends mode-change notifications so the speaker amplifier stays active during playback; intentional stop restores normal idle behavior. AAC radio streams use ADTS framing; headers configure the metadata interval before decoding begins.SqueezePresets.lua: one-time import of existing user preset data into SqueezeRadio settings, saved selection and subsequent preset edits. Does not load or execute an upstream applet. The trusted local settings data file is evaluated in an isolated environment.SqueezeCovers.lua: original iTunes metadata matching and bounded artwork fetching, stale-result rejection and limited retries. Missing covers do not interrupt audio.SqueezeHttp.lua: bounded asynchronous requests through our local verified-TLS helper.- Existing original display, weather, hardware info and authenticated LAN API remain. Firmware actions route physical preset/play/pause/stop buttons to the new player.
The stock firmware provides Jive UI/networking and its audio decoder. We call those installed APIs; no firmware or codec implementation is included here.
Transport
native/transport.c is original application code. It uses OpenSSL 3.5.8 with CA and hostname verification, TLS 1.2 minimum, bounded redirects and connection setup, chunked-response decoding, request/header limits and three concurrent workers. It listens only on 127.0.0.1:8875 and refuses private/LAN upstream targets. HTTPS redirects cannot downgrade to HTTP. Plain HTTP stations remain plain HTTP.
The radio's C runtime is statically built with musl for ARM926EJ-S / ARMv5 soft-float. build-radio.sh checks the pinned OpenSSL source SHA-256 and Zig 0.14.1, builds the helper and assembles CA/license resources in ignored dist/runtime. The installed launcher is scripts/start-transport.sh; it must start before any foreground command in the owner's rcS.local. The installer preserves other startup commands and checks stale PID files against the executable command line.
OpenSSL archive SHA-256: a8f84a39918ec6415ce765d9b429d313ba97b8143169c172e734b9514464f5b2.
Ownership and notices
The repository applies MIT to Michael McCullough’s original contributions; it does not certify independent authorship of every file or grant rights to third-party material. The complete provenance review remains open. OpenSSL is Apache-2.0, musl has MIT/compatible notices, and the Mozilla trust data extracted by curl is MPL-2.0. Their notices accompany a locally built runtime. The CA header/source reference is retained. See notices. Binaries, CA data and personal device configuration are not committed.
The test radio uses our original scripts/sync-clock.sh service around its existing firmware msntp utility and RTC, plus licensed mDNS for the hostname. StandaloneRadio, HTTPSProxy and StandaloneTime have been removed from the device. A verified recovery archive is stored privately on the owner’s Mac.
Verification
- Controlled native transport fixtures: HTTP and ICY, chunked responses, relative redirects/redirect loops, malformed requests and headers, content-length boundaries, trusted TLS, untrusted/mismatched certificates, HTTPS downgrade rejection, worker saturation and recovery.
- Lua tests: original applet namespace/startup, preset import and preservation, hardware-action routing, AAC framing, metadata propagation, stop/cancel, stale retry rejection and capped retry frequency.
- Physical radio: all six saved presets reach PLAYING with advancing decoder elapsed time and received bytes; KNTU/KEXP use AAC and the other four MP3. Stop/resume passes. Audible output confirmed by Michael. Preset labels, pairing, theme and display are preserved. The TLS helper starts after reboot with old playback/proxy applets absent from the active loader path.
Still outstanding: full clean-radio installation, all UI/hardware interactions, broader codec/playlist formats, sustained network-loss/resource testing and a full security/provenance audit. HLS and arbitrary playlist resolution are not claimed supported. Keep a verified rollback copy and describe this as a development build.
Continuous playback
There is no automatic playback time limit. The player checks decoder progress and reconnects if audio stops advancing for more than 20 seconds, even when the firmware still reports a playing state. After six unsuccessful retries, failed connections are retried once a minute until playback returns or the user stops it. Intentional stop and power-off do not reconnect.