Skip to content
Go back

Linux Audio in 2026: PipeWire Replaced Everything

By SumGuy 6 min read
Linux Audio in 2026: PipeWire Replaced Everything

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:

As of 2026, PipeWire is the default on:

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

Terminal window
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.

Terminal window
pw-cli info 0

This talks directly to the PipeWire daemon and dumps its properties. If the command exists and returns output, PipeWire is running.

Terminal window
systemctl --user status pipewire wireplumber

Both 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.

Terminal window
# See everything: sinks, sources, streams, devices
wpctl 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 unmute
wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
wpctl set-mute @DEFAULT_AUDIO_SINK@ 1 # mute
wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 # unmute
# Adjust mic input volume
wpctl 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.

Terminal window
# List sinks (output devices)
pactl list sinks short
# Set default sink by name
pactl set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
# Volume to 50%
pactl set-sink-volume @DEFAULT_SINK@ 50%
# Relative adjustment
pactl set-sink-volume @DEFAULT_SINK@ +10%
pactl set-sink-volume @DEFAULT_SINK@ -5%

pamixer is also handy if you want something scriptable:

Terminal window
pamixer --increase 5
pamixer --decrease 5
pamixer --toggle-mute
pamixer --get-volume

Install 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:

Terminal window
bluetoothctl
# Inside bluetoothctl:
scan on
pair AA:BB:CC:DD:EE:FF
trust AA:BB:CC:DD:EE:FF
connect AA:BB:CC:DD:EE:FF

Once connected, it should appear automatically. Check it showed up:

Terminal window
pactl list cards | grep -A5 bluetooth

If the Bluetooth headset connected but no audio is routing to it:

Terminal window
pactl set-default-sink bluez_output.AA_BB_CC_DD_EE_FF.1

Or use wpctl status to find the node ID and set it with wpctl set-default.

Fixing Common Issues

No audio after suspend/resume:

Terminal window
systemctl --user restart pipewire pipewire-pulse wireplumber

This fixes 90% of post-suspend audio issues. Worth aliasing as fix-audio.

HDMI audio not routing correctly:

Terminal window
pactl list sinks short

Find your HDMI sink name (usually something like alsa_output.pci-0000_01_00.1.hdmi-stereo) and set it as default:

Terminal window
pactl set-default-sink <hdmi-sink-name>

See what each application is doing with audio:

Terminal window
pw-top

pw-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:

vol.sh
#!/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]" ;;
esac

Drop 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.

Terminal window
pavucontrol

qpwgraph — 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:

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.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it may appear here.


Previous Post
n8n + LLM: Building Automations That Actually Think
Next Post
The Reverse Proxy Timeout That Kills Long Uploads

Related Posts