来自Sir上的一篇文章,原文在这里


[原创][多音频流完整解决方案]让您在Skype的时候看电影,听歌,看flash.......


作者:张乐, 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,以前还是要收钱的。现在虽然个人使用已免费(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)新的。对于很多旧的声卡支持的不是很好,但是支持很多新的声卡连同很多高级的专业的功能,而且具备很强扩展性。可参见http://www.alsa-project.org/alsa-do...cm_plugins.html。现在已是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"
}

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!