Fix release of Casquinha — the b50→b55 arc: MP3 decode moves off the cooperative loop onto a preemptive Multiprocessing Services task, so menus, window drags and dialogs no longer kill the music.
What changed since b49:
- Decode survives the loop: an MPLibrary task pumps the new portable
cq_decringpipeline (compressed SPSC ring → minimp3 → PCM ring) every ~5 ms, preemptively — freezes never stop decode, short menu holds are fully seamless, and recovery from long ones is instant (no more machine-gun catch-up). Falls back to inline decode when MPLibrary is absent. - The event loop reads as the schedule it is:
HandleEvent/ComputeSleep/TickCaret/TickDiagnosticsextracted; the loop stays the only clock. - Radio physics documented, chaos removed: the deep-cushion/live-cut experiment ran its course in the field and is reverted — latency stays at the proven ~3 s. The conservation law (ear-lag == cushion) and the post-mortem live in
design/CUSHION-PHYSICS.md. - Server pairing (recommended):
design/SPEC-burst.md— Icecastqueue-size~2 MB stops slow-client disconnects during long UI freezes.
Requirements: Mac OS 9.x (PowerPC or emulated via UTM/QEMU), Open Transport, MPLibrary (ships with 8.6+; optional — inline fallback otherwise), a gopher-spot server on the LAN (default 10.0.100.112:70, configurable in Preferences ⌘,).
Files:
Casquinha-b55.bin— MacBinary-encoded applicationCasquinha-b55.dsk— mountable disk image containing the app
Host-side test suite: 231 checks green. Debug telemetry opt-in via the Casquinha Debug marker file — see the README.
🤖 Generated with Claude Code