📋 PipeWire Audio Guide Series
🔹 You are here: Part 4 of 4 - Professional audio processing with plugins
Complete Series:
- PipeWire Setup and Fundamentals - Foundation setup and verification
- PipeWire Virtual Devices - Create virtual sinks, sources, and loopbacks
- PipeWire PulseAudio Integration - PulseAudio compatibility and application routing
- PipeWire VST Stacks using Carla ← Professional audio processing with plugins
Navigation:
- Previous: PulseAudio Integration - Application routing and compatibility
- Foundation: Setup and Fundamentals - Start here if new
- Virtual Devices: Virtual Devices - Required for advanced routing
Prerequisites
Before working with VST plugins in PipeWire, you should complete these prerequisite guides:
- PipeWire Setup and Fundamentals - Essential foundation
- PipeWire Virtual Devices - Virtual device concepts and implementation
- PipeWire PulseAudio Integration - Application routing and configuration
You should have:
- PipeWire 1.0.7+ and WirePlumber 0.5.2+ installed and verified
- All compatibility layers working (ALSA, JACK, PulseAudio)
- Understanding of virtual devices and PulseAudio application routing
- Experience with audio processing concepts
What is Carla?
Carla is a fully-featured audio plugin host that acts as a bridge between VST plugins and Linux audio systems. It provides:
- VST2/VST3 Support: Load Windows and Linux VST plugins
- Multiple Plugin Formats: VST, LV2, LADSPA, AU (on macOS), and internal plugins
- JACK Integration: Native JACK support for low-latency audio
- PipeWire Compatibility: Works seamlessly with PipeWire’s JACK compatibility layer
- Plugin Chains: Create complex effect chains and instrument racks
Installation
Option 1: KXStudio Repository (Recommended)
The KXStudio repository by falktx (Carla’s author) provides the most up-to-date packages with latest features and bug fixes:
# Add KXStudio repository
sudo apt update
sudo apt install gpgv wget
# Download package file
wget https://launchpad.net/~kxstudio-debian/+archive/kxstudio/+files/kxstudio-repos_11.2.0_all.deb
# Install it
sudo dpkg -i kxstudio-repos_11.2.0_all.deb
# Update package lists
sudo apt update
# Install latest Carla from KXStudio
sudo apt install carla carla-data carla-lv2 carla-vst
# Check installation
carla --version
What you get:
- Latest stable Carla versions (currently 2.5.9+, with development versions 2.6.0+)
- Complete plugin format support (VST2, VST3, LV2, LADSPA, AU)
- KXStudio-optimized builds with additional features
- Regular updates from the official Carla maintainer
Option 2: Ubuntu Default Repositories
For basic functionality with older but stable versions:
# Ubuntu/Debian default repositories
sudo apt install carla carla-data
# Check installation
carla --version
Verification
# Check installed version
carla --version
# Verify PipeWire compatibility
pw-jack carla --help
# Check available plugin formats
carla-discovery native
References:
VST Plugin Support
Content to be added: VST plugin installation and configuration
Basic Usage
Carla integrates with PipeWire through the pipewire-jack
compatibility layer, appearing as JACK clients in the PipeWire audio graph.
Core Workflow
- Launch Carla:
carla
starts and connects to PipeWire via JACK compatibility - Add VST Plugins: Load VST2/VST3 plugins using the “Add Plugin” toolbar button
- Create Plugin Stacks: Chain multiple effects/instruments in Rack mode for serial processing
- Audio Routing: Carla appears in
wpctl status
as audio streams for manual or automatic routing
PipeWire Integration
# Launch Carla with explicit JACK compatibility
pw-jack carla
# Monitor Carla's PipeWire presence
wpctl status | grep -i carla
How it works:
- Carla as JACK client: Uses PipeWire’s
libpipewire-module-jack-tunnel
for audio routing - Manual patchbay control: Best approach for VST processing chains with precise signal flow control
- Virtual device integration: Can route to/from PipeWire virtual devices for complex audio workflows
Plugin Stack Concept
VST plugins in Carla create processing chains where audio flows through multiple effects sequentially. The entire stack appears to PipeWire as a single audio processing node, allowing complex VST setups to integrate seamlessly with virtual sinks and sources.
References:
- PipeWire JACK compatibility documentation
- Carla official documentation
- PipeWire PulseAudio Integration
Creating VST Processing Chains
This section demonstrates how to create VST processing chains using Carla and integrate them into PipeWire’s audio routing system. We’ll use the practical example from our debugging session of routing Spotify audio through Carla VST processing before it reaches your Schiit Modi DAC.
Architecture Overview
Based on our testing, the most effective approach for VST processing chains uses support.null-audio-sink
for better manual control over VST processing connections. The audio flow looks like this:
Spotify → Virtual Null Sink → Monitor Ports → Carla (VST) → Hardware DAC (via patchbay)
Why null sinks for VST workflows: From our debugging session, null sinks provide better fit for what you’re trying to do with cleaner manual routing control for VST processing chains. Unlike loopback devices which rely on WirePlumber’s automatic routing, null sinks give you precise control over the signal flow through your VST stack.
Step 1: Create a Null Sink Virtual Device
Create a support.null-audio-sink
device optimized for VST processing workflows:
# ~/.config/pipewire/pipewire.conf.d/11-music-null-sink.conf
context.objects = [
{
factory = adapter
args = {
factory.name = support.null-audio-sink
node.name = "music-null-sink"
node.description = "Music Virtual Sink"
media.class = Audio/Sink
audio.position = [ FL FR ]
# Desktop integration properties for user selection
device.description = "Music Virtual Sink"
device.class = "sound"
device.icon-name = "audio-card"
node.virtual = false
# Monitor configuration for VST routing
monitor.channel-volumes = true
monitor.passthrough = true
adapter.auto-port-config = {
mode = dsp
monitor = true
position = preserve
}
}
}
]
Apply the configuration:
systemctl --user restart pipewire
Verify the null sink appears:
wpctl status | grep -i music
# Should show the null sink and its monitor ports
What this creates:
music-null-sink
: Virtual sink that applications like Spotify connect to (appears in desktop audio controls)- Monitor ports:
music-null-sink:monitor_FL
andmusic-null-sink:monitor_FR
for routing to Carla
Step 2: Configure Carla Engine
Launch carla
and configure it for PipeWire integration:
- Set Audio Driver: Go to Settings > Configure Carla > Engine
- Select JACK: Set Audio driver to JACK (uses
pipewire-jack
compatibility layer) - Choose Process Mode: Select Continuous Rack for serial plugin processing
Alternatively, launch directly in Rack mode:
pw-jack carla-rack
Engine Settings Reference: Based on Carla’s process modes:
- Continuous Rack: Plugins process in order, top to bottom (ideal for EQ chains)
- Patchbay: Full modular routing (for complex setups)
Step 3: Build Your VST Chain
In Carla’s Rack tab, add your VST plugins:
- Add Equalizer: Click “Add Plugin” → Select your EQ VST (e.g., EQual, ReaEQ)
- Plugin Order: Arrange plugins from top to bottom in processing order
- Configure Settings: Adjust EQ bands, frequencies, and gain as desired
Plugin Chain Example (top to bottom processing order):
1. High-pass filter (remove low-end rumble)
2. Parametric EQ (shape frequency response)
3. Compressor (optional - dynamic control)
Step 4: Audio Routing in Patchbay
Switch to Carla’s Patchbay tab to create the manual connections for your VST processing chain:
Connect Null Sink Monitor to Carla Input
- Locate Monitor Ports: Find
music-null-sink:monitor_FL
andmusic-null-sink:monitor_FR
in the available connections - Connect to Carla: Route monitor outputs to Carla’s audio inputs:
music-null-sink:monitor_FL → Carla:input_FL music-null-sink:monitor_FR → Carla:input_FR
- Verify Signal Flow: Audio flows: Spotify → Null Sink → Monitor → Carla VST processing
Connect Carla Output to Hardware DAC
- Locate Carla Outputs: Find Carla’s processed audio outputs
- Route to Hardware: Connect directly to your Schiit Modi DAC outputs:
Carla:output_FL → alsa_output.usb-Schiit_Modi_3-00.analog-stereo:playback_FL Carla:output_FR → alsa_output.usb-Schiit_Modi_3-00.analog-stereo:playback_FR
- Save Configuration: Create config directory and save project:
mkdir -p ~/.local/share/carla
File > Save As → Save as
~/.local/share/carla/spotify_vst_chain.carxp
Connection Pattern (manual VST processing control):
music-null-sink:monitor_FL → Carla:input_FL
music-null-sink:monitor_FR → Carla:input_FR
Carla:output_FL → Schiit_Modi:playback_FL
Carla:output_FR → Schiit_Modi:playback_FR
Why This Approach Works: From our debugging session, this null sink approach provides “better fit for what you’re trying to do” with cleaner manual routing control for VST processing chains. You have precise control over the signal flow through your VST stack and directly to your preferred DAC.
Step 5: Route Spotify to Processing Chain
Critical: Spotify connects via PulseAudio compatibility layer and requires pulse.rules
configuration, not WirePlumber stream rules.
Automatic Routing for PulseAudio Applications
Create a PulseAudio routing rule that automatically sends Spotify to your null sink:
# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
pulse.rules = [
{
matches = [
{ application.name = "Spotify" }
]
actions = {
update-props = {
target.object = "music-null-sink"
}
}
}
]
Apply the configuration:
systemctl --user restart pipewire
Why this approach is needed: From our debugging session, applications that connect via pipewire-pulse
(like Spotify) bypass WirePlumber’s normal stream routing and require their own pulse.rules
configuration.
Audio Flow Verification: The complete processing chain should be:
- Spotify →
music-null-sink
(via pulse.rules) - Null sink monitor → Carla VST processing (manual patchbay connection)
- Carla output → Schiit Modi DAC (manual patchbay connection)
Testing the routing: After restart, launch Spotify and verify:
wpctl status | grep -i spotify
# Should show Spotify connected to music-null-sink
Step 6: Autostart Carla Processing
For persistent operation, create a systemd service to auto-load your VST chain:
# ~/.config/systemd/user/carla-vst-chain.service
[Unit]
Description=Carla VST Processing Chain
After=pipewire.service
[Service]
Environment=PIPEWIRE_LINK_PASSIVE=true
Type=exec
ExecStart=/usr/bin/pw-jack carla-rack --no-gui %h/.local/share/carla/spotify_vst_chain.carxp
[Install]
WantedBy=default.target
Enable the service:
systemctl --user enable --now carla-vst-chain.service
Verify the service is working:
# Check service status
systemctl --user status carla-vst-chain.service
# Monitor Carla's connection to PipeWire
wpctl status | grep -i carla
Final Testing: With everything configured, the complete audio chain should be:
- Launch Spotify → automatically routes to
music-null-sink
- Carla loads VST processing chain → processes audio from null sink monitor
- Processed audio → routed directly to Schiit Modi DAC
- Enjoy enhanced audio with VST processing applied to Spotify
Related guides: