v0.3.21 — Maintenance
Velvet v0.3.21 — Maintenance
Waveform reliability improvements, visualizer graceful fallback, Subsonic large-queue position fix, and deterministic album sort order.
Waveform — reliability and performance
- New cache format. Waveform cache files are regenerated on first boot with an improved internal format. Old files are cleaned up automatically — no manual action needed.
- Eliminated redundant redraws. The waveform animation loop now skips frames where the playhead pixel hasn't moved, reducing GPU wake-ups during normal playback. Rendering resumes immediately on any seek.
- Seek-while-paused now repaints. Seeking on a paused track previously left the waveform showing the old playhead position until play resumed. The progress bar updates immediately.
- Fixed empty bars at the tail of short files — the downsampling window now always covers at least one sample.
Visualizer — graceful error recovery
If WebGL2 is unavailable (unsupported GPU, browser flag, or driver restriction), the visualizer now shuts down cleanly instead of throwing an unhandled exception. A toast message informs you — "Visualizer unavailable — your browser or GPU may not support WebGL2" — and playback is never affected.
Subsonic — large-queue position loss fixed
Fixed: resuming a large queue (1000+ tracks) from a Subsonic client always restarted from track 1. The HTTP query string parser silently drops parameters past a certain limit; with a long id list the current track and position parameters were discarded before we could read them. These scalars are now read directly from the raw URL, bypassing the limit entirely. The same fix applies to createPlaylist and updatePlaylist with large song lists.
Albums — deterministic sort order
Fixed: same-year albums for an artist could appear in a different order on each page load. The SQL query used ORDER BY year DESC with no tiebreaker, leaving within-year ordering to the database engine — which can vary by query plan. Albums sharing a year are now sorted consistently A→Z (case-insensitive).