系统攻略:全方位接触 Linux的声音系统

范堡 发布于 2009/05/08 10:46
阅读 1K+
收藏 0

从Linux控制台唤起你注意的简单的“丁”声,到DVD的环绕声,今天音频已成为桌面计算的重要部分。确实有许多计算机用户不需要声音,但是声音能够为许多计算机任务增色。正是如此,音频硬件已经成为一个几乎所有主板和操作系统,也包括大多数Linux发行版,的通用部件。
不幸的是,配置Linux的声音是一项让人头疼的事。在Linux中,有3套音频驱动,使用着两种不同的API。在这些驱动之上,还有几种支持库,目的是让程序员的日子好过一点,但对最终用户增加了配置的复杂性。实际上,对于一个普通用户,让系统发声会成为一项令人沮丧的经验。假如某个发行版没有正确地配置好声音,最终用户面对的将是寻找、安装和调试各种模棱两可、没有完善文档的设置选项。
作为对Linux声音系统的调查,让我们从对声音架构的总体认识开始。了解多种音频流如何混在一起同步发声也正日益重要。在这些话题的基础上,对于特定驱动的认识就显得很必要。声音设备文件以及它们的权限经常是发生问题的根源,所以我们也会谈到这个话题。此外,支持声音的库文件既可以是祝福也可以是诅咒,所以了解它们也很有帮助。在文章的结尾,当掌握了前面的基础知识,你可以测试和使用声音工具,并且设置常见发声程序的选项。
理想化地说,音频应用程序应该是直接了当的:发出一个命令或点击一个按钮,就可以听见预期中的声音。在这个情形的背后,Linux采用了几种层次的工具来发声,如图1所示。
声音数据在某个应用程序和声卡之间准确的传输路径,取决于该程序以及系统的整体配置,会有极大的差异。由于这个原因,追踪声音的问题也就非常困难。到底问题是出在硬件损坏、驱动程序的编程错误、库文件的错误配置、应用程序出错还是这些问题之间的相互作用呢?
声音库和应用程序都可以直接和声音驱动程序打交道或者依赖于其他的库。有些应用程序和库提供了多种选择:它们既可以直接使用驱动程序也可以通过其他的库来做。虽然图1还不很完备(还有数十个小的声音支持库),但已经涉及了许多最常用的工具和库,包括:
声音硬件 - 尽管在图1中只显示成一项,实际上有许多不同种类的声音硬件。如果没有支持你的硬件的Linux驱动程序,你可能该买个新的硬件。
OSS - 2.4.x版内核系列中,OSS的开源版本是标准的Linux音频驱动。4Front Technologies公司还提供商业版。对于软件来说,标准的内核OSS驱动和商业版OSS驱动没什么不同。多数Linux库和发声工具都支持OSS。尽管2.6.x版本的内核中还包含OSS,但是它们已经正式被ALSA所取代。
ALSA - 高级Linux声音架构是OSS的替代方案。ALSA既兼容OSS,又提供了新的音频界面方法。ALSA作为2.6.x内核的标准配备,也能在编译成用在以往的内核上的模块。
ESOUND - EsounD是一个库以及后台服务,目的是无论使用OSS还是ALSA,它都为Linux音频系统提供一个统一的界面。EsounD还提供了一些底层驱动程序所没有提供的额外特性,例如支持多音频流同时发声(这个库有时也叫做esd)。
POLYPAUDIO - 这个库是意图取代EsounD的不速之客。
ARTS - aRts与KDE相联系的声音库。它能用EsounD、ALSA或OSS作为输出。你通过与之关联的后台服务使用aRts来产生对网络传输透明的声音,对于使用网络瘦终端来说会很方便。
SDL - SDL是一个游戏开发者常用的跨平台的多媒体库,它经常用名为libsdl的包安装在Linux系统中,它可以依赖于多种其它的库或者直接和声音驱动打交道。
声音应用程序 - 最终你的兴趣在于使用声音应用程序,例如XMMS。这些程序可能直接用到一种或多种的音频驱动,可能依赖于某个库,或者给你提供几种选择。
处理多音频流
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组),你可以把用户添加进去;或者把设备文件的所有权改成当前登录用户。前者会在用户远程登录并使用声音应用程序时产生冲突,而后者会在系统有多个用户登录时出问题(例如,你特地用多个用户名登录)。

加载中
返回顶部
顶部