当前位置: 首页 > 操作系统 > Linux > 正文

Linux的声音系统

时间:2008-06-05 windrose

从Linux控制台唤起你注意的简单的“丁”声,到DVD的环绕声,今天音频已成为桌面计算的重要部分。确实有许多计算机用户不需要声音,但是声音能够为许多计算机任务增色。正是如此,音频硬件已经成为一个几乎所有主板和操作系统,也包括大多数Linux发行版,的通用部件。

不幸的是,配置Linux的声音是一项让人头疼的事。在Linux中,有3套音频驱动,使用着两种不同的API。在这些驱动之上,还有几种支持库,目的是让程序员的日子好过一点,但对最终用户增加了配置的复杂性。实际上,对于一个普通用户,让系统发声会成为一项令人沮丧的经验。假如某个发行版没有正确地配置好声音,最终用户面对的将是寻找、安装和调试各种模棱两可、没有完善文档的设置选项。

作为对Linux声音系统的调查,让我们从对声音架构的总体认识开始。了解多种音频流如何混在一起同步发声也正日益重要。在这些话题的基础上,对于特定驱动的认识就显得很必要。声音设备文件以及它们的权限经常是发生问题的根源,所以我们也会谈到这个话题。此外,支持声音的库文件既可以是祝福也可以是诅咒,所以了解它们也很有帮助。在文章的结尾,当掌握了前面的基础知识,你可以测试和使用声音工具,并且设置常见发声程序的选项。

理想化地说,音频应用程序应该是直接了当的:发出一个命令或点击一个按钮,就可以听见预期中的声音。在这个情形的背后,Linux采用了几种层次的工具来发声,如图1所示。

声音数据在某个应用程序和声卡之间准确的传输路径,取决于该程序以及系统的整体配置,会有极大的差异。由于这个原因,追踪声音的问题也就非常困难。到底问题是出在硬件损坏、驱动程序的编程错误、库文件的错误配置、应用程序出错还是这些问题之间的相互作用呢?

如图1所示,声音库和应用程序都可以直接和声音驱动程序打交道或者依赖于其他的库。有些应用程序和库提供了多种选择:它们既可以直接使用驱动程序也可以通过其他的库来做。虽然图1还不很完备(还有数十个小的声音支持库),但已经涉及了许多最常用的工具和库,包括:

声音硬件 - 尽管在图1中只显示成一项,实际上有许多不同种类的声音硬件。如果没有支持你的硬件的Linux驱动程序,你可能该买个新的硬件。

OSS - 2.4.x版内核系列中,OSS的开源版本是标准的Linux音频驱动。4Front Technologies (http://www.opensound.com)公司还提供商业版。对于软件来说,标准的内核OSS驱动和商业版OSS驱动没什么不同。多数Linux库和发声工具都支持OSS。尽管2.6.x版本的内核中还包含OSS,但是它们已经正式被ALSA所取代。

ALSA - 高级Linux声音架构(ALSA,http://www.alsa-project.org)是OSS的替代方案。ALSA既兼容OSS,又提供了新的音频界面方法。ALSA作为2.6.x内核的标准配备,也能在编译成用在以往的内核上的模块。

ESOUND - EsounD是一个库以及后台服务,目的是无论使用OSS还是ALSA,它都为Linux音频系统提供一个统一的界面。EsounD还提供了一些底层驱动程序所没有提供的额外特性,例如支持多音频流同时发声(这个库有时也叫做esd)。

POLYPAUDIO - 这个库是意图取代EsounD的不速之客。

ARTS - aRts(http://www.arts-project.org)与KDE相联系的声音库。它能用EsounD、ALSA或OSS作为输出。你通过与之关联的后台服务使用aRts来产生对网络传输透明的声音,对于使用网络瘦终端来说会很方便。

SDL - SDL(http://www.libsdl.org)是一个游戏开发者常用的跨平台的多媒体库,它经常用名为libsdl的包安装在Linux系统中,它可以依赖于多种其它的库或者直接和声音驱动打交道。

声音应用程序 - 最终你的兴趣在于使用声音应用程序,例如XMMS(http://www.xmms.org)。这些程序可能直接用到一种或多种的音频驱动,可能依赖于某个库,或者给你提供几种选择。

处理多音频流

Linux声音系统的一个烦人的方面在于处理多音频流。传统上,Linux声音系统是单线程的:如果某个程序在发声,别的程序就不能发声了。在某些情况下,这样会产生问题。

例如,假设你设置了让email软件在有新邮件到达时发声。如果你正在听一个OGG文件而有邮件来了,邮件程序将不能发出新邮件到达的提示声。随着越来越多的简单程序具备了发声功能,这种限制成为一个越来越严重的问题。

解决这个问题有两个办法:为音频驱动添加多线程支持和为音频库添加多音频支持。可以认为,为音频驱动添加多线程支持是最好的办法,因为直接使用音频驱动的程序无须修改。如果你的所有程序都使用同样的库,用库文件来处理这个问题则更快速,但是只要有一个程序是直接使用音频驱动的,这个好处就非常受限制了。

今天,许多ALSA驱动支持多音频流。然而,这种支持在一定程度上取决于音频硬件。同时,ALSA的OSS模拟对多音频流没有支持──使用OSS的程序享受不到这种好处,除非它想和使用了ALSA的其它程序竞争。OSS也采用了一些多线程的支持(常被称为多线程OSS)。EsounD、aRts和一些其它库也支持多线程发声。

从实用上说,你应该尽可能多地采用多线程的选择。假如一个程序能让你选择使用多线程的库还是直接使用不支持多线程的驱动,那么在所有可能情况下应选择用库。假如你可以在ALSA和OSS之间选择,而你的ALSA驱动支持多线程,则使用ALSA驱动。你可能无法设置每个程序都使用多线程的方案,但是你很可能能把大多数频繁使用声音的程序设置成多线程的。