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:
3 files changed
+283
No files matched your search
@@ -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
|
||||
@@ -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
|
||||
Reference in new issue
Block a user