2026.06.14
[2026.06.14]
Added
arm-unknown-linux-gnueabihfcross-compilation target — newscripts/build-armhf.shbuilds a native ARMv6 hard-floatrockboxdbinary (e.g. Raspberry Pi Zero) using theDockerfile.arm-unknown-linux-gnueabihfcross-toolchain; Zig links with-Dtarget=arm-linux-gnueabihf -Dcpu=arm1176jzf_s;Cross.tomlwirescross buildto the same Docker image; firmware configure target208(ARMHFHOST) reuses the headless target files witharm-linux-gnueabihf-gccand-march=armv6 -marm -mfpu=vfp -mfloat-abi=hardcrates/alsa-sink— direct libasound PCM sink for ARM Linux; usessnd_pcm_writei(RWInterleaved, same asaplay), avoiding cpal's ALSA backend and thesnd_pcm_status_get_htstampnull-PLT-entry crash on older ARM devices; ALSA is opened once inpcm_alsa_postinit()and the writer thread lives for the daemon lifetime so resume after a pcmbuf-dry stall is instant (no re-open latency); enabled via--features fts5,alsa-sinkin the ARM build; registered asPCM_SINK_ALSA = 9infirmware/export/pcm_sink.hfirmware/target/hosted/headless/pcm-alsa.c— C PCM sink ops mirroringpcm-cpal.cbut callingpcm_alsa_*entry points.github/workflows/linux-armhf-build.yml— CI workflow that builds and uploads the armhf binary to GitHub Releases
Fixed
- ARM Linux:
SIGILLfrom__ARMv7ABSLongThunk__— Ubuntu'sarm-linux-gnueabihf-gccdefaults to-march=armv7-a; added-march=armv6 -marmto the configurearmhfhostcc()function so all C objects are tagged ARMv6; Zig's LLD then uses ARMv6-compatible thunks that work on ARM1176JZF-S - ARM Linux:
SIGILLat startup — LLD derivesHasMovtfrom the target triple (arm-linux-gnueabihf= conventional ARMv7), generatingmovw/movtthunks even when object attributes say ARMv6; fixed by usingReleaseFastto produce a compact binary (< 32 MB) that fits within LLD's direct-branch range, eliminating the need for long-range veneers - ARM Linux:
SIGSEGVinSimpleBroker::subscribe(dyn Anyvtable null) — Zig's LLD generates zero vtable entries fordyn Any + SendCOMDAT groups on ARM 32-bit inReleaseFastmode; replacedHashMap<TypeId, Box<dyn Any + Send>>incrates/graphql/src/simplebroker.rswith a type-erasedErasedSendersstruct storing the drop function as a heap pointer written at runtime (not a link-time vtable), so every function pointer is a valid non-zero Thumb address - ARM Linux:
SIGSEGVinalsa::pcm::Status::get_htstamp— on ARM devices where libasound shipssnd_pcm_status_get_htstampas a static inline (not an exported symbol) the PLT entry resolves to 0x00000000 at runtime, crashing in cpal's ALSA timing probe; fixed by replacing cpal with the directalsa-sinkthat never calls this function - ARM Linux: 32-bit ABI mismatches in
crates/sys—c_long/c_ulongare 32-bit on ARM (not 64-bit); addedas c_long/as c_ulongcasts inmetadata.rs,playback.rs,playlist.rs,sound/dsp.rs,system.rs,tagcache.rs, andas u64/as i64field casts intypes/mp3_entry.rs;crates/cli/src/lib.rsnow useslibc::rlim_tinstead ofu64forrlimitfields - ARM Linux:
audiohw_set_volumeundefined reference topcm_cpal_set_volume— gated the cpal volume call on!ARMHFHOSTinaudiohw-noop.c; volume is handled by Rockbox's DSP layer (HAVE_SW_TONE_CONTROLS) on ARM - ARM Linux:
PCM_SINK_ALSA = 9array-bounds error inpcm.c— enum entry was declared beforePCM_SINK_CMAF = 8, makingPCM_SINK_NUM = 9andsinks[9]out-of-bounds; moved ALSA entry after CMAF soPCM_SINK_NUM = 10 firmware/export/config.h: added#elif defined(ARMHFHOST)→#include "config/armhfhost.h"so the ARM hosted build is recognised as a valid platform; addedARMHFHOSTguard toaudiohw.h(sdl_codec.h inclusion) andfilesystem-app.c(rbhomepointer declaration)metadata:probe_content_type_formatnow logs the exactContent-Typestring received (or reports thatstream_content_typereturned < 0) to stderr, making HTTP format-detection failures visible; addedaudio/x-aacandaudio/vnd.dlna.adtsto the AAC-BSF MIME mapping
Full Changelog: 2026.06.07...2026.06.14