From 6245ac96331c9b8c9864e7ec1c532cbd99243f46 Mon Sep 17 00:00:00 2001 From: vicrodh Date: Thu, 19 Mar 2026 15:21:22 -0600 Subject: [PATCH] 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 --- docs/release-1.2.0/CHANGELOG_FULL.md | 111 +++++++++++++++++++ docs/release-1.2.0/CHANGELOG_HIGHLIGHTS.md | 54 ++++++++++ docs/release-1.2.0/TAG_DETAILS.md | 118 +++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 docs/release-1.2.0/CHANGELOG_FULL.md create mode 100644 docs/release-1.2.0/CHANGELOG_HIGHLIGHTS.md create mode 100644 docs/release-1.2.0/TAG_DETAILS.md diff --git a/docs/release-1.2.0/CHANGELOG_FULL.md b/docs/release-1.2.0/CHANGELOG_FULL.md new file mode 100644 index 000000000..5360f49ff --- /dev/null +++ b/docs/release-1.2.0/CHANGELOG_FULL.md @@ -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 diff --git a/docs/release-1.2.0/CHANGELOG_HIGHLIGHTS.md b/docs/release-1.2.0/CHANGELOG_HIGHLIGHTS.md new file mode 100644 index 000000000..394900ca8 --- /dev/null +++ b/docs/release-1.2.0/CHANGELOG_HIGHLIGHTS.md @@ -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 diff --git a/docs/release-1.2.0/TAG_DETAILS.md b/docs/release-1.2.0/TAG_DETAILS.md new file mode 100644 index 000000000..566923029 --- /dev/null +++ b/docs/release-1.2.0/TAG_DETAILS.md @@ -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