Linux音频系统存在一个问题,这不仅仅是偶尔无法工作而已。真正的问题在于它过于繁杂了。

如果你坐下来在一张纸上试着画出那些在从一个音乐文件中读取音频信息,再从你的扬声器中播放出来这一过程中所用到的技术之间的关系的话,你就会很清楚地看到它就像打结的意大利面一样乱了。

这个问题的原因在于音频处理从本质上就要比其他的技术更复杂。声音从某个地方输入你的Linux电脑,又从另一个地方输出。如果我们画出一个用来描述将你的电脑和网络上其他的电脑连接起来的网络架构的OSI模型,我们看到的是分明的层次,每一层都有它自己的进程作用域和功能。

层与层之间很少有重合,因此你绝对不会碰到在第7层的最终用户进程和在第1层的原始比特流的电子脉冲相混淆的情况。

然而这种情况恰恰在Linux音频架构中存在。这个架构中甚至没有一个明确定义的最底层,各种音频技术在内核和你的硬件里各自为政。

和网络模型相比,Linux的音频结构更像是地壳,较低的层偶尔会爆发到表面,引发混乱痛苦,而较高的表面发生移动,取代原本是隐藏的根本技术。

比如Open Sound协议原本应该在内核层直接和你的硬件对话,但现在成了一个建立在ALSA上的复杂层。ALSA本身有一个内核层的堆栈和一个给程序员使用的更高级的API,用以将驱动程序和硬件属性配合起来播放环绕立体声或者处理MP3编码。

当大部分发行版把PulseAudio和GStreamer置于顶层时,你最终就得到了一个会发生像San Andreas错误这样的潜在破坏的不稳定的混乱系统。

ALSA 
输入: PulseAudio, Jack, GStreamer, Xine, SDL, ESD 
输出: Hardware, OSS

Maria von Trapp说过:“我们从最原始的地方开始吧。”要说起现代Linux音频,最原始的就是高级Linux声音结构,简称ALSA。

它和Linux内核挂接,为系统的其他部分提供音频功能。但它远远要比普通的内核驱动程序更有野心:它可以混合、对其它层提供兼容性、为程序员提供API,并且如同Windows和OS X平台的ASIO和CoreAudio一样作为一个非常底层而稳定的后台程序来运行。

ALSA本来是被设计用于取代OSS的。然而,多亏了ALSA的一个设计用于运行较老的只支持OSS的应用程序的兼容层,OSS并没有灭绝。把ALSA看成一个Linux声音系统的一个设备驱动层是最简便的方法。

你的音频硬件需要一个以“snd_”为前缀的交互式内核模块,而且必需能在任何事情发生时被加载运行。这就是你需要ALSA内核驱动来播放你系统会发出的任何声音,以及在有人想到发明一个这样的驱动程序之前你的笔记本沉默了这么久的原因。

幸运的是,大部分发行版都能自动设置你的设备和模块。ALSA负责把你的音频硬件的功能翻译给软件API,你的系统的其他部分通过它来操作声音。它被设计用于处理OSS(和当时其他大部分的声音驱动)的许多缺陷,其中最值得一提的就是同一时刻只有一个应用程序可以访问硬件的问题。

这就是为什么ALSA中的一个软件组件需要管理音频请求并了解你的硬件能力。比如你想要在用Amarok听音乐的时候玩游戏,ALSA需要获取这两条音频流,在软件中将他们混合起来,或者用你的声卡上的硬件混音器达到同样的效果。

ALSA也可以同时管理8个音频设备,有时还可以处理硬件上的MIDI功能,虽然这取决于你的硬件的音频驱动的规格,而且这一点随着计算机能力的增强而不那么重要了。

ALSA不同于典型的模块/设备驱动程序的地方正是它部分可定制性的原因。这里也正是Linux音频系统开始变得复杂了的地方,因为你可以通过创建你自己的设置文件来对你的ALSA设置作几乎任何的修改——从音频流如何混合和输出到取样率、比特深度及实时效果。

ALSA相对的透明性、高效性和灵活性让他成为了Linux音频系统的标准,也成为了几乎其他所有的音频架构为了和音频硬件交互而必须通过的层。

PulseAudio 
输入: GStreamer, Xine, ALSA 
输出: ALSA, Jack, ESD, OSS

如果你认为让ALSA在后台安稳地运行,事情就会变得简单,那你就大错特错了。ALSA虽然能处理你的电脑输入和输出音频的具体细节,但你必须操作另一个复杂的层。

pulse

这就是PulseAudio——致力于连接硬件和软件功能、本地和远程计算机和音频流内容之间的隔阂。它像ALSA处理多个声卡一样处理网络上的音频,而且已经因为它的灵活性而成为了许多Linux发行版的一种标准了。

就像ALSA一样,这种灵活性伴随着复杂程度,但PulseAudio的问题更严重,因为它的面向用户性更强。这表示普通用户更容易弄乱它的网络。大部分发行版对它的设置敬而远之:以最新的Ubuntu发行版为例,你甚至可能不会发现PulseAudio被安装了。

如果你点击混音器小工具来调整你的声卡的音频等级,你会看到ALSA面板,但你真正看到的其实是一个虚拟设备——通过ALSA进入PulseAudio,再回到ALSA。

乍一看,PulseAudio似乎并没有给Linux音频系统增加任何新东西,因此它也受到了不少反对的呼声。虽然它并没有简化我们已有的东西,也没有让音效更强劲,但它确实增加了几个重要的特性。它也是一个Linux音频应用程序的全能层,不管它们各自的功能和你的硬件的规格如何。

如果所有的应用程序都是用PulseAudio,事情就简单了。开发者不需要考虑其他复杂的系统,因为PulseAudio带来了跨平台的兼容性。不过这也是之所以有这么多其他的音频解决方案的主要原因之一。

和ALSA不同,PulseAudio可以在多个操作系统中运行,包括其他的POSIX平台和微软的Windows。也就是说如果你建立一个是用PulseAudio的应用程序而非ALSA,把这个应用移植到另一个平台会很容易。

但是ALSA和PulseAudio之间有着一个符号链接,这是因为在Linux系统下,后者依赖于前者。PulseAudio将自己作为一个连接到ALSA的虚拟设备进行配置,就像任何其他的硬件一样。这就让PulseAudio更类似于Jack,因为它处于ALSA和桌面之间,来回透明地输送数据。

它也有它自己的术语。比如沉降(sink),指最后的目标。这些可以是网络中另一台计算机,也可以是你在虚拟ALSA中的声卡的音频输出。PulseAudio中完成这些沉降(sink)工作的部分被称为“源”(source)——例如你系统中的典型音频生成应用程序、你的声卡的音频输入,或者一段从另一台PulseAudio计算机中传来的网络音频流。

和Jack不同,应用程序不直接添加和删除源(source),于是你能对每段流作更好的控制。比如,通过PulseAudio混音器你可以调节每一个通过PulseAudio的应用程序的相对音量,不管那个应用是否有它自己的音量调节器。这在屏蔽那些吵人的网站时很好用。