fix: stabilize playback memory, local library sync and Qt settings

Add shared playback memory profiles, bounded disk-backed playback and storage
selection for desktop and daemon. Preserve gapless during streaming-only playback
and provide explicit cache eviction with playback confirmation.

Stop watcher read events and unchanged scans from rebuilding the local catalog.
Restore playlist/sidebar updates, folder availability feedback and player layout.
Add appearance presets and a radio-based cache settings panel with translated
trade-offs, plus consistent clipboard menus across visible Qt text editors.

Validate with Rust regressions, QML interaction tests, isolated release startup
and idle-library checks; extend the shared local and CI gates.

cx
This commit is contained in:
vicrodh committed 2026-09-13 02:57:21 -06:00
1 parent 3cf1f32177
commit e291eb3af4
118 files changed
+7128 -883

No files matched your search

+45
View File
@@ -493,6 +493,51 @@ Multi-device playback control using Qobuz's real-time streaming protocol. Full
- **Offline mode** usable without ever logging into Qobuz, with fully offline
playlists and automatic reconnection
### Playback memory cache
In **Settings → Playback → Playback cache**, choose a playback memory profile:
| Profile | Cache and prefetch behavior |
| --- | --- |
| **Auto — recommended** | Fixed 400 MiB on normal-memory hosts or 50 MiB below 2 GiB RAM. |
| **High — dynamic** | Starts at 400 MiB and can grow to 1600 MiB when RAM is available. |
| **Desktop** | Fixed 400 MiB with normal prefetch. |
| **Low — Pi style** | Fixed 50 MiB, smaller initial buffers and reduced prefetch; skips speculative Hi-Res warm-up. |
| **Custom** | Manual base/maximum and dynamic growth; prefetch follows the detected host class. |
Editing a preset's limits or growth toggle switches to Custom. Existing manual
cache settings are preserved as Custom. Restore defaults returns to Auto.
Profiles are shared by qbz and qbzd and preserve the requested audio quality.
Dynamic growth requires measured memory headroom. The cache shrinks after two
minutes without new demand and can fall below its base under memory pressure.
These budgets cover cached audio, not reserved RAM or the whole application's
memory. New buffers follow the selected profile; an existing track continues
with its current storage. Changing the profile does not restart the DAC.
L2 disk cache remains enabled unless **Streaming only** is selected. Tracks
outside the memory budget stream through temporary files; L2 playback and
catalog gapless read files without loading entire tracks into RAM. Keep the
cache directory on real storage when saving RAM: tmpfs consumes RAM too.
Offline downloads retain their separate settings. Streaming only keeps gapless
available, uses less memory and skips cache-based protection against network
interruptions and instant replay.
```bash
qbzd settings set audio.playback_memory_profile high
qbzd status --json
qbzd settings set audio.playback_memory_profile low
qbzd settings set audio.playback_memory_profile auto
```
The CLI also accepts `desktop` and `custom`. Advanced keys remain
`audio.playback_cache_dynamic`, `audio.playback_cache_min_mib` and
`audio.playback_cache_max_mib`; editing them selects Custom. Use `none` for an
automatic limit. Custom dynamic mode defaults to a ceiling four times the base,
capped at 16384 MiB. `status.playback_cache` reports the active profile, usage,
and effective/base/maximum budgets in bytes.
## Headless daemon (qbzd)
<p align="center">