Replace symphonia audio backend with rockbox-playback
The local audio renderer previously hand-rolled a symphonia + cpal + rb
stack (queue, shuffle/repeat, resume, ReplayGain, crossfade, EQ/tone DSP,
HTTP streaming) in a 2215-line SymphoniaPlayer. rockbox-playback 0.4 now
provides all of that natively, so swap the implementation for a thin
adapter over its Player.
- Add rockbox-playback = "0.4"; drop symphonia, cpal, rb and the direct
rockbox-dsp dep (all now transitive).
- New rockbox_player.rs (RockboxPlayer) implements Renderer by delegating
to rockbox_playback::Player. Player owns a cpal stream and is !Send +
!Sync, so it lives on a dedicated worker thread driven by FnOnce(&Player)
command closures; the struct holds only the Sender + a Send+Sync metadata
mirror. Delete symphonia_player.rs and voice_dsp.rs.
- Persistence: the engine owns queue order + exact playhead via its own
resume_file; fin's queue.json stays a metadata sidecar so the TUI keeps
server-provided titles/artwork. restore() calls Player::resume() with a
seed-from-sidecar fallback for first-run migration.
- Slim replaygain.rs / crossfade.rs to re-exports of the fin-config types
(tag extraction + fade curves now live in the engine).
- Rewire lib.rs / local.rs and refresh docs; sweep stale "symphonia"
mentions across fin, fin-tui and fin-mediarenderer.
- flake.nix: add stdenv.cc to the package and dev shell — rockbox-codecs /
rockbox-dsp compile Rockbox's C sources via the cc crate.
Note: rockbox-playback is GPL-2.0-or-later, so linking it makes the fin
binary GPL (already true via rockbox-dsp).