Psychotoxical 5cb233e1c9 fix(analysis): dedupe concurrent seed_from_bytes for the same track_id
Six independent paths reach analysis_cache::seed_from_bytes for the same
track_id during a cache-miss play under LUFS:

- track_download_task legacy stream capture-complete
- ranged_download_task HTTP buffer full
- audio_preload bytes-ready
- psysonic-local file-read complete
- spawn_analysis_seed_from_in_memory_bytes (gapless reuse / preloaded /
  stream cache)
- analysis_enqueue_seed_from_url (frontend backfill triggered by
  refresh:miss while a playback path is mid-seed)

Whenever a track is streamed for the first time with loudness on, two of
these fire in parallel and Symphonia + EBU R128 decode the same buffer
twice — ~30 s of duplicate CPU per track, plus a redundant SQLite write
of an identical row. Reproduced on multiple cache-miss tracks (KjP… ranged
+ backfill, mPdz… preloaded bytes + backfill).

Coordinate at the funnel:

- New SeedFromBytesOutcome::SkippedConcurrent variant.
- SEEDS_IN_FLIGHT static (Mutex<HashSet<String>>) tracks track_ids whose
  analysis is currently running. First caller into seed_from_bytes
  wins the slot via HashSet::insert; later callers return SkippedConcurrent
  immediately and let the winner publish the analysis:waveform-updated
  event.
- SeedInFlightGuard (RAII) releases the slot on every exit path including
  panics, so a crashing analysis cannot leak the marker.
- enqueue_analysis_seed in lib.rs distinguishes the SkippedConcurrent log
  from the genuine "seed result" log so the frontend backfill case
  (when it arrives second) doesn't read like a backfill failure.

Existing call-site match arms in audio.rs already use Ok(_) => {} for
non-Upserted outcomes — no changes needed there. enqueue_analysis_seed in
lib.rs already gates the waveform-updated emit on outcome == Upserted, so
the new variant is silent there too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 20:59:32 +03:00
2026-04-25 20:37:53 +02:00

Psysonic

Psysonic Logo

The Ultimate Desktop Client for Self-Hosted Music Libraries

Fast. Beautiful. Native. Feature-packed. Built primarily for Navidrome. Also compatible with Gonic, Airsonic, LMS and other Subsonic-compatible servers with partial feature support.




No telemetry • Native performance • Massive feature set • Community driven


Psysonic Screenshot


Warning

Psysonic is under heavy active development. Bugs and rough edges are to be expected. We reserve the right to change, remove, or rework existing features at any time without prior notice.

Server Compatibility

Psysonic is optimized first and foremost for Navidrome.

Many advanced functions integrate directly with Navidrome APIs for the best possible experience. Other Subsonic-compatible servers generally work well, but some features may be limited depending on server capabilities.

Why Psysonic?

Most Subsonic clients feel like web wrappers.

Psysonic does not.

It is a true desktop experience built with Rust, Tauri v2, and React for users who care about speed, aesthetics, customization, and serious music library management.

If you host your own music, this is what the premium experience should feel like.


Core Features

Playback Engine

  • Gapless playback
  • Crossfade
  • ReplayGain support
  • Smart Loudness Normalization
  • Infinite Queue
  • Smart Radio sessions
  • High responsiveness with low memory usage

Audio Tools

  • 10-band Equalizer
  • Presets
  • AutoEQ headphone correction
  • Per-device optimization

Library Power

  • Lightning-fast search
  • Albums / Artists / Tracks / Genres
  • Ratings system
  • Multi-select bulk actions
  • Drag & drop playlist management
  • Huge library friendly

Lyrics & Discovery

  • Synced lyrics with seek support
  • Auto-scroll sidebar lyrics
  • Fullscreen lyric mode
  • Last.fm scrobbling
  • Similar artists / love tracks / stats

Personalization

  • Huge theme collection
  • Catppuccin / Nord inspired styles
  • Glassmorphism effects
  • Font customization
  • Zoom controls
  • Keybind remapping
  • Theme Scheduler (day/night auto switch)

Power User Extras

  • CLI controls
  • USB / portable sync
  • Backup & restore settings
  • In-app auto updater
  • LAN / remote auto switching

Orbit (Upcoming)

Listen Together. In Sync. Soon.

Currently in final development and testing. Orbit will introduce synchronized shared listening sessions directly inside Psysonic.

  • Host-controlled playback
  • Join via link
  • Shared listening sessions
  • Guest song suggestions
  • Real-time queue interaction

Rolling out in an upcoming release. Community feedback will help shape the final experience.


Platforms

OS Support
Windows Native Installer (certificate pending)
macOS Signed DMG
Linux AppImage / DEB / RPM / AUR (psysonic, psysonic-bin) / NixOS

Supports 8 languages and growing.


Install

Linux

curl -fsSL https://raw.githubusercontent.com/Psychotoxical/psysonic/main/scripts/install.sh | sudo bash

Windows

Download the latest installer from Releases.

SmartScreen warnings may appear until the code-signing certificate is active.

macOS

Download the signed DMG from Releases.


Development

git clone https://github.com/Psychotoxical/psysonic.git
cd psysonic
npm install
npm run tauri:dev

Build release:

npm run tauri:build

Privacy First

  • No telemetry
  • No spyware nonsense
  • No analytics harvesting
  • Your library stays yours

Community

Join Discord, report bugs, suggest features, share themes, shape the future.


License

GNU GPL v3.0


Stop using boring music clients.

Use Psysonic.

Languages
TypeScript 69.9%
Rust 24.9%
CSS 4.3%
JavaScript 0.5%
Shell 0.3%