Thunderbolt devices

Enable audio on HP Thunderbolt docks by copying specific PipeWire profile configuration files and restarting the audio service.

The dock connects but the audio stays silent

You connect a Thunderbolt dock to your Fedora workstation. The display extends. The USB hub populates. The network link lights up. You plug headphones into the dock's 3.5mm jack and play a track. Silence. The system recognizes the dock, but audio refuses to route through it. You are not imagining it. The hardware is fine. The routing table is missing.

How PipeWire routes Thunderbolt audio

PipeWire replaces PulseAudio as the default sound server on modern Fedora. It manages audio streams, video capture, and JACK compatibility in one daemon. PipeWire does not guess how to handle every possible audio endpoint. It relies on mixer profile sets to translate raw hardware capabilities into usable software profiles.

Think of a mixer profile set like a wiring diagram for a soundboard. The hardware reports its raw inputs and outputs. The profile set tells PipeWire which physical pins map to which software streams, how to switch between analog and digital modes, and which jack should trigger a profile change. Thunderbolt docks often expose complex audio topologies. Some present a single USB audio class device. Others split analog and digital streams across multiple endpoints. When the dock's topology does not match PipeWire's built-in defaults, the daemon creates a generic profile that leaves the analog jacks unmapped. The system sees the device but has no instructions for routing audio through it.

Fedora ships a growing library of community-maintained profile sets in /usr/share/pipewire/alsa/mixer/profile-sets/. These files are written in a key-value format that PipeWire parses at startup. If your dock matches a known model, the profile already exists. You only need to place it in the right directory and tell PipeWire to reload.

Run ls /usr/share/pipewire/alsa/mixer/profile-sets/ first. Look for a filename that matches your dock model. If it is there, proceed to the next section. If it is missing, you will need to request the profile upstream or write a custom mapping. Trust the package manager. Manual file edits drift, snapshots stay.

Supply the missing mixer profile

User-level configuration overrides system defaults without touching protected directories. Fedora follows the XDG base directory specification for user overrides. You will create a configuration drop-in directory in your home folder and copy the dock's profile set there.

Here is how to create the directory and copy the profile files for the HP Thunderbolt Dock 120W G2.

mkdir -p ~/.config/pipewire/pipewire.conf.d
# Creates the user configuration drop-in directory if it does not exist
# XDG spec places user overrides in ~/.config, not /etc
cp /usr/share/pipewire/alsa/mixer/profile-sets/hp-tbt-dock-120w-g2.conf ~/.config/pipewire/pipewire.conf.d/
# Copies the main dock profile to your user config directory
cp /usr/share/pipewire/alsa/mixer/profile-sets/hp-tbt-dock-audio-module.conf ~/.config/pipewire/pipewire.conf.d/
# Copies the companion audio module profile for speakerphone routing
systemctl --user restart pipewire pipewire-pulse
# Restarts both the core PipeWire daemon and the PulseAudio compatibility layer
# --user targets the session service, not the system-wide daemon

The pipewire-restart convenience script exists on some systems, but it often only restarts the core daemon and skips the PulseAudio compatibility layer. Using systemctl --user restart guarantees both services reload their configuration. PipeWire reads all files in pipewire.conf.d/ at startup and merges them with the base configuration. The user directory takes precedence over /usr/share/ when filenames collide.

Restart your audio applications after the service reloads. Firefox, Spotify, and terminal players often cache the previous audio sink. Closing and reopening them forces a fresh route lookup.

Reboot before you debug. Half the time the symptom is gone.

Confirm the routing table updated

Verification requires checking two things. The profile must be active. The audio stream must be pointing to the correct sink.

Here is how to query PipeWire for the active profile and available sinks.

pw-cli info all | grep -A 5 "node.name"
# Lists all active audio nodes and their current profiles
# The grep filter isolates the node name and profile assignment
pw-cli list-objects | grep -i "sink"
# Shows every registered audio sink with its priority and state
# Look for the dock's analog output in the list

If the dock appears with a profile like analog-stereo-output or hp-tbt-dock-profile, the configuration loaded correctly. If you still see pro-audio or off, the profile set did not apply. Check the filename spelling. PipeWire matches profiles by exact string comparison.

Open pavucontrol and switch to the Configuration tab. The dock should now list multiple profile options instead of a single generic entry. Select the analog stereo option. Switch to the Playback tab and verify your application's output device matches the dock's sink. Play a test tone. Sound should route through the 3.5mm jack.

Run journalctl --user -u pipewire -n 20 if the profile still refuses to load. Look for Failed to parse or Unknown key lines. PipeWire logs configuration errors directly to the user journal. Read the actual error before guessing.

Common configuration traps

Configuration drift happens when you edit files in the wrong location. Fedora packages own /usr/share/pipewire/. System updates will overwrite manual changes in that directory. Always place overrides in ~/.config/pipewire/ or /etc/pipewire/. The /etc/ path applies to all users on the machine. The ~/.config/ path applies only to your session.

Here is what a typical configuration error looks like in the journal.

pipewire[1234]: alsa-mixer: failed to load profile set hp-tbt-dock-120w-g2.conf: No such file or directory
pipewire[1234]: spa.alsa: cannot open device 'hw:1' for playback: Device or resource busy

The first line means the file path is wrong or the filename contains a typo. The second line means another process already claimed the ALSA device. Thunderbolt docks sometimes register multiple ALSA cards. If you see Device or resource busy, run fuser -v /dev/snd/* to identify the blocking process. Kill it or wait for PipeWire to claim the device automatically.

Another trap involves leaving the old PulseAudio configuration files in place. Fedora migrated to PipeWire years ago, but legacy ~/.config/pulse/ directories can interfere with routing. If you experience phantom sinks or duplicate device names, remove the legacy directory.

rm -rf ~/.config/pulse
# Clears cached PulseAudio state that conflicts with PipeWire routing
# PipeWire will regenerate its own state on next login
systemctl --user restart pipewire-pulse
# Reloads the compatibility layer with a clean slate

Do not disable SELinux to fix audio routing. SELinux denials for PipeWire appear in journalctl -t setroubleshoot with a one-line summary. They usually indicate a missing policy module or a misconfigured sandbox, not a permission block on audio devices. Read the denial message before changing security contexts.

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

Choose the right configuration scope

Use ~/.config/pipewire/pipewire.conf.d/ when you are configuring a single workstation for your own user account. Use /etc/pipewire/pipewire.conf.d/ when you are deploying a standard audio setup across multiple user accounts on the same machine. Use upstream reporting when your dock model lacks a profile set entirely and you need the community to maintain the mapping long-term. Stay on the default system profiles if your dock works out of the box and you only need basic playback.

Where to go next