docs(qt): playback_qt's header lists OWED PORTS, not "deliberate cuts"

It still advertised the gapless gap after the fix landed — the exact failure
the parity inventory was built to stop. A comment that outlives its gap is
worse than no comment: it reads as tracked.

Three corrections. The gapless entry is gone (it is wired). The blacklist entry
claimed "store not open", which is false — artist_blacklist is bound in
auth_qt's three session paths, so the store was open the whole time and only
the consumption was missing. And the framing: these are debt with an owed port
(TRACK-RULES rule 8), not scope decisions, so each now carries its
PARITY-DEBT.md row and its severity.

New cuts go in that file, not in this header.

cc
This commit is contained in:
vicrodh committed 2026-07-30 08:29:08 -06:00
1 parent 809dafce1a
commit 70e161bc08
1 file changed
+29 -11
+29 -11
View File
@@ -5,18 +5,36 @@
//! and the poll loop (PlaybackEvent -> UI state, track-change meta refresh,
//! end-of-track advance).
//!
//! POC-NOTEs (deliberate cuts vs playback.rs, named for the effort report):
//! OWED PORTS vs playback.rs. These are DEBT, not scope decisions: a fix that
//! lived in the frontend is not inherited and has to be replicated (TRACK-RULES
//! rule 8, whose title is "los fixes de backend deben llegar al Qt"). Each one
//! is tracked in `qbz-nix-docs/qt-frontend/2026-07-30-parity-debt/PARITY-DEBT.md`
//! — add there, not here, so a note cannot outlive its gap unnoticed. That is
//! exactly how gapless stayed broken: this header advertised it for weeks.
//!
//! - Blacklist filtering of the QUEUE (PARITY-DEBT #1, AUDIBLE): the old note
//! here said "store not open", which is FALSE — `artist_blacklist` is bound
//! at `auth_qt.rs`. The Slint drops blacklisted tracks at ~18 play/enqueue
//! entry points (`filter_blacklisted_queue`, playback.rs:2624-2651); this
//! module has none, so a blocked artist still plays.
//! - `advance_to_playable`, the bounded skip-unavailable walk
//! (playback.rs:455-511) (PARITY-DEBT #2, AUDIBLE): the advance here takes
//! the core queue's next directly and a failed play logs and returns, so one
//! unavailable track wedges the queue — and the early return skips the
//! refresh, leaving the bar on the previous track.
//! - Volume persistence (PARITY-DEBT #3, AUDIBLE): never written or restored.
//! - Session persist / resume-position: both prefs are persisted by settings
//! and read by nobody.
//! - Streaming quality: seeded from ui_prefs ("streaming_quality") and
//! live-updated by Settings > Audio (settings_qt). The #638 device-cap
//! clamp lives in the Slint glue and is NOT ported.
//! - Blacklist filtering of album tracks: skipped (store not open).
//! - Offline-cache tier (offline bytes), gapless prefetch (`play_next`),
//! prefetch warming, stop-after, infinite refill, session persist,
//! QConnect/cast branches, recently-played recording: all out of scope.
//! Auto-advance therefore plays each successor at fetch time (audible
//! gap between tracks) — the engine's gapless path is NOT wired.
//! - `advance_to_playable` (skip-unavailable walk): the POC advance takes
//! the core queue's next directly; a failed play logs and stops.
//! live-updated by Settings > Audio (settings_qt). The #638 device-cap clamp
//! lives in the Slint glue and is NOT ported.
//! - Offline-cache tier (offline bytes), prefetch warming, stop-after,
//! infinite refill, QConnect branches, recently-played recording.
//!
//! DONE, previously listed here: gapless prefetch — the engine raises
//! `gapless_ready` ~10s out and this module now answers it with `play_next`
//! (both the streaming and the local/DSD arms), so transitions are
//! sample-accurate again.
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::{Arc, RwLock};