How to Set the Default Audio Input and Output Device on Fedora

Install and run pavucontrol to manually select default audio input and output devices on Fedora.

You plug in a USB microphone or connect your laptop to a docking station

Fedora detects the hardware instantly. Your video calls still route through the built-in webcam mic. Your music plays through the internal speakers instead of the external monitor. The system sees the devices, but it refuses to make them the default. You are not alone. This happens because Fedora uses a dynamic audio routing system that prioritizes session state over hardware insertion order.

What is actually happening

Fedora ships with PipeWire as the audio server and WirePlumber as the session manager. PipeWire does not store a single static default device in a configuration file. Instead, it maintains a priority list and applies routing rules based on active streams, device profiles, and your previous session state. When you connect new hardware, PipeWire adds it to the available pool. WirePlumber then evaluates priority scores and decides which device handles playback and capture.

If the new device has a lower priority score, or if its profile is set to Off, the system falls back to the built-in hardware. This design prevents audio from cutting out when you unplug a headset, but it means you must explicitly tell the session manager to override the automatic routing. The routing decision happens at the user level, not the system level. User services manage your audio session. System services handle low-level hardware access.

Check the user service status before you change routing. Run systemctl --user status pipewire wireplumber to confirm both daemons are active. If either is failed, no amount of GUI clicking will change the default device. Restart the user services if they are stuck.

The fix with the graphical interface

The most reliable way to force a routing change is pavucontrol. It communicates directly with the PipeWire-Pulse compatibility layer and gives you visual control over active streams and device profiles. Install it if your desktop environment did not ship it by default.

Here is how to install the tool and launch it from your terminal.

sudo dnf install pavucontrol -y
# -y skips the confirmation prompt for a clean install
# dnf resolves dependencies automatically
pavucontrol
# Launches the GUI in your current X11 or Wayland session

Open the Configuration tab first. This tab controls the profile for each hardware node. A profile defines how the hardware can be used. Analog Stereo Duplex allows simultaneous playback and recording. Off disables the device entirely. Select the profile that matches your hardware capabilities. If you see Pro Audio or Digital Stereo, pick the one that matches your use case.

Move to the Output Devices tab. You will see every available playback device listed with a volume slider and a Set as fallback button. Click Set as fallback on the device you want to use for general audio. This tells WirePlumber to route new playback streams to this device by default. Existing streams will not switch automatically. Close and reopen your browser or media player to apply the change to active applications.

Switch to the Input Devices tab and repeat the process for your microphone. Click Set as fallback on the desired capture device. Some USB headsets require you to set the profile to Analog Stereo Input instead of Analog Stereo Duplex. The Input tab will show the device as unavailable until the profile matches.

Reboot before you debug. Half the time the symptom is gone after a clean user session restart.

The fix from the command line

Headless servers, SSH sessions, and automation scripts need a terminal-native approach. PipeWire provides wpctl for direct session management. The tool lists nodes, ports, and profiles in a structured format that is easy to parse.

Here is how to list your available audio devices and identify their correct names.

wpctl status
# Queries the PipeWire server for current session state
# Shows sinks, sources, and their active profiles
# Look for the asterisk next to the current default

The output separates sinks (playback) from sources (capture). Each entry shows a numeric ID, a human-readable name, and a port list. The port is the physical connector. The node is the logical device. You can set the default by node name or by port name. Using the port name is more precise when a single device has multiple outputs.

Here is how to set a new default playback device using the port identifier.

wpctl set-default "alsa_output.pci-0000_00_1f.3.analog-stereo"
# Replaces the current default sink with the specified port
# WirePlumber updates the priority list immediately
# New streams will route to this device automatically

For capture devices, the syntax is identical. Replace the port name with your microphone identifier. If you only have the node name, use it directly. The command will succeed as long as the identifier matches the output of wpctl status.

Verify the change by running wpctl status again. The asterisk will move to your new selection. If the asterisk does not move, the device profile is likely set to Off or the hardware is suspended. Check the Configuration tab in pavucontrol or run wpctl info <node_id> to inspect the active profile.

Trust the package manager. Manual file edits drift, snapshots stay.

Verify it worked

Audio routing changes do not always apply to streams that are already open. Your web browser or music player may continue using the old device until it reinitializes its audio context. Close the application completely and reopen it. Play a test sound or start a recording session.

Here is how to confirm the routing is active and capturing correctly.

wpctl status | grep -A 2 "Default"
# Filters the status output to show only the default sink/source
# Confirms the asterisk is attached to your target device
# Returns immediately without waiting for full output

If you need a quick hardware test, use speaker-test for playback and arecord for capture. These tools bypass application-level buffering and talk directly to the ALSA layer. Run speaker-test -t wav -c 2 to play a white noise pattern through your default output. Run arecord -D default -f cd -d 5 test.wav to record five seconds of audio. Play the file back to verify the input path.

If the test fails, check the system journal for PipeWire errors. Run journalctl -xeu pipewire to see recent daemon logs. The x flag adds explanatory context. The e flag jumps to the end. Most routing failures show up as profile mismatches or permission denials.

Run journalctl first. Read the actual error before guessing.

Common pitfalls and what the error looks like

Devices frequently disappear from the default list because their profile is set incorrectly. PipeWire will not route audio to a device marked as Off or Unavailable. You will see the device in the hardware list, but the Set as fallback button will be grayed out. Change the profile in the Configuration tab to match your hardware. Analog Stereo Duplex works for most USB headsets. Pro Audio is for professional interfaces. Digital Stereo is for optical or HDMI outputs.

Bluetooth audio introduces a second layer of complexity. Bluetooth headsets use different profiles for high-quality playback and voice calls. A2DP Sink provides stereo music but disables the microphone. HSP/HFP enables the microphone but drops audio quality to mono. WirePlumber switches profiles automatically when a voice call starts, which can cause audio to stutter or drop. Force the profile in pavucontrol if the automatic switch is too aggressive.

HDMI and DisplayPort audio often vanishes when the display goes to sleep. PipeWire suspends the device to save power. When the display wakes, the audio session may not resume correctly. You will see [FAILED] Failed to start pipewire-pulse.service or wpctl: no such device in your terminal. Restart the user services to force a hardware reprobe. Run systemctl --user restart pipewire pipewire-pulse wireplumber. The session will rebuild the device tree and restore the default routing.

SELinux denials rarely block audio routing, but they can prevent applications from accessing the PipeWire socket. You will see avc: denied { connectto } in journalctl -t setroubleshoot. The one-line summary will point to the offending application. Restore the correct context with restorecon -v /path/to/app instead of disabling SELinux. The audio stack runs in the user namespace. System-wide policy changes are unnecessary.

Snapshot the system before the upgrade. Future-you will thank you.

When to use this versus alternatives

Use pavucontrol when you need visual confirmation of active streams and device profiles. Use wpctl when you are working over SSH or writing automation scripts. Use pactl when you are maintaining legacy software that explicitly depends on PulseAudio CLI syntax. Stick to the default automatic routing when you only occasionally swap between a headset and speakers.

Where to go next