feat(qbz-qt): phase 4 — live playback, queue, and transport via QbzCore

Album-card click plays the album: get_album -> QueueTrack vec ->
set_queue -> play_track_resolved (tier walk stays in the core). 1 Hz
poll publishes position/meta/quality into the NowPlaying model; end-of-
track edge auto-advances with meta refresh (traced live: 24-bit/48kHz
CMAF stream, position advancing, track 2/3 transitions). Transport
invokables rewired to real core calls; queue panel shows NOW PLAYING +
numbered UP NEXT from get_queue_state. Public QbzCore API proved
sufficient — protected audio/player crates untouched. Named gaps:
no mute API, no playback event stream, auto-advance/prefetch semantics
remain frontend glue (~150 lines every UI must port).

km
This commit is contained in:
vicrodh committed 2026-07-27 14:04:58 -06:00
1 parent 95df643a25
commit 80dcd85a91
7 files changed
+890 -85

No files matched your search

+12 -3
View File
@@ -162,7 +162,9 @@ Rectangle {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
// POC-NOTE: the album page is out of scope — inert.
// Phase 4: a card click plays the album (the album page
// itself is out of scope — POC-NOTE).
onClicked: QbzBridge.playAlbum(card.id)
}
// Hover action buttons — favorite / play / more (INERT;
// POC-NOTE: playback + favorites land in later phases).
@@ -208,7 +210,13 @@ Rectangle {
anchors.centerIn: parent
tintName: "black"
}
MouseArea { id: playOvArea; anchors.fill: parent; hoverEnabled: true; cursorShape: Qt.PointingHandCursor }
MouseArea {
id: playOvArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: QbzBridge.playAlbum(card.id)
}
}
Rectangle {
width: 36
@@ -437,7 +445,8 @@ Rectangle {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
// POC-NOTE: album page out of scope — inert.
// Phase 4: slim rows are albums — click plays (page out of scope).
onClicked: QbzBridge.playAlbum(card.id)
}
}