Linux DJ
Headphones and audio interface with split output routing diagram
DJ Workflow·/audio/quality/

DJ Monitoring on Linux: Split Output, Headphone Cueing, and Avoiding Resampling Traps in PipeWire (2026)

Split output DJ monitoring on Linux requires getting PipeWire routing right and avoiding hidden resampling. Here is how to set up headphone cueing with a clean signal path in 2026.

DJ monitoring on Linux in 2026 works well once the routing is correct. The problem is that "correct" involves understanding how PipeWire handles multi-device output, what sample rate mismatches do to your signal, and where hidden resampling inserts itself without telling you. Get this wrong and you are cueing through a resampler you did not ask for, or your headphone output is 5 ms behind your main output and your beatmatching suffers without you knowing why.

Why DJ monitoring is harder on Linux

On macOS or Windows, the DJ software talks to the audio interface driver directly and the OS stays out of the way. On Linux, PipeWire sits between the application and the hardware. This is mostly a good thing - it gives you routing flexibility that CoreAudio cannot match - but it means your monitoring signal passes through more processing stages, any of which can introduce resampling or latency if misconfigured.

The core requirement for DJ monitoring is simple: you need at least two independent output streams. The main output goes to your speakers or PA. The cue output goes to your headphones. These two streams must:

  • Have independent volume control
  • Be sample-accurate in timing (or close enough that beatmatching is not affected)
  • Not resample unless you specifically ask for it
  • Survive device disconnection without crashing the DJ software

Hardware architectures for split output

There are three ways to get two independent outputs on Linux:

4+ channel audio interface

This is the cleanest approach. A single interface with 4 or more outputs. Channels 1-2 go to main, channels 3-4 go to headphones. One clock source, one device, no synchronization issues.

Recommended interfaces that work well on Linux in 2026:

InterfaceOutputsLinux driverNotes
Focusrite Scarlett 4i4 (4th gen)4 line outUSB class-compliantWorks out of the box
MOTU M44 line outUSB class-compliantExcellent Linux support
Behringer UMC404HD4 line outUSB class-compliantBudget option, works well
Native Instruments Traktor Audio 66 outUSB class-compliantPurpose-built for DJ use
RME Babyface Pro FS12 outUSB class-compliant + optional RME driverProfessional, low latency

All of these are USB class-compliant, meaning they work with the kernel's snd-usb-audio driver without any additional software. PipeWire sees them as a single device with multiple output channels.

Two separate USB devices

Using your audio interface for main output and a separate USB headphone adapter for cueing. This works but introduces a synchronization problem: two USB devices have independent clocks that drift relative to each other. PipeWire handles this through its adaptive resampling, but that resampling is exactly the trap this article is about.

Motherboard output + USB interface

Similar to two USB devices, but one is your motherboard's onboard audio. Same clock drift issue, often worse because onboard audio clocks are less accurate than dedicated interfaces.

PipeWire node routing for DJ cueing

With a 4+ channel interface, PipeWire sees one ALSA device with multiple channels. The routing is straightforward.

First, identify your device and its channels:

pw-cli list-objects Node | grep -A5 "alsa"

Or more readably:

wpctl status

This shows your audio devices and their node IDs. Find your interface and note its ID.

Check the available ports on your interface:

pw-cli enum-params <node-id> EnumRoute

In Mixxx, go to Preferences > Sound Hardware:

  1. Set Sound API to PipeWire (or JACK if you prefer explicit routing).
  2. Under Output, set Main to your interface's channels 1-2.
  3. Set Headphones to your interface's channels 3-4.

Verify the routing is correct:

pw-link -o

This lists all output ports. You should see Mixxx's main output connected to your interface's first port pair and the headphone output connected to the second pair.

If you need to manually create or adjust links:

# List all ports
pw-link -o  # outputs
pw-link -i  # inputs

# Create a link
pw-link "Mixxx:main_output_1" "alsa_output.usb-Interface:playback_FL"
pw-link "Mixxx:main_output_2" "alsa_output.usb-Interface:playback_FR"
pw-link "Mixxx:headphone_output_1" "alsa_output.usb-Interface:playback_RL"
pw-link "Mixxx:headphone_output_2" "alsa_output.usb-Interface:playback_RR"

The exact port names depend on your interface and WirePlumber's naming. Use tab completion or pw-link -o output to get the exact strings.

The resampling trap

This is where most people get caught. PipeWire resamples audio transparently when there is a sample rate mismatch between a source node and a sink node. It does this silently. You will not see an error. You will not hear an obvious artifact. But the signal is being processed, and if you care about signal integrity - which you should on the main output going to a PA - you want to avoid it.

How to detect hidden resampling

Check what sample rate your device is actually running at:

pw-top

Look at the RATE column. If Mixxx is outputting at 48000 Hz but your device is running at 44100 Hz, PipeWire is resampling.

A more detailed check:

pw-cli info <node-id>

Look for format.dsp and audio.rate in the properties.

You can also inspect the graph:

pw-dump | grep -A20 "audio.rate"

Preventing resampling

The fix is to ensure everything runs at the same sample rate.

Step 1: Set your interface to the correct rate.

Most interfaces default to 48000 Hz. Set this explicitly:

# ~/.config/wireplumber/wireplumber.conf.d/alsa-rate.conf
monitor.alsa.rules = [
  {
    matches = [
      { node.name = "~alsa_output.usb-*" }
    ]
    actions = {
      update-props = {
        audio.rate = 48000
        audio.allowed-rates = [ 48000 ]
      }
    }
  }
]

Step 2: Set PipeWire's default rate to match.

# ~/.config/pipewire/pipewire.conf.d/sample-rate.conf
context.properties = {
    default.clock.rate = 48000
    default.clock.allowed-rates = [ 48000 ]
}

Locking to a single rate prevents PipeWire from dynamically switching rates based on what applications request. This is what you want for DJ use.

Step 3: Configure Mixxx to match.

In Preferences > Sound Hardware, set Sample Rate to 48000 Hz. This must match what you configured above.

Step 4: Restart and verify.

systemctl --user restart pipewire pipewire-pulse wireplumber

Then open Mixxx, start playback, and check pw-top again. Every node in the chain should show the same rate. No rate conversion, no resampling.

For a deeper look at how WirePlumber's profile selection affects device configuration, see the WirePlumber pro-audio profile guide.

The two-device resampling problem

If you use two separate devices (interface + USB headphone adapter), they have independent clocks. Even if both are set to 48000 Hz, they will drift by a few samples per minute. PipeWire compensates using adaptive resampling on the secondary device.

This is unavoidable with two independent clock domains. The resampling quality is high (PipeWire uses a sinc-based resampler) and the artifacts are inaudible in headphone cueing. But it is there.

To check if adaptive resampling is active:

pw-top

Look for the DRIV column. If a node shows a different driver than the main graph driver, it is being resampled to match.

The practical impact: for headphone cueing, this is fine. The resampler adds negligible latency (under 1 ms) and the quality is transparent. For the main output to a PA, avoid this - use a single multi-channel interface so the main output is on the graph's clock master.

Latency alignment between main and cue

For beatmatching, the timing relationship between what you hear in your headphones and what the audience hears matters. If your cue output has 3 ms more latency than your main output, your beatmatching will be systematically off by 3 ms. For mixing this is irrelevant. For scratch DJing it is noticeable.

With a single 4-channel interface, main and cue latency are identical because they share the same buffer and clock. No alignment needed.

With two devices, latency can differ. Check it:

pw-top

Compare the QUANT and RATE values for both device nodes. If they differ, latency differs.

PipeWire does not have a built-in output delay compensation for DJ cueing. If you need fine alignment:

  1. Use the latency offset in Mixxx's Sound Hardware preferences. Mixxx lets you add a millisecond offset to specific outputs.
  2. Measure the offset using a loopback cable and a reference tone. Play the same signal out both outputs, record both via loopback, and measure the sample offset in Ardour or Audacity.

For most mixing workflows, the alignment from a single interface is sufficient. The quantum selection guide covers buffer size choices that keep both outputs in the same timing domain.

Mixxx output configuration

Mixxx's Sound Hardware preferences let you assign outputs granularly:

OutputPurposeTypical assignment
MainPA / speakersInterface channels 1-2
HeadphonesDJ cueingInterface channels 3-4
BoothBooth monitorsInterface channels 5-6 (if available)
Deck 1-4Individual deck outputsFor external mixing (rare)

For a standard DJ setup, you only need Main and Headphones. The cue/mix knob in Mixxx controls the blend between the cue signal and the main signal in your headphones.

External mixer mode

If you use an external DJ mixer (rather than Mixxx's internal mixer), assign each deck to a separate output pair:

  • Deck 1: channels 1-2
  • Deck 2: channels 3-4
  • Deck 3: channels 5-6 (if available)

This sends raw deck audio to the external mixer's channels. The mixer handles cueing, EQ, and crossfading. You need a 4+ output interface for this to work with two decks. For the full DVS setup with external mixing, see the DVS guide.

Testing signal quality

After setting up your routing, verify the signal path is clean:

1. Check for resampling (as above).

2. Check for bit depth reduction. PipeWire processes internally at 32-bit float. Verify your output is not being truncated:

pw-cli info <node-id> | grep format

You want F32 or S32 format on the output path.

3. Listen for artifacts. Play a well-known reference track through main. Then play it through headphones. Switch between them. Any difference in timbre, especially in the high frequencies, suggests resampling or format conversion is happening.

4. Run a null test. Record both outputs simultaneously, invert one, and sum them. If the result is silence (or near-silence), the signal paths are identical. Any residual signal is the difference introduced by the routing - resampling artifacts, bit depth changes, or timing offsets.

For more on measuring audio signal quality, see the audio quality reference.

Common routing mistakes

PulseAudio compatibility layer interference. pipewire-pulse can remap channels unexpectedly. If Mixxx uses the PipeWire backend directly, pipewire-pulse should not be involved. But if another application (like a browser playing a notification) triggers a pipewire-pulse session, it can change the graph's sample rate. Lock the sample rate as described above.

WirePlumber policy overriding your routing. WirePlumber's default policy re-routes audio when devices connect or disconnect. If you plug in a USB stick mid-set and WirePlumber decides to re-route your headphone output, you lose cueing. Disable default device switching for your DJ session:

# ~/.config/wireplumber/wireplumber.conf.d/no-auto-switch.conf
monitor.alsa.rules = [
  {
    matches = [
      { node.name = "~alsa_output.usb-Your_Interface*" }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0
      }
    }
  }
]

Also set your interface as the default device before starting Mixxx:

wpctl set-default <node-id>

Forgetting to set the pro-audio profile. WirePlumber's pro-audio profile configures your interface for multi-channel output. Without it, you may only get a stereo pair. See the WirePlumber pro-audio profile guide for the full setup.

Monitor volume affecting cue. If your desktop environment's volume control adjusts the PipeWire master volume, it can affect your cue output. In a DJ context, volume control should happen in the DJ software and on the hardware mixer, not in PipeWire. Disable software volume control on your DJ interface:

wpctl set-volume <node-id> 1.0

And do not touch the desktop volume slider during a set.

FAQ

Can I use Bluetooth headphones for cueing? Technically yes, but do not. Bluetooth audio adds 40-200 ms of latency depending on the codec (SBC, aptX, AAC, LDAC). This makes beatmatching by ear impossible. Use wired headphones.

My headphone output has a slight hum. What is it? Ground loop between two USB devices. Use a single multi-channel interface, or add a ground loop isolator on the headphone output. The problem is electrical, not software.

Can I use PipeWire's built-in virtual sinks for split output? You can create virtual sinks with pw-loopback and route to them, but this adds a processing hop and latency. For DJ monitoring, route directly to hardware channels.

What if my interface only has 2 outputs? Use a second USB device (a cheap USB headphone adapter) for cueing. The adaptive resampling is transparent for headphone monitoring. Or use Mixxx's split output mode, which sends left channel to main and right channel to headphones via a single stereo output - but this gives you mono, which is a significant compromise.

Does the sample rate need to match my music files? Your music files are mostly 44100 Hz (CD-quality MP3/FLAC) or 48000 Hz. PipeWire will resample them to match the graph rate. This is unavoidable unless you match the rate to every file. Running at 48000 Hz and letting Mixxx's internal resampler handle 44100 Hz files is standard practice and the quality impact is negligible with modern resamplers.

Conclusion

Split output DJ monitoring on Linux comes down to three things: use a multi-channel interface so both outputs share one clock, lock the sample rate across the entire PipeWire chain to avoid hidden resampling, and verify the routing with pw-top and pw-link before your set. The tools are all there in PipeWire - the difficulty is knowing where the traps are. Once the routing is clean, it is as reliable as any platform. For the full Mixxx output configuration, see the upgrade guide. For quantum and buffer configuration, see the quantum tuning guide.

  • DJ Monitoring
  • Headphone Cueing
  • PipeWire
  • Resampling
  • Audio Quality
  • Linux Audio
  • 2026

Related Notes

← All notes