Problem:
- cpal::Stream is not Send
- Cannot use Stream across await points in async functions
- Caused compilation error in AudioSinkLogic::process
Solution:
- Spawn dedicated thread for cpal Stream (similar to rodio approach)
- Communicate with thread via std::mpsc channel
- Thread waits for shutdown command before dropping stream
- Main async loop can now safely await without Send issues
Changes:
- Add std::mpsc and std::thread imports
- Create stream_cmd channel (std::mpsc::channel)
- Spawn thread::spawn for stream creation and management
- Replace drop(stream) with stream_cmd_tx.send + thread.join
- Handle errors in thread with tracing::error (no ? operator)
Testing:
- Compiled successfully with libsoxr and libasound2 (local install)
- Dependencies installed in ~/.local without sudo
- PKG_CONFIG_PATH configured correctly
- LD_LIBRARY_PATH configured correctly
Note: pmoparadise example has unrelated netstat2 compilation issue
Changes:
- Remove all volume management (use VolumeNode in pipeline instead)
- Detect hardware format (I16/U16/F32) at startup
- Accept all AudioChunk formats (I16/I24/I32/F32/F64) as input
- Use optimized SIMD functions from dsp::int_float module
- SharedBuffer stores raw AudioChunk + intermediate F32 buffer
- Callbacks adapted to hardware format with proper conversion
Architecture:
1. AudioChunk pushed to SharedBuffer
2. Lazy conversion to F32 interleaved using dsp functions
3. Callback converts F32 → hardware format (I16/U16) if needed
Benefits:
- SIMD optimized conversions (dsp module)
- Clean separation of concerns (volume in VolumeNode)
- Hardware format detection (use native format when possible)
- Flexible input (accepts any AudioChunk type)
Note: Requires ALSA (libasound2-dev) on Linux for compilation
- Replace rodio dependency with cpal in pmoaudio/Cargo.toml
- Add AudioSink node using cpal for direct hardware access
- Add SharedBuffer for async/callback communication
- Convert all audio formats to F32 for cpal
- Improve latency and control over audio stream
- Add WHY_CPAL.md explaining the technical choice
- Update INSTALL_NOTES.md with ALSA requirements
- Export AudioSink in lib.rs and mod.rs
Benefits:
- Minimal latency (no extra layers)
- Direct hardware control
- Lighter binary (~3.8 MB less)
- Same ALSA dependency as rodio on Linux
- Cross-platform (ALSA/JACK on Linux, CoreAudio on macOS, WASAPI on Windows)