來自Sir上的一篇文章,原文在 這里 [原創][多音頻流完整 解決方案 ]讓你在Skype的時候看電影,聽歌,看flash....... 作者:張樂, a.k.a zhllg 本文試闡述在alsa環境下多個進程共享聲卡的問題以及具體如何通過alsa讓skype和其他程序同時使用聲卡。本文可以看
作者:張樂, a.k.a zhllg
本文試闡述在alsa環境下多個進程共享聲卡的問題以及具體如何通過alsa讓skype和其他程序同時使用聲卡。本文可以看作是筆者的個人經驗介紹。同時有些信息翻譯自一些英文資料。筆者的聲卡是AC'97(intel8x0),系統是gentoo,
內核2.6.11-nitro0, KDE3.4(split ebuild,arts-3.4.0),alsa-driver, alsa-utils, alsa-oss均為1.0.8,skype是
www.skype.com上下載的static
binary with Qt 3.2 compiled
in(因為非static的版本在筆者的系統中總是segfault。這個稍微大一點,只有Qt的共享庫是靜態編譯的),mplayer是1.0pre6
-3.4.3-20050110,gaim是1.2.0,
realplayer是10.0.2.608(Gold),xmms是1.2.10,stardict
2.4.4(安裝了WyabdcRealPeopleTTS),flash plugin
版本7.0.25.0。注意本文不涉及如何安裝alsa驅動的問題,請參閱其他資料。實現多音頻還可以使用http:
//www.opensound.com/的商業驅動。不過是close-sourced,以前還是要收錢的?,F在雖然個人使用已經免費(free)了,
但總歸是不自由(free)的。好了,閑話少敘,我們來切入正題。
先來看一看一些背景
知識
首先要了解Linux有兩種不同的聲音系統
* OSS (Open Sound System) 舊的.對于44100 Hz,
立體聲(stereo), 16-bit 音頻與一般的聲卡及要求它可以工作的很好. 但不足以勝任專業級的音頻處理工作。
很多舊的軟件都只能使用OSS。 OSS系統中通常有下列設備文件/dev/audio /dev/dsp /dev/midi /dev/mixer
/dev/music /dev/sequencer等等
* ALSA (Advanced Linux Sound Architecture)新的。對于很多舊的聲卡支持的不是很好,但是支持很多新的聲卡以及很多高級的專業的功能,而且具備很強擴展性??蓞⒁?a target="_blank">http://www.alsa-project.org/alsa-do...cm_plugins.html?,F在已經是2.6內核的一部分。ALSA音頻系統的設備文件在/dev/snd下。如果裝了ALSA oss模擬層,也會有/dev/dsp等文件。
人們往往希望多個進程能同時使用聲卡。這就需要將多個進程的聲音輸入混入一個音頻流的能力,即multiplexing。如果希望使用alsa來達到這個
要求,針對幾種不同情況需要使用不同的技巧。區分的標準主要在于聲卡/芯片是否支持硬件混音,程序通過alsa庫直接訪問聲卡,還是通過聲音
服務器(即
artsd之類), 還是通過OSS模擬。
如果硬件支持,alsa驅動支持共享聲卡。在硬件不支持的情況下,alsa庫也支持共享,只不過需要一些配置。對于使用OSS的程序,aoss能夠讓它們
使用alsa。最后使用聲音服務器(arts, esound)的程序,大多數聲音服務器能作軟件混音并支持alsa輸出。所有的情況總結如下:
* 聲卡支持硬件混音
* 聲卡不支持硬件但是程序使用alsa庫來訪問聲卡
* 程序使用聲音服務器訪問聲卡
* 程序使用OSS API訪問聲卡
如果聲卡支持硬件混音,那么聲卡的共享應該不是個問題。
如果聲卡不支持硬件混音但程序使用alsa庫來訪問聲卡,那么可以創建一個允許軟件混音的.asoundrc,放在用戶的宿主目錄下。通過使用dmix
(允許多個進程使用一個聲卡輸出),dsnoop(允許多個進程從一個設備錄音),asym(將前兩者合并成)來實現。這三者都是alsa的插件。下面有
具體的例子。這樣的程序有aplay,
arecord,alsaplayer。很多程序通過配置都可以直接使用alsa庫來訪問聲卡,比如mplayer,
xmms。這是最理想的情況。
開發比較活躍的自由軟件往往都可以做到。
如果程序使用聲音服務器,那么可以將聲音服務器的輸出選擇為alsa,然后就可以了。對于本來不使用聲音服務器的軟件(這樣的軟件實際上只剩下了使用
OSS來訪問聲卡的,直接使用alsa的不必多此一舉)也可以令它們使用聲音器。以arts為例,執行時前面加artsdsp就可以做到這一點。
Skype在筆者這里正是這樣處理的。
如果程序使用OSS API來訪問聲卡,可以在執行時前面加上aoss來令它們使用alsa。
小結:上面Linux的程序不能截然分成上面三類,因為很多程序都可以選擇輸出插件,比如xmms。還有,程序能否共享聲卡,跟程序本身有很大關系,要看它采用什么樣的手段輸出。最好的程序就是可以直接使用alsa的了。
下面來看具體該怎么樣做
首先要有一個合理配置的.asoundrc,這個是筆者的
代碼:
pcm.!dmix { type dmix ipc_key 5678293 ipc_key_add_uid yes slave { pcm "hw:0,0" period_time 0 period_size 2048 buffer_size 16384 format S16_LE rate 48000 } } pcm.!dsnoop { type dsnoop ipc_key 5778293 ipc_key_add_uid yes slave { pcm "hw:0,0" period_time 0 period_size 2048 buffer_size 16384 format S16_LE rate 48000 } }
pcm.asymed { type asym playback.pcm "dmix" capture.pcm "dsnoop" }
pcm.!default { type plug slave.pcm "asymed" }
pcm.dsp0 { type plug slave.pcm "asymed" }
ctl.mixer0 { type hw card 0 }
|
pcm.!dmix, pcm.!dsnoop, pcm.!default是分別重新定義dmix,dsnoop插件,以及default設備,目的是為了使skype更好的工作。
下面的pcm.dsp0, ctl.mixer0是為了使用aoss的程序。
先講講怎么樣使一些常見的程序都能夠使用alsa的dmix混音
mplayer: 在/etc/mplayer.conf中修改ao
ao="alsa:device=dmix"
xmms: options->preferences->output plugin選擇alsa output plugin,并配置,audio device填入dmix
gaim: preferences->interface->sounds->sounds method, Method選擇command, sound command填入“aplay -D plug:dmix %s”
這些都是比較alsa friendly的,下面看其他的一些
realplay: 使用aoss, 寫個腳本把真正的realplay包起來,將腳本mv為/usr/bin/realplay
代碼:
#!/bin/sh aoss /opt/RealPlayer/realplay "$@"
|
注:gentoo里二進制包的軟件,都放在/opt里,不是所有的系統都這么處理。所以不要照抄這一段
firefox(flash plugin): 與上面類似,腳本內容為,存為/usr/bin/firefox
代碼:
#!/bin/sh aoss /usr/libexec/firefox "$@"
|
注:這只是為了flash插件,mplayer插件上面設置完就可以使用dmix了
stardict:稍微麻煩一點,他使用esound(esd)。所以如果讀者使用gentoo的話要先USE=“alsa" emerge media-sound/esound,然后rc-update add esound default
然后修改/etc/esd/esd.conf,在spawn_options最后加上-d default
代碼:
[esd] auto_spawn=1 spawn_options=-terminate -nobeeps -as 2 -d default spawn_wait_ms=100
|
注:stardict在剛開機的時候不行,關掉stardict再開己可以了,只需要一次。
最后來看看skype
首先我們來通過KDE控制中心來配置一下arts
Sound System
General: 選擇enable the sound system, run with the highest possible priority(realtime priority)
Sound buffer調節到92 miliseconds(8 fragments with 2048 bytes)
Hardware: 音頻設備:Advanced Linux Sound Architecture
選擇full duplex , using custom sampling rate: 48000 , Quality: 16 bits
好了,再看skype
gentoo中skype裝在/opt/skype下
筆者寫個了個腳本叫skype放在了/usr/bin/下
代碼:
#!/bin/sh artsdsp -m /opt/skype/skype
|
這樣基本上就大功告成了。只是以后使用skype的時候要確保先啟動artsd
先這樣吧,如果有問題以后再補充
最后推薦個好網站
http://alsa.opensrc.org
還有一些連接
http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix
http://www.alsa-project.org/alsa-do...cm_plugins.html