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