ChangLog
2005.04.23 skype我不再用靜態(tài)編譯的了,因為中文字體很難看,而且不能改變。之前segfault可能跟我的輸入法scim有關(guān),現(xiàn)在其實仍然和scim- qtimm有點沖突,不過在啟動腳本里加一句 export QT_IM_MODULE=xim就沒事了。順便說一下,scim其實是不錯的輸入法,沖突是因為之前的gcc編譯器編譯出來的c++程序的ABI不統(tǒng)一(蘇大來看看這樣說對么),現(xiàn)在4.0出來不知道會不會有改觀。
2005.03.27 stardict部分作了點改動,不需要將esound加入default運行級別
2005.03.25 原文發(fā)表于www.linuxsir.org gentoo版
正文 本文試闡述在alsa環(huán)境下多個進(jìn)程共享聲卡的問題以及具體如何通過alsa讓skype和其他程序同時使用聲卡。本文可以看作是筆者的個人經(jīng)驗介紹。同時有些信息翻譯自一些英文資料。筆者的聲卡是AC'97(intel8x0),系統(tǒng)是gentoo, 內(nèi)核2.6.11-nitro0, KDE3.4(split ebuild,arts-3.4.0),alsa-driver, alsa-utils, alsa-oss均為1.0.8,skype是1.0.0.20,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驅(qū)動的問題,請參閱其他資料。實現(xiàn)多音頻還可以使用http://www.opensound.com的商業(yè)驅(qū)動。不過是close-sourced,以前還是要收錢的,F(xiàn)在雖然個人使用已經(jīng)免費(free)了,但總歸是不自由(free)的。好了,閑話少敘,我們來切入正題。
先來看一看一些背景知識
首先要了解Linux有兩種不同的聲音系統(tǒng)OSS (Open Sound System) 舊的.對于44100 Hz, 立體聲(stereo), 16-bit 音頻與一般的聲卡及要求它可以工作的很好. 但不足以勝任專業(yè)級的音頻處理工作。 很多舊的軟件都只能使用OSS。 OSS系統(tǒng)中通常有下列設(shè)備文件/dev/audio /dev/dsp /dev/midi /dev/mixer /dev/music /dev/sequencer等等 ALSA (Advanced Linux Sound Architecture)新的。對于很多舊的聲卡支持的不是很好,但是支持很多新的聲卡以及很多高級的專業(yè)的功能,而且具備很強擴展性。可參見http://www.alsa-project.org/alsa-do...cm_plugins.html,F(xiàn)在已經(jīng)是2.6內(nèi)核的一部分。ALSA音頻系統(tǒng)的設(shè)備文件在/dev/snd下。如果裝了ALSA oss模擬層,也會有/dev/dsp等文件。 人們往往希望多個進(jìn)程能同時使用聲卡。這就需要將多個進(jìn)程的聲音輸入混入一個音頻流的能力,即multiplexing。如果希望使用alsa來達(dá)到這個要求,針對幾種不同情況需要使用不同的技巧。區(qū)分的標(biāo)準(zhǔn)主要在于聲卡/芯片是否支持硬件混音,程序通過alsa庫直接訪問聲卡,還是通過聲音服務(wù)器(即 artsd之類), 還是通過OSS模擬。 如果硬件支持,alsa驅(qū)動支持共享聲卡。在硬件不支持的情況下,alsa庫也支持共享,只不過需要一些配置。對于使用OSS的程序,aoss能夠讓它們使用alsa。最后使用聲音服務(wù)器(arts, esound)的程序,大多數(shù)聲音服務(wù)器能作軟件混音并支持alsa輸出。所有的情況總結(jié)如下:
* 聲卡支持硬件混音 * 聲卡不支持硬件(分三種情況區(qū)別對待)* 程序使用alsa庫來訪問聲卡 * 程序使用聲音服務(wù)器訪問聲卡 * 程序使用OSS API訪問聲卡 如果聲卡支持硬件混音,那么聲卡的共享應(yīng)該不是個問題。
如果聲卡不支持硬件混音但程序使用alsa庫來訪問聲卡,那么可以創(chuàng)建一個允許軟件混音的.asoundrc,放在用戶的宿主目錄下。通過使用dmix (允許多個進(jìn)程使用一個聲卡輸出),dsnoop(允許多個進(jìn)程從一個設(shè)備錄音),asym(將前兩者合并成)來實現(xiàn)。這三者都是alsa的插件。下面有具體的例子。這樣的程序有aplay, arecord,alsaplayer。很多程序通過配置都可以直接使用alsa庫來訪問聲卡,比如mplayer, xmms。這是最理想的情況。開發(fā)比較活躍的自由軟件往往都可以做到。
如果程序使用聲音服務(wù)器,那么可以將聲音服務(wù)器的輸出選擇為alsa,然后就可以了。對于本來不使用聲音服務(wù)器的軟件(這樣的軟件實際上只剩下了使用 OSS來訪問聲卡的,直接使用alsa的不必多此一舉)也可以令它們使用聲音器。以arts為例,執(zhí)行時前面加artsdsp就可以做到這一點。 Skype在筆者這里正是這樣處理的。
如果程序使用OSS API來訪問聲卡,可以在執(zhí)行時前面加上aoss來令它們使用alsa。
小結(jié):上面Linux的程序不能截然分成上面三類,因為很多程序都可以選擇輸出插件,比如xmms。還有,程序能否共享聲卡,跟程序本身有很大關(guān)系,要看它采用什么樣的手段輸出。最好的程序就是可以直接使用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設(shè)備,目的是為了使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/shaoss /opt/RealPlayer/realplay "$@" | 注:gentoo里二進(jìn)制包的軟件,都放在/opt里,不是所有的系統(tǒng)都這么處理。所以不要照抄這一段
firefox(flash plugin): 與上面類似,腳本內(nèi)容為,存為/usr/bin/firefox 代碼:#!/bin/shaoss /usr/libexec/firefox "$@" | 注:這只是為了flash插件,mplayer插件上面設(shè)置完就可以使用dmix了
stardict:稍微麻煩一點,他使用esound(esd)。所以如果讀者使用gentoo的話要先USE=“alsa" emerge media-sound/esound,不需要加入default運行級別 然后修改/etc/esd/esd.conf,在spawn_options最后加上-d default,這樣是為了讓esd使用alsa的default做為音頻設(shè)備 代碼:[esd]auto_spawn=1spawn_options=-terminate -nobeeps -as 2 -d default -r 48000spawn_wait_ms=100 | 。
最后來看看skype 首先我們來通過KDE控制中心來配置一下arts Sound System General: 選擇enable the sound system, run with the highest possible priority(realtime priority) Sound buffer調(diào)節(jié)到92 miliseconds(8 fragments with 2048 bytes) Hardware: 音頻設(shè)備:Advanced Linux Sound Architecture 選擇full duplex , using custom sampling rate: 48000 , Quality: 16 bits
好了,再看skype gentoo中skype裝在/opt/skype下 筆者寫個了個腳本叫skype放在了/usr/bin/下 代碼:#!/bin/shartsdsp -m /opt/skype/skype |
這樣基本上就大功告成了。只是以后使用skype的時候要確保先啟動artsd 先這樣吧,如果有問題以后再補充
最后推薦個好網(wǎng)站 http://alsa.opensrc.org 還有一些連接 http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix http://www.alsa-project.org/alsa-do...cm_plugins.html |
|