On this page
Media Operations Manual
Audio/video-related operations, including PipeWire management, volume control, device routing, recording, and troubleshooting.
Architecture Overview
Key Concepts:
- PipeWire = Unified audio/video service, replacing both PulseAudio and JACK
- WirePlumber = Device hot-plug/auto-routing policy (e.g., when headphones are plugged in or HDMI output is switched)
- pipewire-pulse = PulseAudio compatibility layer, allowing PA apps to use PipeWire transparently
- pactl operates pipewire-pulse, wpctl operates the native PipeWire layer
Status Checks
# Service status
# PipeWire native info
# WirePlumber devices
# PulseAudio compatibility layer
# Hardware
|
Volume Control
# wpctl (Recommended, native PipeWire)
# pactl (PulseAudio compatibility layer)
# amixer (ALSA low-level, direct hardware control)
Audio Routing (Switch Output Device)
# List available sinks and switch
# Migrate currently playing stream to a specific sink
# Switch to a specific device (by name)
SINK=
# View sound card profiles (analog/digital/HDMI switching)
Restarting WirePlumber / PipeWire
# Restart the entire audio stack (soft restart, apps won't notice)
# Restart WirePlumber alone (refreshes device list)
# Full reset (kill then start)
Troubleshooting
# 1. Check if there is any audio output
# 2. Check if pipewire-pulse is frozen (common: Chrome video freezes)
# Fix: systemctl --user restart pipewire-pulse
# 3. Check if any process is exclusively locking the sound card
# 4. Check if ALSA layer is working normally
# If ALSA plays fine but PipeWire has no sound → PipeWire layer issue
# If ALSA also reports errors → Driver/hardware issue
# 5. USB/HDMI hot-plug not responding
# 6. Bluetooth audio
# After connecting, WirePlumber automatically creates a BT sink, visible via wpctl status
# If not appearing: systemctl --user restart wireplumber
# 7. Multiple simultaneous outputs (if needed)
# Unload: pactl unload-module module-combine-sink
Common Symptoms Quick Reference
| Symptom | Possible Cause | Command |
|---|---|---|
| Chrome video progress bar stuck, buffering | pipewire-pulse frozen | systemctl --user restart pipewire-pulse |
| No sound at all | Wrong default sink | wpctl status to check default sink |
| Headphones not auto-switching | WirePlumber didn't react | systemctl --user restart wireplumber |
| Some apps play sound, others don't | Different sinks used | pactl list sink-inputs to check routing |
| Bluetooth headset connected but no sound | BT profile dropped | pactl list cards to check profile |
Recording
# Screen recording (PipeWire + wf-recorder, native Wayland)
# Audio recording (PipeWire)
# PulseAudio compatibility
# Screenshots (Wayland/Hyprland)
|
Volume/Media Keys
Hyprland media key binding example (hyprland.lua):
-- Volume control (wpctl)
hl.dsp.bind({"SUPER"}, "XF86AudioRaiseVolume", function() hl.exec("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+") end)
hl.dsp.bind({"SUPER"}, "XF86AudioLowerVolume", function() hl.exec("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-") end)
hl.dsp.bind({"SUPER"}, "XF86AudioMute", function() hl.exec("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle") end)
hl.dsp.bind({"SUPER"}, "XF86AudioMicMute", function() hl.exec("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle") end)
-- Playback control (playerctl, requires installation)
hl.dsp.bind({}, "XF86AudioPlay", function() hl.exec("playerctl play-pause") end)
hl.dsp.bind({}, "XF86AudioNext", function() hl.exec("playerctl next") end)
hl.dsp.bind({}, "XF86AudioPrev", function() hl.exec("playerctl previous") end)
Other playerctl usages:
Video/Codec Information
|
# Check hardware codec support
| |
Firmware
# AMD GPU firmware (codec/display)
|
# SOF (Sound Open Firmware, Intel audio DSP)
|