Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ React 19 + TypeScript. Entry: `src/main.tsx` → `src/App.tsx`.
Inside `crates/app/src/`:

- **`commands/`** — one module per domain (`library`, `playlist`, `smart_playlists`, `track`, `browse`, `player`, `scan`, `edit`, `profile`, `analysis`, `deezer`, `similar`, `lyrics`, `stats`, `wrapped`, `maintenance`, `radio`, `duplicates`, `preferences`, `plugins`, `canvas`, …), all registered in `lib.rs::generate_handler![]`. CRUD delegates to `waveflow_core::repository::sqlite::*`; IPC + state + filesystem + emit glue stays in the command.
- **`audio/`** — 3-thread lock-free engine: `decoder.rs` (symphonia + rubato), `output.rs` (cpal callback on its own thread, SPSC `rtrb` ring), `state.rs` (`SharedPlayback` atomics), `analytics.rs`, `crossfade.rs`, `eq.rs`, `spectrum.rs`, `wasapi_exclusive.rs`. Topology: [`docs/architecture/audio.md`](docs/architecture/audio.md).
- **`audio/`** — 3-thread lock-free engine: `decoder.rs` (symphonia + rubato), `output.rs` (cpal callback on its own thread, SPSC `rtrb` ring), `state.rs` (`SharedPlayback` atomics), `analytics.rs`, `crossfade.rs`, `eq.rs`, `spectrum.rs`, the three exclusive backends (`wasapi_exclusive.rs`, `alsa_exclusive.rs`, `coreaudio_exclusive.rs`). Topology: [`docs/architecture/audio.md`](docs/architecture/audio.md).
- **`dlna/`** (axum + SSDP, opt-in) · **`mpd/`** (TCP MPD protocol, opt-in) · **`media_controls.rs`** (souvlaki → SMTC / MPRIS / MediaRemote) · **`discord_presence.rs`** · **`queue.rs`** · **`player_actions.rs`** (shared control sequence) · **`remote/`** (remote source + sync v2, feature `sync_v2`, now in the default feature set; `remote/mirror.rs` walks the server's catalogue into the projection so both sources can be browsed from one library; `remote/download.rs` keeps a track's bytes in a managed folder the scanner never sees while `remote/import.rs` copies them into a scanned one, where they become a local track linked to the server's; `remote/upload.rs` is the fourth direction — offering the server what it lacks, deduplicated offline against the mirror and hashed once via `remote/hashing.rs`; `mod sync` is now a permanent no-op stub — v1 was removed in the RFC-005 cutover) · **`backup.rs`** · **`db/`** (pool wiring + `migration_heal`).
- **Scanner** — the orchestrator `scan_folder_inner` stays app-side (it emits `scan:progress`); every pure helper lives in `waveflow_core::scanner::{extract, upserts}`.
- **Database** — per-profile SQLite via sqlx + a global `app.db` for the profile list and app-wide settings. Migrations at `src-tauri/migrations/{app,profile}/`, compiled in via `sqlx::migrate!`. Layout: [`docs/architecture/storage.md`](docs/architecture/storage.md).
Expand Down Expand Up @@ -92,7 +92,7 @@ Names in `commands/`, `audio/` and `src/components/` are predictable — read th

| Area | Doc | Covers |
| ------------ | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Playback | [`playback.md`](docs/features/playback.md) | decoder + DSD pipeline, native DSD via DoP, crossfade (static / smart / dynamic), gapless, ReplayGain, EQ, speed, network pre-load, WASAPI exclusive, spectrum visualizer, A-B repeat, queue |
| Playback | [`playback.md`](docs/features/playback.md) | decoder + DSD pipeline, native DSD via DoP, crossfade (static / smart / dynamic), gapless, ReplayGain, EQ, speed, network pre-load, exclusive output (WASAPI / ALSA / CoreAudio), spectrum visualizer, A-B repeat, queue |
| Library | [`library.md`](docs/features/library.md) | scanner + watcher, folder covers, local artist images, search + filters, tag editor, ratings, duplicates, import, history, multi-artist split |
| Playlists | [`playlists.md`](docs/features/playlists.md) · [`smart-playlists.md`](docs/features/smart-playlists.md) | CRUD, sorting, auto-covers, M3U, Daily Mix + On Repeat generators, rule tree |
| Integrations | [`integrations.md`](docs/features/integrations.md) | Deezer, Last.fm, TheAudioDB, lyrics providers + editor, artist overrides, Discord RPC, OS notifications, scrobbling |
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ WaveFlow is a desktop music player for the audio files you already own. It scans

| Area | Highlights | Deep dive |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| **Playback** | Symphonia + cpal, lock-free 3-thread engine, real dual-decoder crossfade, gapless, ReplayGain (file tags or BS.1770 analysis, with pre-amp and clipping prevention), 6-band EQ (20 presets), **WASAPI Exclusive** bit-perfect output (Windows, opt-in, transparent cpal fallback), DSD → PCM, variable playback speed (0.5×–2×), spectrum visualizer, sleep timer, seed + mood radio, A-B repeat, output-device picker, OS media controls (SMTC / MPRIS / MediaRemote), persistent queue with shuffle / repeat / auto-advance | [docs](docs/features/playback.md) |
| **Playback** | Symphonia + cpal, lock-free 3-thread engine, real dual-decoder crossfade, gapless, ReplayGain (file tags or BS.1770 analysis, with pre-amp and clipping prevention), 6-band EQ (20 presets), **exclusive output** (opt-in, transparent cpal fallback — WASAPI Exclusive on Windows, a raw ALSA `hw:` device on Linux, CoreAudio hog mode on macOS), DSD → PCM, variable playback speed (0.5×–2×), spectrum visualizer, sleep timer, seed + mood radio, A-B repeat, output-device picker, OS media controls (SMTC / MPRIS / MediaRemote), persistent queue with shuffle / repeat / auto-advance | [docs](docs/features/playback.md) |
| **Library** | Folder scanning + filesystem watcher, on-demand audio analysis (peak, BS.1770 loudness, ReplayGain, BPM), Hi-Res badges, multi-artist split, POPM 5-star ratings, A-Z navigator, multi-select action bar | [docs](docs/features/library.md) |
| **Playlists** | Drag-and-drop reorder (virtualised), bulk add from any source, M3U import / export with basename-fallback matching, likes, recently-played | [docs](docs/features/playlists.md) |
| **Smart playlists** | Auto-generated **Daily Mix** family bucketed by tempo, with composite artist-photo covers rendered from your Deezer cache | [docs](docs/features/smart-playlists.md) |
Expand Down
Loading