wpctl — PipeWire Audio Control

Control audio volume, mute, and device selection from the terminal via PipeWire/WirePlumber.

Volume Control

Get current volume of default output
wpctl get-volume @DEFAULT_AUDIO_SINK@
Set volume to specific percentage
wpctl set-volume @DEFAULT_AUDIO_SINK@ 80%
Increase volume by 5%
wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
Decrease volume by 5%
wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
Set volume with ceiling — prevent going above 100%
wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+

Without -l 1.0, volume can exceed 100% (software amplification). The 1.0 = 100%.

Mute/unmute toggle
wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
Mute explicitly
wpctl set-mute @DEFAULT_AUDIO_SINK@ 1
Unmute explicitly
wpctl set-mute @DEFAULT_AUDIO_SINK@ 0

Microphone

Get microphone volume
wpctl get-volume @DEFAULT_AUDIO_SOURCE@
Set microphone volume
wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 60%
Mute/unmute microphone
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle

Device Inspection

Show all audio devices and their status
wpctl status

Shows sinks (outputs), sources (inputs), streams, and the default device marked with *.

Show detailed info for a specific device by ID
wpctl inspect <ID>

The ID comes from wpctl status — the number in brackets.

Default Device

Set default output device by ID
wpctl set-default <SINK_ID>
Set default input device by ID
wpctl set-default <SOURCE_ID>

Hyprland Keybindings

Volume keys in hyprland.conf — common pattern
bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+
bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindl  = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindl  = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle

bindel = bind + execute + repeat on hold (for volume). bindl = bind + locked (works on lock screen).

PipeWire Companion Tools

List PipeWire nodes with pw-cli
pw-cli list-objects Node
Monitor PipeWire events in real-time
pw-cli monitor
Launch pavucontrol for GUI audio management
pavucontrol
Check PipeWire service status
systemctl --user status pipewire pipewire-pulse wireplumber

Scripting Patterns

Get numeric volume for scripts (strip the text)
wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf "%.0f\n", $2 * 100}'
Check if muted
wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -q MUTED && echo "muted" || echo "unmuted"
Waybar volume module — reads wpctl output
# Waybar uses wireplumber module natively, but custom script:
vol=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf "%.0f", $2 * 100}')
muted=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -c MUTED)
if [[ "$muted" -eq 1 ]]; then
    echo "{\"text\": \"  muted\", \"class\": \"muted\"}"
else
    echo "{\"text\": \"  ${vol}%\"}"
fi

See Also

  • systemd — PipeWire runs as user services