The audio drops out after a fresh install
You just finished a clean install of Fedora Workstation. You plug in your headphones, open a video, and hear nothing. The volume slider moves, but the speakers stay silent. You check the settings app and see a grayed-out audio device. This happens when the default audio stack has not been fully wired up to your user session. Fedora ships with PipeWire as the default audio and video server, but the user-level services sometimes fail to start automatically on first boot. Fixing it takes three terminal commands and a quick service check. Reboot before you debug. Half the time the symptom is gone after a clean session reset.
What PipeWire actually replaces
PipeWire sits between your applications and the hardware. It replaces two older systems that used to live side by side. PulseAudio handled desktop mixing and device switching. JACK handled professional low-latency routing. PipeWire merges both roles into one daemon that speaks multiple protocols. Think of it like a universal translator at a busy airport. Applications speak different languages. The hardware speaks another. PipeWire translates everything in real time and routes the streams to the right output. When the user service is not running, applications fall back to ALSA or fail silently because they cannot find a PulseAudio-compatible endpoint.
Fedora 35 and newer ship PipeWire by default. The package manager handles the heavy lifting. You only need to ensure the user services are enabled and running. System services live in /etc/systemd/system. User services live in ~/.config/systemd/user or are managed via systemctl --user. Always use the --user flag for audio daemons. Running them as root breaks permissions and triggers SELinux denials. Check the user service before touching system services. The audio stack lives in your session, not in the initramfs.
Install and activate the stack
Here is how to install the core components and activate the session manager. Open a terminal and run the installation command. The pipewire-pulse package provides the PulseAudio compatibility layer. Desktop applications expect PulseAudio. This package gives them exactly that without installing the old daemon.
sudo dnf install pipewire pipewire-pulse pipewire-alsa pipewire-jack
# pipewire-pulse provides the PulseAudio compatibility layer for desktop apps
# pipewire-alsa bridges legacy ALSA applications to the PipeWire routing engine
# pipewire-jack enables professional low-latency routing for DAWs and pro audio tools
Next, enable and start the user services. The --user flag tells systemd to manage these daemons under your login session, not as root. The --now flag starts them immediately after enabling them for future boots.
systemctl --user enable --now pipewire pipewire-pulse
# --user scopes the command to your login session instead of the system root
# enable creates the symlink so the service starts automatically on login
# --now starts the daemon immediately without requiring a reboot
If you are using a desktop environment like GNOME or KDE, log out and log back in. The session manager needs to reinitialize the audio socket. Some display managers cache the old audio state and refuse to hand over control until the session resets. Trust the package manager. Manual file edits drift, snapshots stay.
Verify the daemon is running
Run the status command to confirm the daemons are active. Look for the active (running) line. If you see inactive (dead) or failed, the service did not start correctly.
systemctl --user status pipewire pipewire-pulse
# status shows the current state, recent log lines, and dependency tree
# check for active (running) to confirm the daemon is handling streams
# look for recent journal entries if the service shows a failed state
You can also verify the routing engine by listing active sinks. The pw-cli tool is part of the PipeWire package and gives you a direct view of the audio graph.
pw-cli list-objects | grep -A 5 "node.name"
# pw-cli queries the PipeWire daemon directly for the current audio graph
# grep filters the output to show only active playback and capture devices
# node.name displays the human-readable identifier for each audio endpoint
Configuration files live in /etc/pipewire/ for system-wide defaults and ~/.config/pipewire/ for user overrides. Edit the user directory. Never touch /usr/lib/pipewire/. Files in /usr/lib/ ship with the package and get overwritten on every dnf upgrade --refresh. Keep your customizations in the home directory. Run journalctl -xeu pipewire-pulse.service if you need to trace a startup failure. The x flag adds explanatory text and the e flag jumps to the end. Most sysadmins type this muscle-memory style. Read the actual error before guessing.
Common pitfalls and error messages
The most common error appears when an application tries to open a PulseAudio socket and gets refused. You will see this in the journal:
PulseAudio: [pulseaudio] main.c: Daemon not responding to D-Bus method call.
This happens when pipewire-pulse is installed but not running. The compatibility layer is missing. Run the enable command again and check for conflicting services. Fedora sometimes leaves pulseaudio enabled from an older install. Mask it to prevent systemd from restarting the old daemon.
systemctl --user mask pulseaudio pulseaudio.socket
# mask replaces the unit file with a symlink to /dev/null
# this prevents systemd from starting the legacy daemon by accident
# always mask before enabling the replacement to avoid race conditions
Another frequent issue involves Bluetooth audio. PipeWire handles Bluetooth codecs differently than PulseAudio. If your headphones connect but play no sound, check the profile. The pipewire-media-session package manages device profiles. Install it if you are missing it.
sudo dnf install pipewire-media-session
systemctl --user restart pipewire pipewire-pulse
# pipewire-media-session provides the policy engine for device switching
# restart forces the daemon to reload the updated codec database
# Bluetooth audio requires the media session to negotiate the correct profile
SELinux occasionally blocks PipeWire from binding to the D-Bus session bus. You will see denials in the journal. Do not disable SELinux. Fix the context instead.
sudo ausearch -m avc -ts recent | grep pipewire
# ausearch filters the audit log for recent SELinux access vector cache denials
# grep isolates lines related to the PipeWire process
# read the denied operation to identify the missing policy module
Run sudo dnf install setroubleshoot-server if the audit tools are missing. The sealert command will generate a fix script. Apply it and restart the user services. Snapshot the system before the upgrade. Future-you will thank you.
When to stick with PulseAudio or switch to JACK
Use PipeWire when you want a unified audio and video server that handles desktop mixing and professional routing in one daemon. Use PulseAudio when you are maintaining a legacy application that refuses to compile against modern libraries. Use JACK when you need absolute minimum latency and are willing to configure exclusive hardware access manually. Stay on the default Fedora stack if you only need basic playback and device switching.