feat(qt): wire local-network casting end to end

The two cast buttons in the now-playing bars rendered and did nothing: no
service, no bridge, no picker. This ports crates/qbz/src/cast_service.rs
onto the shared qbz-cast crate (discovery, both device families and the
media server are the crate's, not reimplemented) and hangs a QbzCast
singleton off it.

Discovery is armed only by openPicker() and stopped by closePicker(), so a
user who never opens the picker sends no mDNS/SSDP traffic. Connecting
stops the local backend through its public seam and re-casts the current
track at the streaming preference clamped by the per-renderer cap.

Playback is routed at four seams in playback_qt (new track, toggle, seek,
volume) and the local poll yields while casting — without that the two
polls fight over the bar every second. Logout and exit tear the connection
down, or the renderer keeps playing after the app is gone.

Deliberate gaps, each named in the module header: no offline-cache tier,
no QConnect suspend/restore, no Plex casting (the Slint carries the same
TODO), and lyrics do not follow a remote position yet.

cc
This commit is contained in:
vicrodh committed 2026-07-29 00:56:07 -06:00
1 parent c56fab3c4e
commit 87b18fa7f7
10 files changed
+2530 -18

No files matched your search

+1
View File
@@ -56,6 +56,7 @@ ApplicationWindow {
QbzAlbum.boot()
QbzArtist.boot()
QbzLyrics.boot()
QbzCast.boot()
QbzBridge.boot()
}