You Might Still Be Thinking in PulseAudio
If you installed Linux before 2022 and never thought about audio again, you might still be thinking in PulseAudio terms. You’d pactl set-sink-volume something, move on, and wonder why your Bluetooth headset was a dice roll every boot.
PipeWire changed the stack but kept backward compatibility — most of your old commands still work. But there’s a cleaner way to do things now, and understanding what’s actually running under the hood will save you the 2 AM “why is there no audio” spiral.
Here’s what actually matters.
A Brief History of Linux Audio Pain
Linux audio has always been a layered mess, and the layers kept multiplying:
- ALSA (1998, in-kernel since 2.6) — handles hardware. Talks directly to your sound card. Still here, still required.
- PulseAudio (2004) — userspace daemon sitting on top of ALSA, adding per-app volume, network audio, Bluetooth routing. Solved real problems, introduced new ones. Every developer has a PulseAudio horror story.
- PipeWire (2021, mainstream) — replaced PulseAudio entirely. Also replaced JACK (the pro-audio stack). Lower latency, better Bluetooth, native screen capture audio, and a compatibility layer that makes
pactland JACK apps keep working without modification.
As of 2026, PipeWire is the default on:
- Fedora 34+ (first major distro to ship it)
- Ubuntu 22.10+
- Debian 12+
- Arch, openSUSE, Manjaro, Pop!_OS — basically everything
If you’re running a mainstream distro released in the last three years, you have PipeWire. The question is whether you know it.
The Three Layers You Actually Need to Know
┌─────────────────────────────────┐│ Your Applications │├─────────────────────────────────┤│ WirePlumber (session manager) │ ← decides routing, device policy├─────────────────────────────────┤│ PipeWire daemon │ ← the actual audio graph├─────────────────────────────────┤│ ALSA (kernel drivers) │ ← talks to hardware└─────────────────────────────────┘ALSA is the kernel interface to your sound card. You don’t interact with it directly anymore (mostly).
PipeWire is the daemon running the real-time audio graph. Everything routes through here.
WirePlumber is the session manager — it handles device policy, routing decisions, and Bluetooth negotiation. Think of it as the manager that tells PipeWire what to do with everything that plugs in.
Check What You’re Actually Running
pactl info | grep "Server Name"If you see PulseAudio (on PipeWire) — you’re on PipeWire with the compatibility layer. Good.
If you see PulseAudio with no PipeWire mention — you’re on actual PulseAudio. Consider upgrading your distro.
pw-cli info 0This talks directly to the PipeWire daemon and dumps its properties. If the command exists and returns output, PipeWire is running.
systemctl --user status pipewire wireplumberBoth should be active and running.
CLI Control: The Modern Way with wpctl
wpctl is the WirePlumber control utility. This is your new amixer — except it actually works.
# See everything: sinks, sources, streams, deviceswpctl status
# Get current volume (0.0–1.5 scale)wpctl get-volume @DEFAULT_AUDIO_SINK@
# Set volume to 50%wpctl set-volume @DEFAULT_AUDIO_SINK@ 50%
# Mute and unmutewpctl set-mute @DEFAULT_AUDIO_SINK@ togglewpctl set-mute @DEFAULT_AUDIO_SINK@ 1 # mutewpctl set-mute @DEFAULT_AUDIO_SINK@ 0 # unmute
# Adjust mic input volumewpctl set-volume @DEFAULT_AUDIO_SOURCE@ 80%@DEFAULT_AUDIO_SINK@ and @DEFAULT_AUDIO_SOURCE@ are aliases — no need to look up device IDs for basic operations. For specific devices, grab the numeric ID from wpctl status and use that instead.
CLI Control: PulseAudio Compat Layer (Still Works Fine)
If you have muscle memory for pactl, it still works on PipeWire through the compatibility layer. No shame in it.
# List sinks (output devices)pactl list sinks short
# Set default sink by namepactl set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
# Volume to 50%pactl set-sink-volume @DEFAULT_SINK@ 50%
# Relative adjustmentpactl set-sink-volume @DEFAULT_SINK@ +10%pactl set-sink-volume @DEFAULT_SINK@ -5%pamixer is also handy if you want something scriptable:
pamixer --increase 5pamixer --decrease 5pamixer --toggle-mutepamixer --get-volumeInstall it with your package manager — pamixer isn’t always included by default.
Bluetooth Audio
This used to require a specific PulseAudio Bluetooth module (pulseaudio-bluetooth) and a handful of prayers. PipeWire handles Bluetooth audio natively through wireplumber.
Pair the device as normal:
bluetoothctl# Inside bluetoothctl:scan onpair AA:BB:CC:DD:EE:FFtrust AA:BB:CC:DD:EE:FFconnect AA:BB:CC:DD:EE:FFOnce connected, it should appear automatically. Check it showed up:
pactl list cards | grep -A5 bluetoothIf the Bluetooth headset connected but no audio is routing to it:
pactl set-default-sink bluez_output.AA_BB_CC_DD_EE_FF.1Or use wpctl status to find the node ID and set it with wpctl set-default.
Fixing Common Issues
No audio after suspend/resume:
systemctl --user restart pipewire pipewire-pulse wireplumberThis fixes 90% of post-suspend audio issues. Worth aliasing as fix-audio.
HDMI audio not routing correctly:
pactl list sinks shortFind your HDMI sink name (usually something like alsa_output.pci-0000_01_00.1.hdmi-stereo) and set it as default:
pactl set-default-sink <hdmi-sink-name>See what each application is doing with audio:
pw-toppw-top is like htop for your audio graph. Shows active streams, their latency, and what nodes they’re connected to. Genuinely useful when something is consuming audio unexpectedly or routing to the wrong device.
A Practical Volume Script
Here’s a simple script using wpctl that replaces the old amixer wrapper patterns:
#!/bin/bash# Usage: vol.sh [up|down|mute|get]case "$1" in up) wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ ;; down) wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- ;; mute) wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle ;; get) wpctl get-volume @DEFAULT_AUDIO_SINK@ ;; *) echo "Usage: vol.sh [up|down|mute|get]" ;;esacDrop it in ~/bin/vol.sh, chmod +x, and bind up/down/mute to your media keys if your DE isn’t doing it already.
GUI Tools (Yes, They Still Exist)
pavucontrol — the PulseAudio Volume Control app — still works perfectly on PipeWire through the compat layer. It’s the quickest way to route a specific app to a specific output without touching the CLI.
pavucontrolqpwgraph — a visual node editor for PipeWire’s audio graph. If you want to do anything fancy like routing a specific app to multiple outputs, or connecting virtual cables between applications, this is your tool. It’s the JACK patchbay for the modern era.
The Takeaway
PipeWire quietly won. It replaced PulseAudio, replaced JACK, and made Bluetooth less of a disaster — all while keeping your old pactl commands working. The main thing to internalize is:
wpctlis the native control tool nowpactlandpamixerstill work through the compat layerpw-topis your debugging friend- One
systemctl --user restartusually fixes the weird stuff
You don’t need to think about ALSA directly anymore. You probably haven’t needed to since 2021 — you just didn’t know it yet.