原文地址 http://www.alsa-project.org/main/index.php/Asoundrc
Why asoundrc?
.asoundrc和asound.conf對於ALSA能供正確工作不是必需的。大部分應用都可以在沒有他們的情況下正常運行。這兩個檔案用來提供特定的額外功能,比如在alsa-lig層進行路由和採樣率轉換。
The .asoundrc file
這個檔案為你提供更多對card/device的進階控制。.asoundrc檔案包含各種卡的定義,使得你可以在alsa-lib層訪問pcm plugins。允許你做很多神奇的事情:比如把多塊卡合為一塊,或者訪問多通道卡的多個I/Os
Where does asoundrc live?
asoundrc檔案一般存放在使用者home目錄下
~/.asoundrc
從下面這個檔案包含進來
/usr/share/alsa/alsa.conf
當然也可以使用對所有使用者生效的設定檔
/etc/asound.conf
當啟動一個alsa應用時,這兩個設定檔都會被載入。
下面是最基本的配置定義。
The default plugin
在目前使用者的home目錄下建立一個.asoundrc檔案
vi ~/.asoundrc
寫入如下內容,並儲存檔案
pcm.!default { type hw card 0}ctl.!default { type hw card 0}
關鍵詞default在ALSA lib API中定義為hw:0,0(預設音效卡的預設裝置)。標識 “!default”將覆蓋ALSA lib API中定義的default
現在你可以測試如下:
aplay -D default test.wav
The naming of PCM devices
一個典型的asoundrc以'PCM hw type'開始。這使得ALSA應用可以通過一個名字訪問虛擬音效卡裝置(plugin或者slave)。如果沒有它,那麼我們必須通過hw:0,0或者default這種形式來訪問soundcard(s)/device(s),如下
aplay -D hw:0,0 test.wav
關鍵字hw後面的兩個數字表示音效卡號和裝置號。
第一項通常從0開始。比如ALSA中pcm 裝置(物理I/O channels)的表示方法,從pcm0c(capture)和pcm0p(playback)開始
The Control device
一塊卡的控制裝置使得我們可以編程修改卡的各種控制。對於大部分卡都包括mixer(但是有些卡沒有mixer)。然而,他們仍然有其他的控制可能被像JACK這樣的程式訪問。比如digital I/O sync 指標,sample clock source switch 等等。
Aliases
使用”PCM hw type“ 還可以定義裝置別名。文法如下:
pcm.NAME { type hw card INT/STR [device] INT [subdevice] INT mmap_emulation BOOL}
例如,下面給出第一個音效卡的別名
pcm.primary { type hw card 0 device 0}
現在你可以通過別名primary 訪問第一個音效卡。
aplay -D primary test.wav
Plugins
Q: 什麼是plugins
A: 在ALSA中,PCM plugins擴充了PCM裝置的功能和features。plugin可以自動的不可思議的執行工作,比如命名裝置,採樣率轉換,通道間的採樣複製,寫入檔案,聯合多個音效卡/裝置做多inputs/outputs。使用多通道音效卡/裝置以及其他功能等著你去發掘。使用這些plugins,你需要建立一個虛擬slave裝置。
plugins和選項的完整列表,參照alsa-lib documentation。下面是簡單介紹。
一個非常簡單的slave定義如下
pcm_slave.sltest { pcm "hw:1,0"}
這裡定義了一個slave。這裡僅僅定義了你的聲音裝置的一個別名。稍微難以理解的是 'pcm types'參數必須定義在slave-definition-block。讓我們先設定一個rate-converter
pcm_slave.sl2 { pcm "hw:0,0" rate 48000}pcm.rate_convert { type rate slave sl2}
在play時將自動的轉換採樣率到44.1kHz。雖然這個功能並不是很實用,因為大部分players會轉換到音效卡支援的採樣轉換率,但是有時你可能想把採樣率轉換為較低的靜態採樣率。
為了方便,我們可以重寫未如下嵌套定義
pcm.rate_convert { type rate slave { pcm "hw:0,0" rate 48000 }}
使用pcm type plug 可以產生一個更複雜的轉換工具,文法如下
type plug #format adjusted PCMslave STR #slave name# orslave { pcm STR #dslave definition #or pcm {} #slave pcm definition [format STR] #slave format [channel INT] [rate INT]}route policy STRttable { CCHANNEL { SCHANNEL REAL }}
我們可以定義一個complex_convert如下:
pcm_slave.sl3 { pcm "hw:0,0" format S16_LE channels 1 rate 16000}pcm.complex_convert { type plug slave sl3}
調用方是如下
aplay -vD complex_convert test.wav
在播放的時候你將轉換為採樣格式:S16_LE,1 channel和16kHz採樣。使用-v選項調用aplay可以顯示檔案的原始設定。
Software mixing
軟體混音可以在同一個裝置上同時播放多個音效檔。在linux環境中有很多方法可以執行軟體混音。通常需要一個server,比如ARTSD,ESD,JACK..等等,這個列表會很長因此應用經常困惑該使用哪一個
dmix
現在ALSA有了一個叫dmix(direct mixing)的本地plugin。它使得軟體混音變得非常簡單,不需要再為安裝或者卸載新應用而煩惱。
這個plugin有個非常有意思並且可能很有用的功能,它和default plugin名結合到一塊。理論上意味著所有的本地應用都共用聲音裝置。雖然實際上沒有多少applications會利用這個功能。
pcm.!default { type plug slave.pcm "dmixer"}pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:0,0" period_time 0 period_size 1024 buffer_size 4096 rate 44100 } bindings { 0 0 1 1 }}ctl.dmixer { type hw card 0}
試著播放如下:
aplay -f cd -D default test.
注意,dmix PCM name已經在全域設定檔/usr/share/alsa/alsa.conf中定義了
這個裝置預設的採樣率是48000Hz,可以用如下方式改變:
aplay -D "plug:'dmix:RATE=44100'" test.wav
dsnoop
dmix plugin是把多個輸出資料流混音到一起。如果你想要使用多個input,那麼使用dsnoop plugin
JACK plugin
VIrtual multi channel devices