Sound Setup

Chapter 8 — Configuring Sound

Sound on Linux works well on most hardware straight out of the box — but when it doesn't, it can be confusing because the audio stack has several layers with unfamiliar names. This chapter explains how Linux handles audio, how to use the graphical sound settings, how to switch output devices (including HDMI and Bluetooth), and how to diagnose and fix the most common sound problems.

1. How Linux Handles Audio — The Stack

Linux audio goes through several layers between an application and your speakers. Understanding these layers makes troubleshooting much easier.

🎵
Applications
Firefox, VLC, Spotify, games — anything that plays or records audio. These send audio to the sound server.
🔊
Sound Server — PipeWire or PulseAudio
Manages multiple audio streams, mixing them together. Controls volume per application. Routes audio to the correct output device. This is what you configure in the GUI settings panel.
⚙️
ALSA (Advanced Linux Sound Architecture)
The kernel-level audio driver layer. Talks directly to the hardware. You rarely need to touch this; the sound server sits on top of it.
🖥️
Hardware — Sound Card / Chip
The physical audio hardware: built-in motherboard audio, USB DAC, HDMI audio via GPU, or Bluetooth adapter.

When you adjust the volume slider in your desktop's settings panel, you're controlling the sound server. When audio is completely absent, the problem is usually either at the ALSA level (wrong device selected, muted) or at the sound server level (service not running, wrong output selected).

2. PulseAudio vs PipeWire

There are two sound servers in common use on Linux. Which one you have depends on your distro and how recently it was released.

PulseAudio — the established standard
  • Has been the default Linux sound server since ~2008
  • Handles desktop audio mixing well
  • Bluetooth audio support is good but requires separate modules
  • Not designed for professional low-latency audio
  • Still the default on older Ubuntu LTS, Debian, Linux Mint 20
  • Stable and very well-tested
PipeWire — the modern replacement
  • Default on Ubuntu 22.10+, Fedora 34+, Linux Mint 21+
  • Drop-in replacement for PulseAudio — existing apps work unchanged
  • Also replaces JACK (professional low-latency audio)
  • Better Bluetooth codec support (AAC, aptX, LDAC)
  • Lower latency — better for gaming and video calls
  • Handles screen capture audio alongside video (important for Wayland)
Which one do you have? Run this in a terminal: pactl info | grep "Server Name". If the output says PulseAudio (on PipeWire) you have PipeWire with PulseAudio compatibility. If it just says PulseAudio, you have the original PulseAudio. Either way, the graphical controls and most of the commands in this chapter work identically for both.

Checking what's running

$ pactl info | grep "Server Name" Server Name: PulseAudio (on PipeWire 1.0.1) # Or check which services are active: $ systemctl --user status pipewire pulseaudio

3. Graphical Sound Settings

For everyday audio management you rarely need the terminal. Every major desktop environment has graphical sound controls.

Ubuntu (GNOME) — Settings → Sound

Open Settings → Sound. You'll find:

  • Output device — dropdown showing all available audio outputs (built-in speakers, headphone jack, HDMI, USB audio). Select the one you want to use.
  • Output volume — the master volume slider.
  • Input device — microphone selection and input volume.
  • Alert volume — volume for system notification sounds.
  • Test button — plays a short sound to confirm the selected output works.

Linux Mint (Cinnamon) — Sound applet

Right-click the speaker icon in the system tray and choose Sound Settings. Alternatively, open System Settings → Sound. Mint's sound panel is similar to GNOME's but also shows per-application volume levels on the "Applications" tab.

KDE Plasma — Audio Volume widget

Click the speaker icon in the system tray to open the quick volume control. For full settings, right-click the speaker and choose Configure Audio Devices (or open System Settings → Audio). KDE lets you set a default output per application — for example, routing game audio to headphones and notification sounds to speakers.

XFCE / MATE — PulseAudio Volume Control

These desktops use a standalone tool. Search for PulseAudio Volume Control (pavucontrol) in the application menu. If it's not installed:

$ sudo apt install pavucontrol

pavucontrol is actually the most powerful graphical audio tool on Linux regardless of desktop — it shows every audio stream, every device, and lets you reroute streams between devices in real time.

4. pavucontrol — The Audio Power Tool

PulseAudio Volume Control (pavucontrol) works with both PulseAudio and PipeWire and gives you far more control than the basic desktop sound panel. It has five tabs:

  • Playback — shows every application currently playing audio, with an individual volume slider for each. You can mute a specific app or adjust its volume independently of the master.
  • Recording — shows every application currently recording audio (mic input). Useful for identifying which app has grabbed the microphone.
  • Output Devices — lists every audio output (speaker, headphones, HDMI, USB). You can set the default and adjust the volume for each device independently.
  • Input Devices — lists every microphone and audio input. Set the default and adjust input gain.
  • Configuration — shows the profile for each audio card. This is where you switch between stereo output, surround sound, HDMI audio, and digital output (S/PDIF). This tab fixes most HDMI audio problems.
pavucontrol is the first tool to open when sound isn't working. The Playback tab will show you whether audio is actually being sent to the sound server (the stream will appear, even if you can't hear it), and the Output Devices tab will show if the volume is muted at the device level rather than the application level.

5. HDMI Audio

HDMI carries audio as well as video, so when you connect a monitor or TV via HDMI you expect audio to come from those speakers. Linux handles this but sometimes needs a nudge to select the right output.

  • 1
    Open pavucontrol (or Settings → Sound on GNOME).
  • 2
    Click the Configuration tab. You'll see your audio hardware listed — typically something like "Built-in Audio" and possibly a separate GPU audio device (e.g., "NVIDIA High Definition Audio" or "AMD HD Audio").
  • 3
    For the GPU audio device, change its profile from "Off" to "Digital Stereo (HDMI)" or the matching HDMI port (HDMI 1, HDMI 2, etc.).
  • 4
    Go to the Output Devices tab — the HDMI output should now appear. Click the green tick (✓) button next to it to set it as the default.
  • 5
    Test by playing any audio. If using GNOME, you can also set the output in Settings → Sound → Output device dropdown.
Multiple HDMI ports: if your GPU has more than one HDMI/DisplayPort output, each may appear as a separate audio device (HDMI 1, HDMI 2, HDMI 3…). If you're not sure which port you're using, try each profile in turn — only the one connected to a display with speakers will produce sound.

6. Bluetooth Audio

Bluetooth headphones and speakers work on Linux, though the initial pairing process is slightly different from Windows or macOS.

Pairing via the graphical interface

  • 1
    Put your Bluetooth device into pairing mode.
  • 2
    Open Settings → Bluetooth (Ubuntu/GNOME) or the Bluetooth manager from the system tray. Make sure Bluetooth is enabled.
  • 3
    Your device should appear in the "Available devices" list. Click it and then click Pair. Confirm any PIN if prompted.
  • 4
    After pairing, the Bluetooth headphones should appear in Settings → Sound → Output device. Select them.

Bluetooth audio quality — A2DP profile

Bluetooth audio has two main profiles: A2DP (high-quality stereo audio) and HSP/HFP (low-quality "headset" profile that enables the microphone). Linux sometimes defaults to HSP/HFP because it detects a microphone in the headphones. If your Bluetooth audio sounds terrible, this is why.

Fix it in pavucontrol → Configuration tab → select your Bluetooth device → change profile to "High Fidelity Playback (A2DP Sink)".

PipeWire has better Bluetooth codec support than PulseAudio, including AAC, aptX, and LDAC (high-quality audio compression used by Sony headphones). If you're on an older distro with PulseAudio and Bluetooth audio quality is poor, upgrading to PipeWire (or upgrading your distro) can make a noticeable difference.

7. Terminal Audio Tools

When the GUI isn't enough — or when you're troubleshooting over SSH on a headless system — the terminal provides complete control over audio.

List output devices

$ pactl list sinks short 0 alsa_output.pci-0000_00_1f.3.analog-stereo PipeWire s32le 2ch 48000Hz IDLE 1 alsa_output.pci-0000_01_00.1.hdmi-stereo PipeWire s32le 2ch 48000Hz SUSPENDED

Set the default output device

# Use the sink name from the list above $ pactl set-default-sink alsa_output.pci-0000_01_00.1.hdmi-stereo

Adjust volume from the terminal

# Set master volume to 80% $ pactl set-sink-volume @DEFAULT_SINK@ 80% # Increase volume by 5% $ pactl set-sink-volume @DEFAULT_SINK@ +5% # Mute / unmute $ pactl set-sink-mute @DEFAULT_SINK@ toggle

Check ALSA — the layer below PulseAudio/PipeWire

# List ALSA playback devices $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: PCH [HDA Intel PCH], device 0: ALC295 Analog [ALC295 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0 # Play a test tone directly via ALSA (bypasses PulseAudio/PipeWire) $ speaker-test -c 2 -t wav
speaker-test bypasses PipeWire/PulseAudio and talks directly to ALSA. If you hear sound from speaker-test but not from applications, the problem is in the sound server layer. If speaker-test is also silent, the problem is at the ALSA/driver/hardware level.

8. Troubleshooting Common Sound Problems

No sound at all after a fresh install
1. Check the volume isn't muted. Open pavucontrol → Output Devices and check that the volume slider isn't at zero and the mute button isn't active. Also check the Playback tab — if no streams appear, the application might not be sending audio at all.

2. Check the ALSA mixer isn't muted. Open a terminal and run alsamixer. Use arrow keys to navigate; press M to unmute a channel (muted channels show "MM" at the bottom; unmuted show "OO"). Press F6 to select a different sound card if you have more than one.
Sound works on headphones but not on speakers (or vice versa)
Headphone jack detection: Linux sometimes fails to switch automatically between speakers and headphones when you plug/unplug. Open alsamixer, press F6, select your audio card, and look for a "Headphone" or "Speaker" channel. Make sure the correct one isn't muted. Alternatively, in pavucontrol → Configuration, try switching the profile (e.g., from "Analog Stereo Output" to "Analog Stereo Duplex").
HDMI audio not working
Open pavucontrol → Configuration tab. Find the GPU audio device and change its profile from "Off" to "Digital Stereo (HDMI)". Then in the Output Devices tab, set the HDMI output as default. If multiple HDMI entries appear, try each one. Also confirm your monitor or TV has speakers and they're not muted on the TV's own controls.
Sound server crashed — no audio at all, pavucontrol won't open
Restart the sound server without logging out:

systemctl --user restart pipewire pipewire-pulse (PipeWire systems)
pulseaudio -k && pulseaudio --start (PulseAudio systems)

If the service keeps crashing, check for errors with journalctl --user -u pipewire -n 50.
Bluetooth audio keeps switching to bad quality (HSP/HFP)
This happens when an application activates the microphone on your Bluetooth headset. Open pavucontrol → Configuration tab, find your Bluetooth device, and manually set the profile to "High Fidelity Playback (A2DP Sink)". This persists until another application activates the microphone again. For a permanent fix, configure your video-calling application to use a different microphone (e.g., built-in laptop mic).
Crackling, popping, or stuttering audio
Usually a buffer or timing problem. For PulseAudio: edit /etc/pulse/default.pa and find the line loading module-udev-detect — add tsched=0 to disable timer-based scheduling:
load-module module-udev-detect tsched=0
Then restart PulseAudio. For PipeWire, try increasing the quantum (buffer size) in ~/.config/pipewire/pipewire.conf.d/ — but this is rarely needed on modern hardware.
Microphone not working or not detected
Open pavucontrol → Input Devices tab. If your microphone appears but has zero input level, the gain may be at zero — raise the slider. If it doesn't appear at all, check alsamixer (F4 for capture channels) to ensure the microphone input isn't muted. For USB microphones: unplug and re-plug, then check pavucontrol Input Devices — USB mics usually appear immediately without any driver installation.

Chapter Summary

TopicKey points
Audio stack Applications → Sound server (PipeWire/PulseAudio) → ALSA → Hardware. Graphical controls manage the sound server layer.
PipeWire vs PulseAudio PipeWire is the modern default (Ubuntu 22.10+, Fedora 34+, Mint 21+). PulseAudio is on older installs. Both are controlled identically via pactl and pavucontrol.
Graphical control GNOME: Settings → Sound. KDE: system tray speaker. XFCE/MATE: pavucontrol. pavucontrol works everywhere and is the most powerful option.
HDMI audio Open pavucontrol → Configuration tab → enable HDMI profile on GPU audio device → set as default in Output Devices tab.
Bluetooth audio Pair via Bluetooth settings. If quality is poor, set A2DP profile in pavucontrol → Configuration. PipeWire has better Bluetooth codec support.
Terminal tools pactl list sinks short — list outputs. pactl set-default-sink — set default. alsamixer — check for muted ALSA channels. speaker-test — test ALSA directly.
No sound fix order 1) Check not muted in pavucontrol. 2) Check alsamixer for muted channels. 3) Check correct output selected. 4) Restart sound server. 5) Run speaker-test to isolate ALSA vs server problem.
Next: Chapter 9 — Configuring networking. We cover wired Ethernet, connecting to WiFi with NetworkManager, setting a static IP address, and troubleshooting common connection problems.