Linux (Ubuntu) 的音效架構

筆電內建麥克風一直不能用的的問題困擾了我許久,爲了這個問題我已經總共耗費掉不下10小時,前幾天我下定決心,既然之前亂槍打鳥都沒辦法解決問題,乾脆就趁這次把 Linux 的音效架構弄清楚。這篇是(稍微)瞭解 Linux 音效架構之後所做的筆記。

在現代的 Linux 當中,音效的處理主要經過4層架構,通常 kernel 和應用程式比較難去改變,因此本文着重說明 ALSA 和 PulseAudio :

  1. 硬體 (Kernel)
  2. ALSA: ALSA 負責比較低階的溝通工作,如辨識音效卡以載入正確驅動模組、辨識晶片、低階硬體資訊(如取樣率)、辨識插孔(普通 3.5mm 的插孔、SPDIF)、偵測插孔的拔插
  3. PulseAudio: 在比較高階的地方整合各應用程式所要輸入、輸出的音訊,並進行混音(好像某些情況下混音是由 ALSA 操控混音晶片負責?)。可以將它視爲音訊 proxy ,夾在應用程式與 ALSA 之間。他也可以將音訊轉送至網路給遠端的 PulseAudio 負責輸出。應用程式若要進行音訊輸入/輸出都會先連接到 PulseAudio ,所以 PulseAudio 能夠個別控制每個音訊輸入/輸出程式的音量。Ubuntu 預設的音量調整就是去調整 PulseAudio 的音量。(PulseAudio 的音量會與 ALSA 的聯動,這我不是非常清楚)
  4. 應用程式

介紹一些術語:

  • 混音 Mix:將來自不同音源的音訊疊加在一起輸出至喇叭
  • 混音器等級:基本上就是音量的意思
  • 立體聲 Stereo :應該就是2聲道的意思(左聲道與右聲道)
  • 單聲道 Mono :大部分麥克風都是單聲道
  • PCM : http://alsa.opensrc.org/Pcm-device
  • 接頭 Connector :在美國常稱爲 jack ,就是指一個插孔
  • 音效卡 Sound card :大部分電腦的音效卡已經與南橋整合,所以音效卡型號基本上就是南橋型號
  • 音效晶片 Sound chip :實際負責音效的晶片,內建 CODEC 功能
  • CODEC :數位訊號(電腦或其他數位裝置)與類比訊號(喇叭、麥克風)的轉換
  • AC‘97 : 我一直以爲這是音效卡的型號,原來他是 Intel 訂定的音效卡規範
  • HDA (High Definition Audio) : 也是 Intel 訂定的規範,取代了 AC97
  • Sink : Pulseudio 當中一個輸入或一個輸出稱作一個 sink

參考:http://alsa.opensrc.org/Sound_Cards:_Introduction

ALSA 需要載入各種 kernel module 以正確運作,module 的選項有時也會影響,modprobe -l 列出目前所載入的 kernel module ,其中 snd 開頭的就是音效相關模組。如果你的音效(輸入和輸出)完全不能用,調整 /etc/modprobe.d/alsa-base.conf 這一行的 model 選項說不定可以修好(這應該只對 Intel 南橋有用)

options snd-hda-intel model=acer enable=1 index=0

設定值的清單

我遇到的狀況是調成 acer 之後音效輸入和輸出就都能用了。

奇怪的是 Google Hangout 和 Skype 的音效輸入卻都不能用,儘管 gnome-sound-recorder 完全正常。

arecord -f dat -r 96000 -D hw:0,0 /tmp/test.wav
這行指令是直接從 ALSA 進行錄音,跳過 PulseAudio ,所以可以判別 ALSA 是否能夠收到聲音。其中 -r 是取樣率,如果設定錯誤的話它會警告「警告:速率不準確 (需要的是 60000Hz,現在的是 96000Hz)」,後面的那個 96000Hz 纔是正確你的設備支援的速率(中文翻譯怪怪的 Orz),-D hw:0,0 是指定要從哪一個裝置錄音,可以用 arecord --list-devices 取得正確的硬體編號。

parec -d alsa_input.pci-0000_00_1b.0.analog-stereo | sox -t raw -r 44k -sLb 16 -c 2 - /tmp/test1.wav
則是從 PulseAudio 錄音,裝置 (sink) 是 alsa_input.pci-0000_00_1b.0.analog-stereo (從名稱可以看出來訊號來源是來自 ALSA),要從哪一個裝置錄音呢?用 pactl list 看,要找的是 Source #1 這種的段落,裏面的名稱就是了,不要找結尾有 .monitor 的。

alsamixer 可以調整 ALSA 所有裝置的音量

pavucontrol 可以調整 PulseAudio 所有裝置的音量,他的設定值會影響 alsamixer

後來 G+ 和 Skype 麥克風不能用的問題是用神奇的方法解決掉了…

很多相關問題的除錯參考資料:

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s