Linux 核心內建聲音架構為 ALSA(Advanced Linux Sound Architecture),支援絕大多數消費級聲晶片。若發音異常,通常需手動編譯最新 ALSA 驅動或調整模組參數。
| 架構 | 晶片型號 | ALSA 模組名稱 |
|---|---|---|
| AC'97 | ALC100, ALC100P, ALC200, ALC200P, ALC650D, ALC650E, ALC650F, ALC650, ALC655, ALC653, ALC658, ALC658D, ALC850, ALC101, ALC202, ALC250, ALC203 | snd-intel8x0(Intel ICH)、snd-via82xx(VIA)、snd-atiixp(ATI) |
| HD Audio | ALC260, ALC262, ALC660, ALC861, ALC880, ALC882, ALC883, ALC885, ALC888 | snd-hda-intel(Intel/AMD 通用) |
完整支援清單請參考 /usr/src/alsa-driver-*/doc/ 或 ALSA 專案官網。
ALSA 分為三個獨立原始碼套件,須依序編譯安裝:
sudo apt install build-essential linux-headers-$(uname -r)
wget ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.9.tar.bz2
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.9.tar.bz2
wget ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.9.tar.bz2
tar xjf alsa-driver-1.0.9.tar.bz2
tar xjf alsa-lib-1.0.9.tar.bz2
tar xjf alsa-utils-1.0.9.tar.bz2
cd alsa-driver-1.0.9
./configure --with-kernel=/usr/src/linux-headers-$(uname -r) --with-cards=hda-intel # 指定晶片,all 為全部
make
sudo make install
sudo ./snddevices # 建立 /dev/snd/* 裝置節點
常見錯誤:unresolved symbol schedule_work
解決:
touch include/linux/workqueue.h
make clean && make && sudo make install
cd ../alsa-lib-1.0.9
./configure
make
sudo make install
cd ../alsa-utils-1.0.9
./configure
make
sudo make install
sudo modprobe snd-hda-intel # Intel HD Audio
# 或
sudo modprobe snd-intel8x0 # AC'97 Intel ICH
# 或
sudo alsaconf # 互動式偵測設定
sudo modprobe snd-pcm-oss
sudo modprobe snd-mixer-oss
sudo modprobe snd-seq-oss
speaker-test -c2 -twav # 白噪音測試左右聲道
# 或播放 MP3
sudo apt install mpg123
mpg123 /path/to/test.mp3
alsamixer # 文字介面調整,M 鍵切換靜音
sudo alsactl store # 將目前設定寫入 /var/lib/alsa/asound.state
echo "snd-hda-intel" | sudo tee -a /etc/modules
echo "snd-pcm-oss" | sudo tee -a /etc/modules
大多數發行版已內建 alsa-restore.service 開機自動還原 alsactl store 的設定,無需額外設定。
sudo vi /etc/rc.local
# 在 exit 0 前加入
alsactl restore
建立 /etc/modprobe.d/alsa.conf:
# 針對 ALC880/882/883/885/888 等 HD Audio 晶片
options snd-hda-intel model=auto
# 或指定具體模型(參考 Documentation/sound/alsa/HD-Audio-Models.txt)
# options snd-hda-intel model=3stack-6ch
# 針對 AC'97 晶片
options snd-intel8x0 ac97_clock=48000
lsmod | grep sndls -l /dev/snd/dmesg | grep -i audio 是否有錯誤訊息。alsamixer 確認未靜音、音量非零。model= 參數(HD Audio 常見)。