扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
处理多音频流
Linux声音系统的一个烦人的方面在于处理多音频流。传统上,Linux声音系统是单线程的:如果某个程序在发声,别的程序就不能发声了。在某些情况下,这样会产生问题。
例如,假设你设置了让email软件在有新邮件到达时发声。如果你正在听一个OGG文件而有邮件来了,邮件程序将不能发出新邮件到达的提示声。随着越来越多的简单程序具备了发声功能,这种限制成为一个越来越严重的问题。
解决这个问题有两个办法:为音频驱动添加多线程支持和为音频库添加多音频支持。可以认为,为音频驱动添加多线程支持是最好的办法,因为直接使用音频驱动的程序无须修改。如果你的所有程序都使用同样的库,用库文件来处理这个问题则更快速,但是只要有一个程序是直接使用音频驱动的,这个好处就非常受限制了。
今天,许多ALSA驱动支持多音频流。然而,这种支持在一定程度上取决于音频硬件。同时,ALSA的OSS模拟对多音频流没有支持──使用OSS的程序享受不到这种好处,除非它想和使用了ALSA的其它程序竞争。OSS也采用了一些多线程的支持(常被称为多线程OSS)。EsounD、aRts和一些其它库也支持多线程发声。
从实用上说,你应该尽可能多地采用多线程的选择。假如一个程序能让你选择使用多线程的库还是直接使用不支持多线程的驱动,那么在所有可能情况下应选择用库。假如你可以在ALSA和OSS之间选择,而你的ALSA驱动支持多线程,则使用ALSA驱动。你可能无法设置每个程序都使用多线程的方案,但是你很可能能把大多数频繁使用声音的程序设置成多线程的。
启动驱动程序
驱动程序代表着Linux声音系统的核心。因此,编译和安装驱动是至关重要的。不幸的是,这个任务有时候看起来像是巫术。Linux的音频驱动是出了名的难伺候。在驱动程序层面的出问题的原因包括选错了驱动、不同种类驱动(ALSA和OSS)之间的相互干扰以及用了错误的驱动程序(通过错误的声音设备文件,很快会谈这个话题)。
首先你必须决定是采用ALSA驱动、内核OSS驱动还是商业版OSS驱动。为此,你应该在有关网站或使用内核配置工具查看你的硬件兼容性。假如你的硬件有多种驱动的支持,你得逐一测试以找出最好的那个。但是要小心 -- 如果你试图同时直接把两种驱动加载到内核,最多只能是其中之一能够工作。要想逐个尝试,你需要编译两个内核或者把驱动编译成模块,这样就可以随你的意愿加载或卸载了。
假如你的系统已经有了基本的声音,最好不要改变配置,除非真有这个必要(例如,你因为别的原因需要重新编译内核)。
当挑选需编译的驱动时,选择“Device Drivers, Sound, Sound Card Support”这一选项。然后,在ALSA或OSS之间作出抉择并设定选项。
通常情况下,把声音驱动直接编译进内核比把它们编译成模块要容易得多,但是编译成模块会更有灵活性,因为你可以随意加载或卸载。编译ALSA模块时,要选择OSS兼容的选项(对于mixer功能和PCM功能都要选),因为许多程序编程时是直接使用OSS设备的,如果你不包含兼容层,它们将不能工作。假如你想使用商业的OSS驱动,你必须在内核设定基本的OSS支持,但是不要选择把你的声卡驱动编译进内核(最多只是把它编译成模块)。
一旦你重新编译了内核并用新内核重新启动之后,声音可能正常也可能不正常工作,这取决于你设的选项是否准确。如果你把关键功能编译成了模块,你需要加载它们。你可以用常用的命令,例如modprobe做到这一点。然而有些驱动需要在加载时设置特定的参数,ALSA就常有这种情况。请在ALSA网站查看详情,每种声卡都有所不同。典型情况是,你必须把几行alias命令加入到 /etc/modules.conf 文件中去。
声音设备文件
许多Linux驱动允许程序通过读写设备文件来使用硬件,这些文件存在 /dev 目录和子目录里。对于音频设备也是如此。不使用库文件的程序会直接使用设备文件,而使用了库文件的程序通过库文件间接地使用设备文件。
表1概括了对应OSS和ALSA的最重要的音频文件。这些设备文件依据它们的用途分属于几个范畴。(多数文件名以0或C0D0结尾。当你有多个声卡时,这些数字会变化,有些情形下会完全省略掉。)
表1: 重要的音频设备文件
设备类型 OSS ALSA
数字取样 /dev/dsp0 /dev/snd/pcmC0D0
Sun音频兼容性 /dev/audio0 N/A
混音器 /dev/mixer0 /dev/snd/mixerC0D0
高层音序器(high-level sequencer) /dev/music0 N/A
低层音序器(low-level sequencer) /dev/midi0 N/A
声音状态 /dev/sndstat N/A
控制文件 N/A /dev/snd/controlC0
对于大多数功能来说,最重要的文件是处理数字音频的输入和输出的数字取样文件,以及使调音程序能够控制音量的混音器文件。Sun音频兼容性提供了与Sun工作站兼容的界面,对应于一些非常老的程序。音序器(sequencer)文件使你能播放MIDI文件,但不是所有的驱动都支持这个特性。状态和控制文件给声卡提供了信息和控制的界面。
早期版本的ALSA要求你运行一个叫snddevices的脚本来产生声音设备文件。这些文件在后期版本的ALSA应该是自动生成的,或者应该在多数现行的Linux发行版中默认建立。
尽管如此,假如你找不到适当的声音设备文件,你应该找找snddevices脚本并运行一下。
有个重要的细节是,打算使用声音应用程序的用户必须对设备文件有读和写的权限,至少对OSS风格的访问有这种权限。多数Linux发行版用两种途径之一来处理这个问题:或者提供一个具有写权限的组(例如audio或sound组),你可以把用户添加进去;或者把设备文件的所有权改成当前登录用户。前者会在用户远程登录并使用声音应用程序时产生冲突,而后者会在系统有多个用户登录时出问题(例如,你特地用多个用户名登录)。 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者