You hit record and the audio drops out
You launch Ardour or a similar DAW, set up your track, and click record. The interface freezes for a second, then resumes with a loud pop. The console prints Cannot connect to JACK server or XRUN errors flash in the status bar. You are on Fedora 40. You remember JACK was the standard for low-latency audio, but your system reports no JACK daemon running. You suspect a missing package or a broken upgrade. The reality is simpler. Fedora moved to PipeWire years ago, and PipeWire speaks JACK fluently. You likely have a working JACK server already. It just wears a different name.
What is actually happening
PipeWire acts as a universal audio router. It handles PulseAudio clients, JACK clients, and ALSA hardware simultaneously. The JACK compatibility layer means applications like Ardour, Carla, and Reaper connect to PipeWire using the standard JACK API. PipeWire translates those calls to the underlying hardware. You get low latency without managing a separate daemon.
The separation between audio server and JACK server is gone. PipeWire is both. When you install the compatibility package, PipeWire exposes libjack.so. JACK applications link against that library and talk to PipeWire. PipeWire manages the clock, buffers, and routing. This architecture prevents conflicts between desktop audio and professional audio tools. You can stream music in a browser while recording a track in Ardour without restarting services.
If you install the legacy jackd2 daemon alongside PipeWire, the two daemons fight for control of the audio hardware and the JACK API. You get connection errors, dropped audio, and unpredictable behavior. Fedora's default stack assumes PipeWire handles everything. Standalone JACK is only for specific hardware or tuning requirements that PipeWire cannot satisfy.
Run jack_lsp before you panic. If ports show up, PipeWire is already doing the heavy lifting.
Configure PipeWire for JACK
Check that PipeWire is running and the JACK compatibility libraries are installed. PipeWire runs as a user service, not a system service. This distinction matters for troubleshooting.
systemctl --user status pipewire pipewire-pulse
# --user targets the user session service, not the system daemon.
# PipeWire runs per-user. sudo systemctl will show nothing relevant.
# Look for "active (running)" in the output.
Install the JACK compatibility shim if it is missing. This package provides the library files JACK applications expect.
sudo dnf install pipewire-jack-audio-connection-kit
# Provides the libjack.so symlink that JACK apps expect.
# Without this, apps fail to find the JACK library at runtime.
# The package also installs the PipeWire JACK module.
Verify the JACK interface is active. The jack_lsp command lists available ports. If PipeWire is working, you will see system ports.
jack_lsp
# Lists all registered JACK ports.
# Look for system:capture_1 and system:playback_1.
# If the list is empty, the JACK module is not loaded.
Run jack_lsp immediately after installation. If you see system:capture_1, the compatibility layer is active and ready.
Tune PipeWire for low latency
PipeWire defaults to a buffer size that balances stability and latency for general use. Professional audio work often requires smaller buffers. You can adjust the quantum size without editing core configuration files.
Drop a configuration override in /etc/pipewire/pipewire.conf.d/. Never edit files in /usr/share/pipewire/. Those files ship with the package and get overwritten on updates. User modifications belong in /etc/.
context.properties = {
default.clock.quantum = 128
# Sets the default buffer size in frames.
# Lower values reduce latency but increase CPU load.
# 128 frames at 48kHz is roughly 2.6ms latency.
default.clock.rate = 48000
# Sets the sample rate. Match your hardware capabilities.
# 48000 is standard for video and most pro audio.
}
Restart the user service to apply changes. PipeWire does not reload configuration files automatically.
systemctl --user restart pipewire pipewire-pulse
# Restarts the audio stack with new settings.
# Active applications may reconnect automatically.
# Restart your DAW if ports disappear after the restart.
Restart the user service after config changes. PipeWire does not reload configuration files automatically.
Standalone JACK with jackd2
Some workflows demand the raw control of jackd2. You might be driving a specialized sound card that PipeWire's ALSA backend does not handle correctly. Or you need to lock the audio buffer to a specific hardware clock source that PipeWire abstracts away. Standalone JACK gives you direct access to the kernel scheduler and hardware parameters without a session manager in the middle.
Install the traditional JACK packages. This includes the daemon, tools, and a graphical controller.
sudo dnf install jack-audio-connection-kit jack-audio-connection-kit-tools qjackctl
# Installs jackd2, command-line tools, and QjackCtl GUI.
# qjackctl provides a patch bay and daemon configuration interface.
# This stack is independent of PipeWire.
Add your user to the audio and realtime groups. JACK requires elevated privileges to use realtime scheduling and lock memory.
sudo usermod -aG audio,realtime $USER
# -aG appends groups without removing existing memberships.
# The audio group grants access to sound devices.
# The realtime group allows setting realtime thread priorities.
Log out and back in for group membership to take effect. The kernel checks group membership at login. Your current session retains the old permissions until you re-authenticate.
Log out and back in after group changes. The kernel won't grant realtime permissions to a session that started before the group list updated.
Enable real-time scheduling limits
The kernel restricts realtime priority and memory locking by default. JACK needs these limits raised to prevent audio glitches. Create a limits configuration file in /etc/security/limits.d/. Drop files in this directory to override defaults. Do not edit /etc/security/limits.conf directly.
@audio - rtprio 95
# Grants realtime priority up to 95 for the audio group.
# The kernel scheduler treats these threads as high-criticality.
# Threads with rtprio preempt normal scheduling classes.
@audio - memlock unlimited
# Allows locking memory pages to prevent swapping.
# Audio buffers must remain in physical RAM to avoid glitches.
# Swapping an audio buffer causes immediate XRUN errors.
Start JACK via QjackCtl for a graphical interface. Launch the application and configure the daemon parameters.
qjackctl
# Opens the JACK control panel.
# Use Setup to configure driver, sample rate, and buffer size.
# Use Start to launch the jackd2 daemon.
In the Setup dialog, set the driver to alsa, the sample rate to 48000, and the period size to 256. Lower period sizes reduce latency but increase CPU usage. Higher period sizes improve stability at the cost of latency. Click Start to launch the daemon.
Start JACK from the command line if you prefer terminal control. The flags match the QjackCtl settings.
jackd -d alsa -r 48000 -p 256 &
# -d alsa selects the ALSA driver backend.
# -r 48000 sets the sample rate.
# -p 256 sets frames per period.
# & runs the daemon in the background.
Connect applications using the port system. JACK uses explicit routing. You must wire sources to destinations manually.
jack_lsp
# Lists available ports.
# Port names follow the pattern application:port_name.
# Use this list to find exact names for connections.
jack_connect system:capture_1 ardour:in_1
# Wires the first system capture port to the first Ardour input.
# Port names vary by application. Check jack_lsp for exact names.
# Connections persist until the daemon stops or you disconnect.
Verify the connection with jack_lsp -c. The graph view shows active links. If the link is missing, the application has not registered its ports yet.
Verify the connection with jack_lsp -c. The graph view shows active links. If the link is missing, the application has not registered its ports yet.
Common pitfalls and error patterns
XRUN errors indicate buffer underruns. The audio thread failed to fill the buffer in time. This causes audio dropouts and glitches. Increase the period size to reduce XRUNs. Lower period sizes demand more CPU cycles. If your CPU cannot keep up, the buffer empties. Check CPU usage with top or htop while recording. High load on the same core as the audio thread causes timing issues.
SELinux denials block JACK access to devices or memory. Check the audit log for denials. The setroubleshoot service summarizes SELinux events in plain text.
journalctl -t setroubleshoot | tail -20
# Shows recent SELinux denial summaries.
# Look for messages mentioning jackd or audio.
# The output often suggests a boolean or policy fix.
If you see Cannot connect to server socket, the JACK daemon is not running or the socket path is wrong. Check systemctl --user status pipewire for PipeWire setups. Check qjackctl or jackd logs for standalone setups. Do not run both PipeWire JACK and jackd2 simultaneously. They conflict on the JACK API and hardware access.
Check journalctl -xe for the first sign of trouble. SELinux denials hide in plain sight until you look for them.
When to use this vs alternatives
Use PipeWire JACK when you want a unified audio stack that handles desktop apps and professional DAWs without manual daemon management. Use standalone jackd2 when you require direct hardware clock synchronization or need to bypass the session manager for specific latency tuning. Use PipeWire with configuration tweaks when you need lower latency than the defaults but still want automatic device switching and PulseAudio compatibility. Stay on the default PipeWire setup if you only run occasional audio tasks and do not need sub-10ms latency.