- PipeWireDriver.hpp/cpp: new AudioDriver implementation using pw_filter API
- Full-duplex I/O via pw_filter (capture + playback in one RT callback)
- Dynamic channel count support (tested: 1-8 channels, extensible beyond)
- Uses SPA_AUDIO_FORMAT_F32 for zero-copy-compatible float processing
- Channel position mapping: MONO, stereo, 5.1, 7.1, plus Aux for N>8
- Follows the same buffer management pattern as AlsaDriverImpl
- Channel routing: main/aux input/output mapping with mix ops
- CLI flag: --driver pipewire|alsa (default: alsa)
- AudioHost: conditional driver selection based on driverType_
- PiPedalModel: stores and passes driver type to AudioHost
- CMakeLists.txt: added PipeWireDriver source files
New files:
- MixerApi.hpp/cpp: Model-level API bridging WebSocket messages to
MixerEngine control (channel volume/pan/mute/solo/hpf, bus control,
routing, state queries)
- 15 new WebSocket message handlers in PiPedalSocket.cpp for full
mixer control surface
Integration:
- MixerEngine member added to PiPedalModel with Get/Set accessors
- SetMixerEngine propagates to AudioHost rt processing pipeline
- Socket handler auto-wires MixerEngine to MixerApi on connect
Messages implemented:
mixerSetChannelVolume, mixerSetChannelPan, mixerSetChannelMute,
mixerSetChannelSolo, mixerSetChannelLabel, mixerSetChannelHpf,
mixerGetState, mixerAddChannel, mixerRemoveChannel,
mixerSetBusVolume, mixerSetBusMute, mixerAddBus, mixerRemoveBus,
mixerRouteChannelToBus
MixerEngine architecture:
- MixerChannelStrip: per-input FX chain (Lv2Pedalboard reuse),
volume, pan, mute, solo, HPF, aux sends, VU metering
- MixerBus: accumulation bus with volume, mute, VU. Supports
master, subgroup, aux, and FX-return bus types
- MixerEngine: orchestrator managing channel→bus routing graph,
bus→bus routing, solo override, and the full real-time audio
processing cycle
All new code compiles cleanly with the existing C++20 build and
follows the existing PiPedal codebase conventions (namespaces,
error handling, buffer patterns). CPU-efficient real-time thread
processing with atomic control surface interaction.
- Add missing <unistd.h> include in AlsaDriverTest.cpp for sleep().
- Link Catch2::Catch2WithMain alongside Catch2::Catch2 for pipedaltest
and jsonTest test targets. Catch2 v3 requires this for CATCH_CONFIG_MAIN
to provide the main() entry point.
Replace dpkg --print-architecture (Debian-specific) with a portable
cmake-based approach using CMAKE_SYSTEM_PROCESSOR mapped to Debian
architecture names (x86_64→amd64, aarch64→arm64, armv7l→armhf, i686→i386).