Desktop yang telah kita rapikan sampai ke font baru terasa utuh kalau suaranya juga beres: notifikasi terdengar, meeting jernih, dan musik tidak tiba-tiba pindah perangkat. Masalahnya, audio Linux bukan pekerjaan satu program, melainkan tumpukan tiga lapis yang bekerja sama. Chapter ini membedah ketiga lapis tersebut, memperkenalkan PipeWire sebagai server audio masa kini, lalu berlatih memilih perangkat default, mengatur volume, dan menelusuri keluhan “tidak ada suara” secara sistematis.

Tiga Lapis Stack Audio #

Aplikasi seperti Firefox atau Discord tidak pernah bicara langsung ke speaker: masing-masing menyerahkan suaranya ke sebuah server audio, dan server itulah yang mencampur semuanya sebelum menyerahkannya ke kernel. Pemisahan inilah yang membuat beberapa aplikasi bisa bersuara bersamaan dengan volume masing-masing.

LapisanTugas utamaContoh
Aplikasimemutar dan merekam suaraFirefox, VLC, Discord
Server audiomixing, routing, volume per aplikasiPipeWire (dahulu PulseAudio)
ALSA di kerneldriver perangkat dan akses hardwaresnd_hda_intel, perangkat hw:0,0

ALSA adalah subsistem audio di dalam kernel: ia memuat driver chipset suara dan menyediakan perangkat tingkat rendah seperti hw:0,0. Tanpa server, biasanya hanya satu aplikasi yang boleh memakai perangkat ALSA pada satu waktu — itulah alasan layer server ada.

PipeWire: Satu Server untuk Semua Peran #

Dulunya desktop memakai PulseAudio untuk mixing sehari-hari, sementara studio musik memakai JACK yang berlatensi rendah tetapi rewel disiapkan. PipeWire menyatukan dua dunia itu dan sekaligus menangani video — termasuk menjadi fondasi berbagi layar di Wayland; Fedora memakainya sejak 2021, Ubuntu sejak 22.10.

Kunci kelancaran migrasinya adalah pipewire-pulse, lapisan kompatibilitas yang menyamar sebagai PulseAudio, sehingga perintah lama seperti pactl dan pavucontrol tetap bekerja tanpa perubahan. Kebijakan sesi — perangkat mana yang default, kapan profil Bluetooth berganti — ditangani manajer sesi WirePlumber. Ikhtisar lengkapnya ada di wiki PipeWire .

Sink, Source, dan Perangkat Default #

Sink adalah titik keluaran suara (speaker, headset), sedangkan source adalah titik masukan (mikrofon). Perintah wpctl status merangkum keduanya; berikut contoh tampilan tipikalnya, dipotong pada bagian audio:

text
Audio
 ├─ Devices:
 │
 ├─ Sinks:
 │  *        42. alsa_output.pci-0000_00_1f.3.analog-stereo   [available]
 │          55. bluez_output.00_1A_7D_DA_71_13.a2dp-sink     [available]
 ├─ Sink endpoints:
 ├─ Sources:
 │  *        47. alsa_input.pci-0000_00_1f.3.analog-stereo   [available]
 ├─ Source endpoints:
 └─ Streams:

Bintang menandai perangkat default tempat semua suara baru diarahkan. Memindahkannya satu perintah: wpctl set-default 55 memakai nomor kolom, atau pactl set-default-sink bluez_output.00_1A_7D_DA_71_13.a2dp-sink memakai nama panjang — rinciannya di pactl(1) . Untuk satu aplikasi yang mengarah ke perangkat lama, tab Playback di pavucontrol bisa mengubah aliran aplikasi itu saja tanpa menyentuh default global.

Konfigurasi Drop-in untuk PipeWire #

PipeWire menyimpan bawaannya di /usr/share/pipewire/ yang sebaiknya tidak disunting langsung; kustomisasi milik user ditulis sebagai fragmen kecil di ~/.config/pipewire/pipewire.conf.d/ — pola drop-in ala systemd dengan angka awal nama sebagai urutan. Kita coba bentuknya:

bash
mkdir -p pipewire.conf.d
cat > pipewire.conf.d/10-latihan.conf <<'EOF'
context.properties = {
    default.clock.rate = 48000
    default.clock.quantum = 1024
}
EOF
cat pipewire.conf.d/10-latihan.conf

Output yang Dihasilkan:

text
context.properties = {
    default.clock.rate = 48000
    default.clock.quantum = 1024
}

Mari kita bedah isi fragmen tersebut:

  1. Baris context.properties = {: membuka tabel properti konteks PipeWire — kumpulan kenop yang dibaca daemon saat dinyalakan.
  2. Baris default.clock.rate = 48000: sample rate graf audio; 48000 Hz adalah bawaan, dan pemilik koleksi musik 44100 Hz kadang menyamakannya agar tidak ada resampling.
  3. Baris default.clock.quantum = 1024: ukuran buffer per siklus pemrosesan; angka kecil memangkas latensi tetapi lebih rawan underrun (suara pecah).
  4. Baris }: menutup blok properti — sintaksnya bergaya dotconf dengan blok bersarang.

Latihan: Meringkas Status Sink #

Data mentah pactl list short sinks berupa baris panjang yang kurang enak dibaca cepat. Skrip cek-audio.sh di bundle chapter ini membaca berkas status bergaya serupa — kolomnya NAMA|KEADAAN|VOLUME|MUTE|DEFAULT — lalu mencetak tabel ringkas beserta peringatannya:

bash
cat > status-audio.txt <<'EOF'
alsa_output.pci-0000_00_1f.3.analog-stereo|RUNNING|65|no|yes
alsa_output.hdmi-stereo|SUSPENDED|0|yes|no
bluez_output.00_1A_7D_DA_71_13.a2dp-sink|IDLE|80|no|no
EOF
bash cek-audio.sh status-audio.txt

Output yang Dihasilkan:

text
SINK                                         VOL   MUTE  DEFAULT
alsa_output.pci-0000_00_1f.3.analog-stereo   65%   no    yes
alsa_output.hdmi-stereo                      0%    yes   no
bluez_output.00_1A_7D_DA_71_13.a2dp-sink     80%   no    no

ringkasan: 3 sink, 1 bermute/ber-volume nol
saran: periksa mute dan volume sink tersebut

Tiga sink terpampang jelas: speaker analog sebagai default, sink HDMI yang bermute, dan headset Bluetooth siap pakai. Dua baris akhirnya menyimpulkan masalah — mari kita bedah isi skripnya:

  1. Baris berkas=${1:-status-audio.txt}: nama berkas status diambil dari argumen pertama, dengan status-audio.txt sebagai bawaan.
  2. Blok if [ ! -f "$berkas" ]: bila berkas tidak ada, skrip menyapa ramah lalu keluar dengan status sukses — bukan menggantung dengan error.
  3. Baris awk -F'|': memecah tiap baris pada tanda pipa menjadi kolom $1 sampai $5.
  4. Blok { printf ... }: mencetak tabel rata sambil menaikkan dua penghitung: total sink serta yang bermute/ber-volume nol.
  5. Blok END: mencetak ringkasan, dan baris saran hanya muncul bila ada yang bermasalah.

Volume dari Terminal dan GUI #

Tiga jalur mengatur volume layak dikenali. Pertama, pactl set-sink-volume @DEFAULT_SINK@ +10% menaikkan volume sink default — @DEFAULT_SINK@ adalah alias perangkat aktif. Kedua, padanannya wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 60%, dengan -l 1.5 membatasi maksimum 150% agar speaker tidak rusak. Ketiga, GUI pavucontrol dan panel Sound di pusat pengaturan menyediakan slider per aplikasi — jalur termudah melihat aplikasi mana yang sedang bersuara.

Perintah lama amixer mengatur volume di sisi ALSA, bukan server, sehingga pada sistem PipeWire ia sering tidak berdampak ke aplikasi modern. Gunakan pactl/wpctl untuk pengaturan harian; amixer cukup sebagai alat diagnosis lapisan kernel.

Bluetooth Audio: A2DP dan HFP #

Headset Bluetooth membawa dua profil yang saling bertukar:

ProfilArah suaraKualitasCocok untuk
A2DPsatu arah, playback sajatinggi, stereomendengarkan musik
HFP/HSPdua arah, mikrofon aktifrendah, teleponpanggilan suara

WirePlumber biasanya berpindah profil otomatis: begitu aplikasi meminta mikrofon, headset turun ke HFP, lalu naik lagi ke A2DP saat panggilan selesai. Ketika musik tiba-tiba terdengar seperti telepon, pactl set-card-profile memaksa profil secara manual — bahasan lengkapnya ada di panduan headset Bluetooth , dan perangkatnya kita susuri di Chapter Bluetooth Management .

Troubleshooting: Tidak Ada Suara #

Keluhan paling sering di forum punya urutan pemeriksaan dari yang termurah ke yang terdalam:

  1. Mute dan volume — cek pactl get-sink-mute @DEFAULT_SINK@ dan pactl get-sink-volume @DEFAULT_SINK@.
  2. Perangkat default — pastikan bintang wpctl status berada di sink yang benar, bukan di HDMI yang diam.
  3. Aliran per aplikasi — tab Playback pavucontrol memperlihatkan aplikasi yang mengarah ke perangkat lama.
  4. Profil kartu — profil yang salah menyembunyikan port speaker; pactl list cards memperlihatkan profil aktifnya.
  5. Server hidup — systemctl --user status pipewire pipewire-pulse wireplumber memastikan ketiganya jalan; log dibaca dengan journalctl --user -u pipewire -u wireplumber seperti teknik di Chapter Monitoring Logs .

Urutan itu menutup mayoritas kasus tanpa menyentuh konfigurasi lanjutan. Perangkat berikutnya yang sering bikin pusing punya pola serupa: headset yang sudah pair tetapi menolak tersambung — kita bongkar alur pairing-nya pada Chapter Bluetooth Management .

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

cek-audio.sh

Unduh berkas
bash
#!/usr/bin/env bash
# cek-audio.sh -- ringkas status perangkat output (sink) dari berkas status
# Pemakaian: bash cek-audio.sh [berkas-status]
# Format baris: NAMA|KEADAAN|VOLUME|MUTE|DEFAULT (satu sink per baris)

berkas=${1:-status-audio.txt}

if [ ! -f "$berkas" ]; then
    echo "lewat: berkas $berkas tidak ditemukan"
    exit 0
fi

awk -F'|' '
    BEGIN {
        printf "%-44s %-5s %-5s %s\n", "SINK", "VOL", "MUTE", "DEFAULT"
    }
    {
        printf "%-44s %-5s %-5s %s\n", $1, $3 "%", $4, $5
        total++
        if ($4 == "yes" || $3 == 0) bermasalah++
    }
    END {
        print ""
        printf "ringkasan: %d sink, %d bermute/ber-volume nol\n", total, bermasalah
        if (bermasalah > 0)
            print "saran: periksa mute dan volume sink tersebut"
    }
' "$berkas"