You plugged in headphones and the silence is absolute
You plug in your headphones and the volume icon shows a mute symbol that won't go away. Or you just ran a system update and the speakers are dead silent. You check the mixer, everything looks unmuted, but the silence persists. This is the most common Fedora audio headache. The audio stack is working, but something is misconfigured or stuck.
What is actually happening
Fedora uses PipeWire as the audio server. PipeWire sits between your applications and the sound hardware. It handles routing, mixing, and protocol translation. Think of PipeWire as a smart switchboard operator. Applications call the switchboard, and the operator connects them to the correct phone line. If the operator falls asleep, or if the wiring map is wrong, the call drops. The hardware is fine. The apps are fine. The connection is broken.
Fedora switched to PipeWire as the default audio server starting with Fedora 34. If you are on a recent release, PulseAudio is likely not running. PipeWire provides a PulseAudio compatibility layer, so old tools like pactl still work. The compatibility layer translates PulseAudio commands into PipeWire actions. This keeps legacy applications happy while the system uses the modern stack.
A botched configuration change can leave the session manager confused. Wireplumber is the session manager that decides which device to use. If Wireplumber crashes or loads a bad config, audio routing stops. Restarting the services forces a fresh scan of the hardware and resets the routing logic.
Restart the user services. A fresh state beats guessing.
Restart the audio stack
Here's how to check the health of the audio stack and see if the services are running correctly.
systemctl --user status pipewire pipewire-pulse wireplumber
# --user checks services in your user session, not the system daemon
# pipewire handles the core audio routing and hardware access
# pipewire-pulse provides the PulseAudio compatibility layer for apps
# wireplumber is the session manager that decides which device to use
If the output shows active (running) for all three units, the stack is up. If you see inactive or failed, the service is down. Run the restart command to bring them back.
systemctl --user restart pipewire pipewire-pulse wireplumber
# Restarting the user services reloads the configuration without logging out
# This forces PipeWire to re-scan hardware and re-evaluate routing rules
# Wireplumber resets its state, which often fixes stuck device selections
After the restart, check which output devices are available. The pactl command talks to the PulseAudio compatibility layer.
pactl list sinks short
# pactl queries the PulseAudio compatibility layer exposed by PipeWire
# list sinks short shows available output devices in a compact format
# Look for the device marked with an asterisk (*) as the active sink
If the active sink is not the device you want, set the default manually. Replace the sink name with the actual name from the output.
pactl set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
# set-default-sink forces all applications to route audio to the specified device
# Replace the sink name with the actual name from the previous output
# This command takes effect immediately for new audio streams
Run pactl list sinks short again to confirm the asterisk moved to the correct device.
Check the hardware mute switch. Software can't fix a physical switch.
Verify the fix
Run a test tone to confirm audio is flowing. The pw-play tool is part of the PipeWire package and plays audio directly.
pw-play /usr/share/sounds/freedesktop/stereo/complete.oga
# pw-play is the native PipeWire playback tool
# This plays a system sound file directly through the audio stack
# If you hear the sound, the fix worked. If not, check the next section.
If you hear the sound, the issue was a stuck service or a routing error. If you hear nothing, check the logs for errors.
Read the journal. The error message tells you exactly which service failed.
Override device profiles with Wireplumber
Some hardware requires a specific profile to work. Wireplumber uses Lua configuration files. You can override defaults by placing files in ~/.config/wireplumber/main.lua.d/. Config files in /etc/wireplumber/ ship with the package. Never edit files there. Your changes vanish on update. Place overrides in ~/.config/wireplumber/ for user-specific changes.
Here's how to force a specific profile for a device. This is useful when the auto-detection picks the wrong mode.
-- ~/.config/wireplumber/main.lua.d/99-custom-profile.lua
-- This file overrides the default profile for a specific device
-- Wireplumber loads user configs after system configs, so these take precedence
-- The key 'device.profile' forces the hardware into the specified mode
rp.apply_properties_filter(
function(filter, info)
if info['device.name'] == 'alsa_card.pci-0000_00_1f.3' then
filter['device.profile'] = 'output:analog-stereo+input:analog-stereo'
end
end
)
After creating the file, restart Wireplumber to apply the change.
systemctl --user restart wireplumber
# Restarting Wireplumber reloads all Lua configuration files
# The new profile filter applies to the next hardware scan
# Check the logs if the service fails to start due to a syntax error
Test the config by restarting Wireplumber. A bad Lua file stops the service immediately.
Check Bluetooth audio codecs
Bluetooth audio often fails because of codec negotiation. Fedora uses wireplumber as the session manager. Some older guides mention pipewire-media-session. pipewire-media-session is deprecated on Fedora. Ensure pipewire-audio and wireplumber are installed.
Here's how to check the connection details for a Bluetooth device.
bluetoothctl info <MAC_ADDRESS>
# bluetoothctl queries the Bluetooth daemon for device details
# Look for "Codec" and "Transport" lines to verify the connection
# If the codec shows SBC, your device supports higher quality codecs
If the codec is SBC but your headphones support AAC or LDAC, the negotiation might be failing. You can force a codec in the Wireplumber config.
-- ~/.config/wireplumber/main.lua.d/99-bluetooth-codec.lua
-- This file forces a specific codec for Bluetooth audio devices
-- The key 'bluez5.enable-sbc-xq' enables high quality SBC if available
-- The key 'bluez5.codecs' sets the preferred codec order
rp.apply_properties_filter(
function(filter, info)
if info['node.name'] and string.find(info['node.name'], 'bluez') then
filter['bluez5.enable-sbc-xq'] = true
filter['bluez5.codecs'] = 'ldac,aac,sbc'
end
end
)
Restart Wireplumber after editing the config. Pair the device in the GUI. The terminal tools only verify the connection.
Common pitfalls and error messages
The pactl command returns Connection refused. This means the PulseAudio compatibility layer isn't running. Run systemctl --user status pipewire-pulse. If it's failed, check the logs.
Use journalctl --user -xe to read logs. The x flag adds explanatory priority hints, and e jumps to the end. Most sysadmins type this muscle-memory style when debugging user services.
Failed to open device "hw:0,0": Device or resource busy
You see Failed to open device "hw:0,0": Device or resource busy in the logs. Another process has locked the hardware. This is rare with PipeWire, but can happen if a legacy ALSA app grabs the device exclusively. Kill the rogue process or restart PipeWire to reclaim the device.
Some laptops need kernel module parameters. This is rare but happens with certain Realtek codecs. You can pass parameters via modprobe.
echo "options snd-hda-intel model=auto" | sudo tee -a /etc/modprobe.d/alsa.conf
# This adds a parameter to the snd-hda-intel kernel module
# model=auto forces the driver to probe the hardware for the correct quirk
# Run sudo alsa force-reload to apply without rebooting
sudo alsa force-reload reloads the ALSA kernel modules and resets the mixer state. This is faster than rebooting when testing module parameters.
SELinux denials can block audio access. Check journalctl -t setroubleshoot for one-line summaries. Read those before disabling SELinux.
Trust the package manager. Manual file edits drift, snapshots stay.
When to use this approach
Restart the user services when the audio stack is running but misrouted or stuck.
Reboot the system when the services fail to start or the hardware state is corrupted.
Reinstall the packages when the configuration files are missing or the binary is broken.
Check the hardware mute switch when software commands have no effect and the device shows as muted.
Restart the services first. A reboot is the nuclear option.