docs: add 1.2.0 release documents

TAG_DETAILS.md, CHANGELOG_HIGHLIGHTS.md, CHANGELOG_FULL.md for the
Qobuz Connect release. 185 commits covering QConnect protocol, Linebed
visualizer, playlist follow/unfollow, audio settings sync overhaul, and
dozens of fixes.

cc
This commit is contained in:
vicrodh committed 2026-03-19 15:21:22 -06:00
1 parent ac9d38b2a9
commit 6245ac9633
3 files changed
+283

No files matched your search

+111
View File
@@ -0,0 +1,111 @@
# QBZ 1.2.0 Full Changelog
185 commits between v1.1.20 and v1.2.0.
## New Features
### Qobuz Connect
- Full Qobuz Connect protocol implementation (renderer + controller)
- 4 new crates: qconnect-protocol, qconnect-core, qconnect-app, qconnect-transport-ws
- Native WebSocket transport with qcloud framing and protobuf encoding
- Queue domain model, reducer, and pending lifecycle
- Renderer domain state with server command contracts
- App adapter with pending timeout, resync, and concurrency policy
- Controller command API and session snapshots
- Admission middleware with blocked events
- QConnect toggle button beside cast in player bar
- QConnect panel with runtime diagnostics
- Renderer command routing through CoreBridge
- Queue materialization and remote playback hydration
- Active renderer state tracking for skip and seekbar
- Volume/mute routing to peer renderer
- Shuffle, repeat, queue play, and history play guards
- Autoplay mode sync and load_tracks remote commands
- QConnect badge as full-height badge in song card
- Developer toggle for QConnect dev panel
- Custom device name with hostname detection
### Linebed Visualizer
- New 3D terrain visualizer in Immersive mode
- 4096-point FFT with 512 bands and linear scaling
- 200 lines at 60fps with real 3D perspective projection
- Power-law frequency redistribution and edge tapering
- Isometric perspective matching musicvid.org camera angle
- FPS control in settings (default 60fps)
- Canvas viewport adjusted to not overflow player area
### Playlist Follow/Unfollow
- Qobuz API playlist/subscribe and playlist/unsubscribe endpoints
- v2_qobuz_subscribe_playlist and v2_qobuz_unsubscribe_playlist commands
- Bookmark toggle button in PlaylistDetailView
- Favorites/Following sub-tabs in Favorites > Playlists
### Other Features
- Documentation link in sidebar gear menu
- Help tooltips on bit-perfect audio settings (Exclusive Mode, DAC Passthrough, Force Bit-Perfect)
- No-telemetry note on MusicBrainz integration description
- Portuguese (pt-BR) translation
- Artwork proxy through backend cache
- Streaming playback with seekbar position tracking
- True gapless playback for ALSA Direct mode
## Audio Fixes
- Audio settings sync to CoreBridge player on change and session activation
- alsa_hardware_volume was hardcoded false in conversion function
- v2_reset_audio_settings now syncs to CoreBridge player
- Volume locked at 100% when ALSA Direct hw: is active
- PipeWire rate switch delay increased from 300ms to 500ms
- PipeWire rate verification after stream creation with automatic retry
- HiFi Wizard reads real DAC sample rates from /proc/asound
- Souvlaki MediaControlError formatting uses {:?} for cross-platform compatibility
- ALSA device lock prevented on streaming failure
- PipeWire suspension before ALSA Direct exclusive access
- Clock.force-rate re-applied after stream creation on resume
- HTTP auto-decompression disabled for audio downloads
- 120s total timeout removed for large Hi-Res+ tracks
- Quality fallback when CDN fails at current quality level
- Retry with fresh URL on CDN premature EOF
## Window / UI Fixes
- KWin SSD window rule hack removed entirely (caused double titlebar + CPU spike)
- Stale KWin rules from v1.1.14-v1.1.20 cleaned up on startup
- Screen resolution clamping fixed (xdpyinfo returns combined multi-monitor)
- Offline mode button added to network error screen
- Artist album counts removed from Favorites and Search (misleading API data)
- Playback error messages show actual details instead of [object Object]
- Discover menu items navigate to correct home tab
- Session restore hardened to prevent ghost CSS errors
- Tray icon visibility improved across Linux DEs
- Bit-perfect stream match rules corrected
## Distribution / Build
- MuPDF upgraded from 0.5 to 0.6 (fixes Arch Linux build)
- Booklet feature gate removed — MuPDF always compiled
- Snap MPRIS slot removed to unblock Snap Store review
- Issue templates migrated to YAML forms
- Dependency updates: devalue 5.6.4, SvelteKit 2.53.3
- Credential tests skip correctly in Nix sandbox
- Dependabot config and PR redirect workflow added
- Local library disc/CD suffix no longer misidentified as disc folders
## Qobuz Connect Protocol Details
- Protobuf queue command and server event contracts
- Android controller WebSocket message support
- Outbound renderer reports (RNDR_SRVR)
- Inbound server commands (SRVR_RNDR) decoding
- Queue drift reporting and reorder/remove event resyncs
- Authoritative queue mutations and shuffle order
- Remote repeat mode with pending/ack lifecycle
- Rapid transport control unblocking
- Session cursor alignment and renderer handoff
- Queue replacement through shared helper
- Stale renderer drift suppression during queue loads
## i18n
- All new features localized in 5 languages (en, es, de, fr, pt)
- Playlist follow/unfollow, sub-tabs, volume lock, help tooltips, documentation link, MusicBrainz privacy note
@@ -0,0 +1,54 @@
# QBZ 1.2.0 Release Highlights
## Highlights
- **Qobuz Connect** — full multi-device playback: renderer and controller mode, server-authoritative queue, bidirectional transport controls, session management, and device presence
- **Linebed visualizer** — 200-line 3D terrain driven by 4096-point FFT with real perspective projection at 60fps
- **Qobuz playlist follow/unfollow** — subscribe to playlists on your Qobuz account; new Favorites/Following sub-tabs
- **Audio settings sync overhaul** — all critical settings now sync to the player immediately; fixes exclusive mode not working with QConnect
- **Volume lock for ALSA Direct hw:** — software volume locked at 100% when bit-perfect hardware output is active
- **HiFi Wizard** — real DAC sample rates from /proc/asound; help tooltips on bit-perfect settings
- **MuPDF 0.6** — booklet viewer restored on Arch Linux
- **Offline mode** — Start Offline button on network error screen
## Qobuz Connect
- Renderer mode: receive playback commands from phone/tablet/web
- Controller mode: control remote devices from QBZ
- Server-authoritative queue sync across all devices
- QConnect badge in player bar with device type icon
- Developer panel and custom device name in Settings
## Linebed Visualizer
- 3D spectral terrain with 512 bands and logarithmic frequency redistribution
- Real camera projection with configurable FPS
- Canvas viewport adjusted to not overflow into player area
## Audio
- All audio setters (backend_type, exclusive_mode, dac_passthrough, etc.) now reload into CoreBridge player immediately
- Volume locked at 100% on ALSA Direct hw: — adjust at DAC level
- PipeWire rate switching: longer delay, post-creation verification, automatic retry
- HiFi Wizard reads real DAC rates from /proc/asound instead of hardcoded defaults
## Playlists
- Follow/unfollow Qobuz playlists (native API, syncs across clients)
- Favorites > Playlists split into Favorites and Following sub-tabs
- Bookmark button alongside Copy and Favorite in playlist detail
## Stability
- KWin SSD window rule hack removed — caused double titlebar and CPU spike
- Window size clamping fixed for multi-monitor setups
- Playback errors show actual messages instead of [object Object]
- Nix build credential tests skip correctly in sandbox
## Bug Fixes
- Offline mode accessible from network error screen
- Artist album counts removed (misleading Qobuz API data)
- MuPDF upgraded to 0.6 for Arch compatibility
- Snap MPRIS slot removed to unblock store review
- Issue templates migrated to YAML forms
+118
View File
@@ -0,0 +1,118 @@
# 1.2.0 — Qobuz Connect
The headline feature of this release is **Qobuz Connect** — a full implementation of Qobuz's real-time streaming protocol that turns QBZ into both a renderer and controller for multi-device playback. Also includes the **Linebed visualizer**, **Qobuz playlist follow/unfollow**, a complete audio settings sync overhaul, and dozens of fixes across playback, offline mode, and window management.
---
## Qobuz Connect
QBZ now implements the Qobuz Connect protocol, enabling multi-device playback control. Start music on your phone, hand it off to QBZ on your desktop, or control QBZ from any Qobuz client.
- **Renderer mode** — QBZ receives playback commands from other Qobuz clients (phone, tablet, web)
- **Controller mode** — control playback on remote devices from QBZ's UI
- **Server-authoritative queue** — queue state is synced through Qobuz's cloud, ensuring consistency across all devices
- **Transport controls** — play, pause, skip, seek, shuffle, repeat, and volume all work bidirectionally
- **Session management** — join/leave sessions, renderer selection, and device presence
- **QConnect badge** — compact two-row badge in the player bar showing connection status and active device type
- **Developer panel** — optional diagnostics panel for QConnect debugging (hidden by default, toggle in Settings > Developer Mode)
- **Custom device name** — editable announce name in Settings > Integrations (defaults to "Qbz - hostname")
Built from scratch as 4 independent crates: `qconnect-protocol` (protobuf wire format), `qconnect-core` (queue/renderer domain), `qconnect-app` (application logic), and `qconnect-transport-ws` (WebSocket transport).
## Linebed Visualizer
A new 3D terrain visualizer in Immersive mode, inspired by musicvid.org's spectral landscape.
- **200 lines at 60fps** — real-time 3D mountain terrain driven by audio spectrum data
- **4096-point FFT** — 512-band spectral analysis with logarithmic frequency redistribution
- **Real 3D projection** — proper camera, perspective, and depth with configurable FPS
- **Power-law scaling** — spectral peaks are redistributed for visual balance across bass, mids, and highs
## Qobuz Playlist Follow/Unfollow
- **Follow on Qobuz** — subscribe to any playlist directly on your Qobuz account; syncs across all Qobuz clients
- **Unfollow** — remove subscription from Qobuz
- **Favorites vs Following** — new sub-tabs in Favorites > Playlists to separate local favorites from Qobuz subscriptions
- **Bookmark toggle** — dedicated button in playlist detail view alongside existing Copy and Favorite actions
---
## Audio Settings Sync Overhaul
A critical fix for exclusive mode and bit-perfect playback: audio settings were not being propagated to the CoreBridge player when changed through the UI.
- **All critical setters now sync immediately** — backend_type, exclusive_mode, dac_passthrough, output_device, alsa_plugin, pw_force_bitperfect, sample_rate, and alsa_hardware_volume
- **Session activation sync** — per-user audio settings are pushed to the CoreBridge player on login, not just at startup
- **alsa_hardware_volume fix** — was hardcoded to `false` in the conversion function; now reads the actual setting
- **v2_reset_audio_settings** — now syncs defaults to the player after reset
## Volume Lock for ALSA Direct hw:
- **100% volume lock** — when ALSA Direct with hw: plugin is active, software volume is locked at 100% (volume must be controlled at the DAC/hardware level)
- **Visual lock** — volume slider disabled and grayed out with tooltip explaining why
- **Backend guard** — v2_set_volume forces 1.0 regardless of frontend requests when ALSA Direct hw: is active
## PipeWire Rate Switching
- **Longer rate switch delay** — 300ms → 500ms for USB hubs/docks that need more time
- **Rate verification** — after stream creation, queries `pw-metadata clock.rate` to verify PipeWire actually applied the requested rate
- **Automatic retry** — if rate mismatch detected, retries with additional 500ms delay and re-forces the rate
- **Logging** — warnings when rate can't be verified so users can report issues
## HiFi Wizard
- **Real DAC sample rates** — now reads actual discrete rates from `/proc/asound/cardN/stream0` instead of hardcoded defaults; fixes incorrect 176.4kHz showing for DACs that don't support it
- **Help tooltips** — `(?)` icons on Exclusive Mode, DAC Passthrough, and Force Bit-Perfect settings with detailed explanations of what each does, which backend it requires, and how they relate
## Booklet Viewer
- **MuPDF 0.6** — upgraded from 0.5; fixes struct size mismatch on Arch Linux
- **Always available** — removed the `booklet` feature gate; MuPDF is now a direct dependency (matching v1.1.19 behavior)
---
## Offline Mode
- **Network error screen** — "Failed to connect" error box now shows a "Start Offline" button alongside Retry, matching the timeout and login form behavior
## Window Management
- **KWin SSD hack removed** — the KWin window rule approach (writing to kwinrulesrc) caused double titlebar and CPU spikes on KDE Plasma 6; removed entirely
- **Stale KWin rules cleaned** — existing rules from v1.1.14-v1.1.20 are automatically removed on startup
- **Window size clamping fixed** — previous approach used xdpyinfo which returns combined multi-monitor resolution, causing false positives; now only guards against obviously corrupt values (>8K), falling back to 1920x1080
## Playback
- **Error messages** — playback failures now show actual error details instead of `[object Object]`
- **Souvlaki fix** — MediaControlError formatting uses `{:?}` instead of `{}` for cross-platform compatibility
## UI Improvements
- **Artist album counts removed** — Qobuz API's `albums_count` includes compilations, tributes, and appearances; removed from Favorites and Search to avoid misleading numbers
- **Documentation link** — added to sidebar gear menu, opens the GitHub wiki
- **MusicBrainz privacy note** — help text now clarifies that QBZ has no telemetry; MusicBrainz is a one-way pull
- **Linebed viewport** — canvas offset to avoid overflowing into player controls area
## Distribution
- **Snap MPRIS removed** — dropped mpris slot from snapcraft to unblock Snap Store review
- **Issue templates** — migrated from markdown to YAML forms with dropdowns and required fields
- **Dependency updates** — devalue 5.6.4 (prototype pollution fix), SvelteKit 2.53.3 (deserialization DoS fix)
- **Nix build** — credential roundtrip tests now skip correctly in Nix sandbox
## Bug Fixes
- Portuguese locale added with correct display name
- Artwork proxy through backend cache for track rows and album headers
- Local library disc/CD suffix no longer misidentified as disc folders
- Discover menu items navigate to correct home tab
- CDN premature EOF handled with fresh URL retry and quality fallback
- ALSA device lock prevented on streaming failure
- Streaming playback with seekbar position tracking
- Session restore hardened to prevent ghost CSS errors
---
Special thanks to **@afonsojramos** for the souvlaki cross-platform fix (from PR #181).
Full changelog: https://github.com/vicrodh/qbz/compare/v1.1.20...v1.2.0