Shared business logic for all SOTF audio players (TUI, GPUI, CLI). When adding features to players, the business logic goes here — individual app crates should be thin UI wrappers that delegate to these controllers and modules.
- Controllers (
controllers/): Domain controllers that encapsulate shared business logic so UIs become thin wrappersLibraryController— Filtering, sorting, pagination, navigation, directory managementQueueController— Queue mutations returningQueuePlaybackEffectfor playback coordinationPlaybackController— Volume, mute, replay gain, play trackingPluginController— Plugin chain management, parameter editing, presetsScanController— Wraps ReplayGain/Waveform/Bliss scan managers
- MusicLibrary (
library.rs): Music library scanner and manager with album/track metadata, playlists, channel-type filtering - MusicDatabase (
database/): SQLite persistence for library data (schema, queries, migrations) - Player (
player.rs): Playback state wrapper over AudioEngine - Queue (
queue.rs): Album-based playback queue with track navigation - BlissScanner (
bliss.rs): Music similarity analysis for recommendations (pure Rust, viamath-dsp) - PluginGraph (
plugin_graph.rs): DAG-based visual plugin routing for UI - ReplayGainScanner (
replay_gain_scanner.rs): Background ReplayGain scanning - WaveformScanner (
waveform_scanner.rs): Background waveform data extraction
src/
├── lib.rs # Public API exports and re-exports
├── controllers/
│ ├── mod.rs # Controller module root
│ ├── library.rs # LibraryController — filtering, sorting, navigation
│ ├── queue.rs # QueueController — queue mutations → QueuePlaybackEffect
│ ├── playback.rs # PlaybackController — volume, mute, replay gain
│ ├── plugin.rs # PluginController — plugin chain management
│ ├── plugin_param_map.rs # param_index_to_engine_param mapping
│ └── scan.rs # ScanController — ReplayGain/Waveform/Bliss managers
├── autoeq/
│ ├── mod.rs # AutoEQ integration root
│ ├── speaker.rs # Speaker EQ optimization
│ ├── headphone.rs # Headphone EQ optimization
│ ├── multi_speaker.rs # Multi-speaker EQ optimization
│ ├── spinorama.rs # Spinorama data integration
│ ├── params.rs # EQ optimization parameters
│ └── types.rs # Shared types
├── database/
│ └── mod.rs # SQLite schema, queries, migrations
├── library.rs # Album/track management, scanning, metadata
├── library_scanner.rs # Background library scanning
├── library_stats.rs # Library statistics (track counts, duration, etc.)
├── player.rs # Playback wrapper over AudioEngine
├── queue.rs # Playback queue (album-based)
├── config.rs # Player configuration (AppConfig)
├── bliss.rs # Audio similarity analysis via math-dsp
├── plugin_graph.rs # DAG-based plugin routing for UI
├── recommendation.rs # Music recommendation engine
├── play_tracker.rs # Play count tracking
├── level_meter.rs # Channel group definitions for level meters
├── audio_device.rs # Audio output device state
├── security.rs # Path validation for file access
├── replay_gain_scanner.rs # Background ReplayGain scanning
├── waveform_scanner.rs # Background waveform extraction
├── ui_params/ # UI parameter descriptors
├── headphone_eq_types.rs # Headphone EQ configuration types
├── spinorama_eq_types.rs # Spinorama EQ configuration types
├── room_eq_types.rs # Room EQ configuration types
└── recording_types.rs # Recording session types
| Feature | Description | Default |
|---|---|---|
testing |
Bypasses security validation for tests | No |
hal |
macOS HAL support (passes through to sotf-engine/hal) |
No |
sotf-bliss-scan— Standalone Bliss audio similarity analysis tool
See SCHEMA.md for the stable-versus-internal field
classification and version-compatibility rules for persisted player config
and state types (AppConfig, ServerConfig, RoomEqOptimizerConfig,
remote server/token stores, metadata services, and recording device configs).
cargo test -p sotf-player
cargo check -p sotf-player && cargo clippy -p sotf-playerTests are in tests/:
library_tests.rs— Library scanning and metadatadatabase_tests.rs— SQLite persistenceconcurrent_db_tests.rs— Concurrent database accessalbum_art_tests.rs— Album art thumbnail extractionplugin_chain_tests.rs— Plugin chain configurationreplay_gain_tests.rs— ReplayGain scanningparam_index_consistency.rs— Parameter index mapping consistencyerror_handling_tests.rs— Error handling paths
- This is the shared library for all player frontends (TUI, GPUI, CLI)
- Business logic for player features belongs here, not in individual app crates
- Controllers own state and expose operations; UIs are thin wrappers that delegate
QueueControllerreturnsQueuePlaybackEffectfrom mutations so the UI knows what playback action to takePluginControllerreturnsPluginUpdateEffectto signal when the engine needs reconfiguration- Uses
rusqlitefor SQLite database access - Uses
parking_lotmutexes for shared state - Re-exports plugin types from
sotf-engineandsotf-pluginsfor convenience
See the root workspace LICENSE file.