This document describes the architecture, data flow, and threading model for the Mesh DJ system.
Mesh is a 4-deck stem-based DJ application built with:
- Rust for performance and safety
- JACK Audio for professional low-latency audio
- iced for the reactive GUI framework
- Lock-free atomics for real-time audio/UI communication
mesh/
βββ crates/
β βββ mesh-core/ # Audio engine, database, track loading
β βββ mesh-player/ # DJ player application (iced GUI)
β βββ mesh-cue/ # Cue point editor application
β βββ mesh-midi/ # MIDI controller support
β βββ mesh-widgets/ # Shared UI widgets (waveforms)
The core audio engine and services layer.
mesh-core/
βββ engine/ # Real-time audio processing
β βββ mod.rs # AudioEngine, EngineCommand
β βββ deck.rs # Per-deck playback state
β βββ slicer.rs # Beat slicer processor
β βββ atomics.rs # Lock-free state sharing
βββ loader/ # Background track loading
β βββ mod.rs # TrackLoader service
β βββ linked.rs # Linked stem loading
βββ db/ # SQLite database access
β βββ service.rs # DatabaseService
β βββ queries.rs # Track/metadata queries
βββ usb/ # USB device management
β βββ manager.rs # Hot-plug detection
β βββ storage.rs # USB collection access
βββ types.rs # Shared types (Stem, HotCue, etc.)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THREAD ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ Commands ββββββββββββββββββββββββββββ β
β β β ββββββββββββββΊ β β β
β β UI Thread β (SPSC Ring) β JACK Audio Thread β β
β β (iced) β β (Real-time, 2.9ms) β β
β β β ββββββββββββββ β β β
β ββββββββββββββββ Atomics ββββββββββββββββββββββββββββ β
β β (Lock-free) β² β
β β β β
β βΌ β β
β ββββββββββββββββ ββββββββββ΄ββββββββββ β
β β Track Loader β β Shared Buffers β β
β β Thread βββββββββββββββββββββΊβ (basedrop Arc) β β
β β (Background) β Stems + Metadata ββββββββββββββββββββ β
β ββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββ ββββββββββββββββ β
β β Database β β Peaks Thread β β
β β (SQLite) β β (Waveforms) β β
β ββββββββββββββββ ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRACK LOADING PIPELINE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β User Action Background Thread Audio Thread β
β βββββββββββ βββββββββββββββββ ββββββββββββ β
β β
β LoadTrack(deck, path) β
β β β
β βΌ β
β βββββββββββββββ β
β β TrackLoader β β
β β .request() β β
β ββββββββ¬βββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββ β
β β Loader Thread (Background) β β
β β βββββββββββββββββββββββββββββββββββ β β
β β β 1. Read .stems file (4 stems) β β β
β β β 2. Decode FLAC (parallel) β β β
β β β 3. Compute overview peaks β β β
β β β 4. Fetch metadata from DB β β β
β β β 5. Create Shared<StemBuffers> β β β
β β βββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββ¬βββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββ β
β β TrackLoadResult (via channel) β β
β β - PreparedTrack (metadata, cues) β β
β β - Shared<StemBuffers> β β
β β - OverviewState (peaks) β β
β ββββββββββββββββ¬βββββββββββββββββββββββ β
β β β
β βββββββββββ΄ββββββββββ β
β βΌ βΌ β
β βββββββββββ βββββββββββββββββ β
β β UI β β Audio Engine β β
β β Updates β β LoadTrack cmd β β
β β waveformβ β (SPSC ring) β β
β βββββββββββ βββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ENGINE COMMAND PROTOCOL β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β UI Thread Audio Thread β
β βββββββββ ββββββββββββ β
β β
β domain.toggle_play(deck) β
β β β
β βΌ β
β CommandSender::send() β
β β β
β β ββββββββββββββββββββββββββββββββββββββββββ β
β βββΊβ SPSC Ring Buffer (lock-free) β β
β β EngineCommand::TogglePlay(deck) β β
β ββββββββββββββββββββββ¬ββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββ β
β β process() callback β β
β β (every 2.9ms) β β
β β ββββββββββββββββββ β β
β β β drain_commands β β β
β β β apply to deck β β β
β β β update atomics β β β
β β ββββββββββββββββββ β β
β ββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββ β
β β DeckAtomics β β
β β - position: u64 ββββββ UI reads β
β β - is_playing: bool β (lock-free) β
β β - loop_active: boolβ β
β ββββββββββββββββββββββββ β
β β
β Key Commands: β
β ββ LoadTrack(deck, stems, metadata) β
β ββ TogglePlay(deck), CuePress/Release(deck) β
β ββ HotCuePress(deck, slot), SetCuePoint(deck) β
β ββ ToggleLoop(deck), AdjustLoopLength(deck, delta) β
β ββ SetVolume(deck, vol), SetEq*(deck, val) β
β ββ ToggleStemMute(deck, stem), ToggleStemSolo(deck, stem) β
β ββ LinkStem(deck, stem, data), ToggleLinkedStem(deck, stem) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ATOMIC STATE SHARING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Audio Thread (Writer) UI Thread (Reader) β
β βββββββββββββββββββββ βββββββββββββββββββ β
β β
β DeckAtomics [4 decks] β
β ββ position.store(pos, Relaxed) ββββΊ position.load(Relaxed) β
β ββ play_state.store(state) ββββΊ play_state.load() β
β ββ loop_active.store(bool) ββββΊ loop_active.load() β
β ββ loop_start/end.store(u64) ββββΊ loop_start/end.load() β
β ββ lufs_gain.store(f32) ββββΊ lufs_gain.load() β
β β
β SlicerAtomics [4 decks] β
β ββ active.store(bool) ββββΊ active.load() β
β ββ current_slice.store(u8) ββββΊ current_slice.load() β
β ββ queue.store([u8; 16]) ββββΊ queue.load() β
β β
β LinkedStemAtomics [4 decks][4 stems] β
β ββ has_linked[stem].store(bool) ββββΊ has_linked[stem].load() β
β ββ use_linked[stem].store(bool) ββββΊ use_linked[stem].load() β
β β
β Benefits: β
β ββ Zero contention (no locks) β
β ββ ~5ns read latency β
β ββ Audio thread never blocks β
β ββ UI reads at 60fps without affecting audio β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The DJ player application with iced GUI.
mesh-player/
βββ main.rs # Application entry point
βββ config.rs # Configuration loading/saving
βββ domain/
β βββ mod.rs # MeshDomain - service orchestration
βββ ui/
βββ app.rs # MeshApp - iced application
βββ message.rs # Message enum definitions
βββ state.rs # UI state types
βββ handlers/ # Message handlers (extracted)
β βββ mixer.rs # Volume, EQ, filter
β βββ settings.rs # Settings modal
β βββ midi_learn.rs# MIDI learn workflow
β βββ browser.rs # Collection browser + USB
β βββ track_loading.rs # Load results
β βββ deck_controls.rs # Deck playback/stems
β βββ tick.rs # Periodic sync (60fps)
βββ deck_view.rs # Per-deck control UI
βββ mixer_view.rs # Mixer channel UI
βββ collection_browser.rs # Track browser
βββ player_canvas.rs # Waveform rendering
βββ midi_learn.rs # MIDI learn UI
βββ settings.rs # Settings modal UI
βββ theme.rs # Color palette
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MESH-PLAYER ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β UI LAYER (iced) β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β MeshApp β β β
β β β βββββββββββ ββββββββββββ ββββββββββββββββββββββββββ β β β
β β β β update()β β view() β β subscription() β β β β
β β β β β β β β - Tick (60fps) β β β β
β β β β Message β β Element β β - TrackLoaded β β β β
β β β β dispatchβ β tree β β - PeaksComputed β β β β
β β β ββββββ¬βββββ ββββββββββββ β - LinkedStemLoaded β β β β
β β β β β - UsbEvents β β β β
β β β βΌ ββββββββββββββββββββββββββ β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β handlers/ ββ β β
β β β β tick β deck β mixer β browser β settings β ... ββ β β
β β β βββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ β β
β β ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DOMAIN LAYER β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β MeshDomain β β β
β β β β β β
β β β Owns: Provides: β β β
β β β ββ DatabaseService ββ toggle_play(deck) β β β
β β β ββ TrackLoader ββ set_volume(deck, vol) β β β
β β β ββ PeaksComputer ββ load_linked_stem(...) β β β
β β β ββ UsbManager ββ request_track_load(...) β β β
β β β ββ CommandSender ββ apply_loaded_track(...) β β β
β β β ββ deck_stems[4] β β β
β β β ββ track_lufs[4] β β β
β β β ββ global_bpm β β β
β β ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SERVICE LAYER (mesh-core) β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββ β β
β β βAudioEngine β βTrackLoader β β Database β βUsbManager β β β
β β β(JACK) β β(Background)β β (SQLite) β β(Hot-plug) β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MESSAGE FLOW (iced) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β User Input / Subscription β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Message β β
β β ββ Tick β handlers::tick::handle() β β
β β ββ TrackLoaded(msg) β handlers::track_loading::... β β
β β ββ PeaksComputed(result) β handlers::track_loading::... β β
β β ββ LinkedStemLoaded(msg) β handlers::track_loading::... β β
β β ββ Deck(idx, DeckMessage) β handlers::deck_controls::... β β
β β ββ Mixer(MixerMessage) β handlers::mixer::handle() β β
β β ββ CollectionBrowser(msg) β handlers::browser::... β β
β β ββ Settings(SettingsMsg) β handlers::settings::handle() β β
β β ββ MidiLearn(LearnMsg) β handlers::midi_learn::handle() β β
β β ββ Usb(UsbMessage) β handlers::browser::handle_usb()β β
β β ββ SetGlobalBpm(f64) β domain.set_global_bpm_with_... β β
β β ββ LoadTrack(deck, path) β domain.request_track_load() β β
β β ββ DeckSeek(deck, pos) β domain.seek() β β
β β ββ DeckSetZoom(deck, bars) β player_canvas_state.set_zoom() β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TICK HANDLER (handlers/tick.rs) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Every 16ms (60fps): β
β β
β 1. MIDI Input Polling β
β ββ Drain MIDI messages from controller β
β ββ Route to deck/mixer/browser handlers β
β ββ MIDI Learn capture (if active) β
β β
β 2. Atomic State Sync (lock-free reads) β
β ββ Read DeckAtomics[4] β
β β ββ position, is_playing, loop_active β
β β ββ lufs_gain, key_match, transpose β
β β ββ Update player_canvas_state β
β ββ Read SlicerAtomics[4] β
β β ββ active, current_slice, queue β
β β ββ Update deck_views + canvas β
β ββ Read LinkedStemAtomics[4][4] β
β ββ has_linked, use_linked per stem β
β ββ Update waveform split-view state β
β β
β 3. Waveform Peak Requests β
β ββ Check if zoomed view needs recompute β
β ββ Send PeaksComputeRequest to background thread β
β ββ Results arrive via PeaksComputed subscription β
β β
β 4. MIDI LED Feedback β
β ββ Build FeedbackState from current UI state β
β ββ Send to controller (play LEDs, hot cue LEDs, etc.) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WAVEFORM RENDERING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββ β
β β TrackLoader ββββββΊβ OverviewState ββββββΊβ Overview β β
β β (pre-computed) β β (4096 peaks) β β Waveform β β
β βββββββββββββββββββ βββββββββββββββββββ β (GPU canvas) β β
β βββββββββββββββββ β
β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββ β
β β PeaksComputer ββββββΊβ ZoomedState ββββββΊβ Zoomed β β
β β (on-demand) β β (cached peaks) β β Waveform β β
β β β β β β (scrolling) β β
β β Request params: β β Cache key: β βββββββββββββββββ β
β β - playhead pos β β - position β β
β β - zoom bars β β - zoom_bars β β
β β - stem buffers β β - linked_active β β
β β - linked stems β β β β
β βββββββββββββββββββ βββββββββββββββββββ β
β β
β Per-stem colors (configurable palette): β
β ββ Vocals: Cyan (#00FFFF) β
β ββ Drums: Magenta (#FF00FF) β
β ββ Bass: Yellow (#FFFF00) β
β ββ Other: Green (#00FF00) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Operation | Latency | Thread |
|---|---|---|
| Audio process callback | 2.9ms (128 samples @ 44.1kHz) | JACK RT |
| Atomic state read | ~5ns | UI |
| Command send (SPSC) | ~50ns | UI β Audio |
| Track load (full) | 2-5s | Background |
| Peak computation | 10-50ms | Background |
| UI render (60fps) | 16ms budget | UI |
- Lock-free audio: Audio thread never acquires locks or allocates memory
- SPSC command ring: Bounded, pre-allocated buffer for UIβAudio commands
- basedrop::Shared: Reference-counted buffers safe for real-time deallocation
- Domain layer: Encapsulates all service coordination, hides EngineCommand details
- Handler extraction: Message handlers in separate modules for maintainability
- Atomic state sharing: UI reads engine state without synchronization overhead
The cue point editor application for preparing tracks with metadata, cue points, loops, and stem links.
mesh-cue/
βββ main.rs # Application entry point
βββ config.rs # Configuration loading/saving
βββ ui/
βββ app.rs # MeshCueApp - iced application (663 lines)
βββ message.rs # Message enum definitions
βββ handlers/ # Message handlers (extracted)
β βββ browser.rs # Dual playlist browser (parameterized)
β βββ track_loading.rs # Two-phase track loading
β βββ playback.rs # Audio transport controls
β βββ waveform.rs # Waveform interaction
β βββ stem_links.rs# Stem linking workflow
β βββ tick.rs # Periodic sync (60fps)
βββ modals/ # Modal overlay utilities
β βββ overlay.rs # with_modal_overlay() helper
β βββ mod.rs
βββ state/ # UI state types
β βββ collection.rs# Browser state + drag/drop
β βββ loaded_track.rs # Loaded track metadata
βββ collection_browser.rs # Dual browser view
βββ cue_editor.rs # Cue point editing UI
βββ waveform.rs # Combined waveform canvas
βββ transport.rs # Playback controls
βββ settings.rs # Settings modal
βββ import_modal.rs # Batch stem import
βββ export_modal.rs # USB export
βββ delete_modal.rs # Delete confirmation
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MESH-CUE ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β UI LAYER (iced) β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β MeshCueApp β β β
β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β handlers/ β β β β
β β β β browser β track_loading β playback β waveform β ... β β β β
β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β modals/ β β β β
β β β β overlay β import β export β delete β settings β β β β
β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SERVICE LAYER (mesh-core) β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββ β β
β β βAudioEngine β β Database β βBatchImport β βUsbManager β β β
β β β(JACK) β β (SQLite) β β (Threaded) β β(Hot-plug) β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ βββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BROWSER HANDLER PATTERN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Problem: Dual browsers (left/right) had 300+ lines of duplication β
β β
β Solution: Parameterized handlers with BrowserSide enum β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β impl MeshCueApp { β β
β β pub fn handle_browser_left(&mut self, msg) -> Task { β β
β β self.handle_browser(BrowserSide::Left, msg) β β
β β } β β
β β β β
β β pub fn handle_browser_right(&mut self, msg) -> Task { β β
β β self.handle_browser(BrowserSide::Right, msg) β β
β β } β β
β β β β
β β fn handle_browser(&mut self, side, msg) -> Task { β β
β β // Single implementation handles both sides β β
β β let browser = self.collection.browser_mut(side); β β
β β let tracks = self.collection.tracks_mut(side); β β
β β // ... all logic uses side parameter β β
β β } β β
β β } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β CollectionState accessors: β
β ββ browser_mut(side) -> &mut PlaylistBrowserState β
β ββ browser(side) -> &PlaylistBrowserState β
β ββ tracks_mut(side) -> &mut Vec<TrackRow> β
β ββ tracks(side) -> &Vec<TrackRow> β
β ββ side_name(side) -> &str ("Left" / "Right") β
β β
β Result: 532 β 347 lines (35% reduction) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MODAL OVERLAY HELPER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Before: Each modal duplicated backdrop + centering code β
β β
β After: Single reusable helper β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β pub fn with_modal_overlay<'a>( β β
β β base: Element<'a, Message>, β β
β β modal_content: Element<'a, Message>, β β
β β close_message: Message, β β
β β ) -> Element<'a, Message> β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Constructs: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β stack![] β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Layer 0: base (main app content) ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Layer 1: backdrop (60% opacity, click-to-close) ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Layer 2: center(opaque(modal_content)) ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Usage in view(): β
β ββ with_modal_overlay(base, import_modal, Message::CloseImport) β
β ββ with_modal_overlay(base, export_modal, Message::CloseExport) β
β ββ with_modal_overlay(base, delete_modal, Message::CancelDelete) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TWO-PHASE TRACK LOADING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Phase 1: Metadata (Fast) Phase 2: Audio (Slow) β
β ββββββββββββββββββββββ βββββββββββββββββββββ β
β β
β User double-clicks track β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββ β
β β DatabaseService.get_track() β < 10ms β
β β - BPM, key, LUFS β β
β β - Cue points, loops β β
β β - Beat grid, stem links β β
β β - Drop marker, first beat β β
β ββββββββββββββββ¬βββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββ β
β β UI updates immediately β β TrackLoader.request() β β
β β - Show cue editor β β (Background thread) β β
β β - Display metadata β β - Decode stems (FLAC) β β
β β - Show "loading" spinner β β - Compute peaks β β
β βββββββββββββββββββββββββββββββ β - 2-5 seconds β β
β ββββββββββββββ¬βββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββ β
β β Message::TrackLoaded β β
β β - StemBuffers (Arc) β β
β β - Overview peaks β β
β β - Duration samples β β
β ββββββββββββββ¬βββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββ β
β β UI updates waveform β β
β β - Combined stem display β β
β β - Remove spinner β β
β β - Enable transport β β
β βββββββββββββββββββββββββββ β
β β
β Benefit: User sees metadata instantly, can review cue points β
β while audio loads in background β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CUE POINT EDITING WORKFLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β LoadedTrackState (in-memory working copy) β
β ββ path: PathBuf β
β ββ bpm, key, lufs β
β ββ drop_marker, first_beat_sample β
β ββ cue_points: Vec<CuePoint> βββ Edit operations β
β ββ saved_loops: Vec<SavedLoop> βββ modify this state β
β ββ stem_links: Vec<StemLink> β
β ββ beat_grid: Vec<u64> β
β β
β Edit Operations: β
β ββ SetCuePoint(index, sample, label) β
β ββ DeleteCuePoint(index) β
β ββ SetSavedLoop(index, start, end) β
β ββ SetDropMarker(sample) β
β ββ AdjustBpm(delta) β
β ββ SetKey(key_string) β
β ββ SetStemLink(stem_idx, source_track, source_stem) β
β β
β Save Flow: β
β ββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββββ β
β β User presses βββββΊβ LoadedTrack β βββββΊβ DatabaseService β β
β β Ctrl+S β β Track struct β β .save_track() β β
β ββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββββ β
β β
β Keyboard Shortcuts: β
β ββ 1-8: Set cue point at playhead β
β ββ Shift+1-8: Jump to cue point β
β ββ D: Set drop marker β
β ββ L: Set loop start/end β
β ββ Ctrl+S: Save all changes β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MESSAGE ROUTING (app.rs) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β fn update(&mut self, message: Message) -> Task<Message> { β β
β β match message { β β
β β β β
β β // Browser handlers (parameterized) β β
β β Message::BrowserLeft(msg) => β β
β β self.handle_browser_left(msg), β β
β β Message::BrowserRight(msg) => β β
β β self.handle_browser_right(msg), β β
β β β β
β β // Drag and drop β β
β β Message::DragTrackStart { .. } => β β
β β self.handle_drag_track_start(..), β β
β β Message::DropTracksOnPlaylist { .. } => β β
β β self.handle_drop_tracks_on_playlist(..), β β
β β β β
β β // Track operations β β
β β Message::TrackLoaded(result) => β β
β β self.handle_track_loaded(result), β β
β β Message::SaveTrack => β β
β β self.handle_save_track(), β β
β β β β
β β // Audio transport β β
β β Message::TogglePlay => β β
β β self.handle_toggle_play(), β β
β β Message::Seek(pos) => β β
β β self.handle_seek(pos), β β
β β β β
β β // Simple operations inline β β
β β Message::Tick => self.handle_tick(), β β
β β Message::CloseExport => { .. }, β β
β β } β β
β β } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Handler file mapping: β
β ββ handlers/browser.rs β BrowserLeft, BrowserRight, Drag/Drop β
β ββ handlers/track_loading.rs β TrackLoaded, LoadTrack β
β ββ handlers/playback.rs β TogglePlay, Seek, SetLoop β
β ββ handlers/waveform.rs β Click, Drag on waveform β
β ββ handlers/stem_links.rs β Stem linking operations β
β ββ handlers/tick.rs β 60fps atomic state sync β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The USB export system provides atomic per-track exports with efficient database operations.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USB EXPORT ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β UI Layer (mesh-cue) β
β ββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ExportState β β
β β ββ phase: ExportPhase (SelectDevice β Exporting β Complete) β β
β β ββ tracks_complete, total_tracks β β
β β ββ sync_plan: SyncPlan β β
β ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β UsbMessage (via subscription) β
β βΌ β
β Domain Layer (UsbManager) β
β βββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β UsbManager (background thread) β β
β β ββ Receives UsbCommand::StartExport β β
β β ββ Creates ExportService (thread pool) β β
β β ββ Forwards ExportProgress β UsbMessage β β
β ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β Export Service Layer (mesh-core/export/) β
β ββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ExportService β β
β β ββ thread_pool: rayon::ThreadPool (4 threads) β β
β β ββ cancel_flag: Arc<AtomicBool> β β
β β ββ start_export() β Receiver<ExportProgress> β β
β β β β
β β Per-Thread Worker (atomic export per track): β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β 1. Copy WAV with verification (3 retries) β β β
β β β 2. Sync track to USB database (batch inserts) β β β
β β β 3. Send ExportProgress::TrackComplete β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β Database Layer (mesh-core/db/) β
β ββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DatabaseService::sync_track_atomic() β β
β β β β
β β Uses BatchQuery for efficient bulk inserts: β β
β β ββ batch_insert_cue_points() (1 query for N cues) β β
β β ββ batch_insert_saved_loops() (1 query for N loops) β β
β β ββ batch_insert_stem_links() (1 query for N links) β β
β β ββ batch_delete_track_metadata() (1 query) β β
β β β β
β β Total: ~5 queries per track vs 18+ with individual inserts β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β EXPORT MESSAGE FLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ExportProgress (mesh-core/export/) UsbMessage (mesh-core/usb/) β
β βββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββ β
β β
β ExportProgress::Started ββββΊ UsbMessage::ExportStarted β
β { total_tracks, total_bytes } { total_tracks, ... } β
β β
β ExportProgress::TrackStarted ββββΊ UsbMessage::ExportTrackStartedβ
β { filename, track_index } { filename, track_index } β
β β
β ExportProgress::TrackComplete ββββΊ UsbMessage::ExportTrackCompleteβ
β { filename, track_index, { filename, track_index, β
β total_tracks, bytes_complete, total_tracks, ... } β
β total_bytes } β
β β
β ExportProgress::TrackFailed ββββΊ UsbMessage::ExportTrackFailedβ
β { filename, track_index, error } { filename, ... error } β
β β
β ExportProgress::Complete ββββΊ UsbMessage::ExportComplete β
β { duration, tracks_exported, { duration, ... } β
β failed_files } β
β β
β ExportProgress::Cancelled ββββΊ UsbMessage::ExportCancelled β
β β
β Key Insight: Progress is only sent AFTER both WAV copy AND β
β database sync complete. This ensures the UI progress bar β
β accurately reflects tracks that are fully exported. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BATCH INSERT OPTIMIZATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Before (18+ queries per track): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β for cue in cue_points: # 8 queries β β
β β INSERT INTO cue_points ... β β
β β for loop in saved_loops: # 8 queries β β
β β INSERT INTO saved_loops ... β β
β β for link in stem_links: # 4 queries β β
β β INSERT INTO stem_links ... β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β After (5 queries per track): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 1. Upsert track row β β
β β 2. DELETE FROM cue_points WHERE track_id = ? β β
β β DELETE FROM saved_loops WHERE track_id = ? β β
β β DELETE FROM stem_links WHERE track_id = ? β β
β β 3. ?[...] <- $cues :put cue_points {...} # 1 batch query β β
β β 4. ?[...] <- $loops :put saved_loops {...} # 1 batch query β β
β β 5. ?[...] <- $links :put stem_links {...} # 1 batch query β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β CozoDB Batch Syntax: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ?[track_id, index, sample_position, label, color] <- $rows β β
β β :put cue_points {track_id, index => sample_position, ...} β β
β β β β
β β Where $rows is a Vec<Vec<DataValue>> passed as parameter β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Performance: ~70% reduction in DB operations during export β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEM LINK REMAPPING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Problem: Stem links reference tracks by database ID, but IDs β
β differ between local and USB databases. β
β β
β Local DB: USB DB: β
β ββ track_id: 42 ββ track_id: 7 β
β β path: ".../song.stems" β path: ".../tracks/song.wav" β
β ββ stem_link β source: 42 ββ stem_link β source: ??? β
β β
β Solution (in sync_track_atomic): β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β fn remap_stem_links_for_export( β β
β β links: &[StemLink], β β
β β source_db: &DatabaseService, // local DB β β
β β ) -> Vec<StemLink> { β β
β β β β
β β for link in links: β β
β β // 1. Get source track path from local DB β β
β β local_track = source_db.get_track(link.source_id) β β
β β filename = local_track.path.file_name() β β
β β β β
β β // 2. Find matching track in USB DB by filename β β
β β usb_track = self.get_track_by_path( β β
β β "{usb_root}/tracks/{filename}" β β
β β ) β β
β β β β
β β // 3. Use USB track ID for the remapped link β β
β β remapped_links.push(StemLink { β β
β β source_track_id: usb_track.id, β β
β β ...link β β
β β }) β β
β β } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ