ALSA 音轨
在 ALSA 网站上,您会读到 ALSA 代表 Advanced Linux Sound Architecture(高级 Linux 声音架构)。普通用户通常不会考虑声音架构之类的事情,所以在进一步介绍 ALSA 以及它为何“高级”之前,我必须简要描述一下 Linux 声音架构及其历史。
声音架构可以提供各种与音频相关的功能,但它必须至少包括声卡驱动程序与内核服务之间的底层连接,以及更高级别的音频软件编程接口,以简化应用程序开发。在 2.5.x 开发版本之前,Linux 内核使用了一个现在被称为 OSS/Free 的音频 API。OSS 在这里代表 Open Sound System(开放声音系统),这是一个最初由 Hannu Savolainen 于 1992 年编写的音频 API。独立开发者为 OSS/Free 系统贡献了驱动程序和其他工作,但到了 1990 年代后期,OSS API 已经显得过时。大约在那个时候,一位名叫 Jaroslav Kysela 的捷克系统管理员开始着手开发最终成为 ALSA 项目的东西。与 Linux 本身一样,ALSA 最初的目标相当 modest:Jaroslav 只是希望他的 Gravis UltraSound 声卡能够提供比现有 API 更多的功能,并且他愿意并且能够满足这项任务的需求。像 Linus Torvalds 一样,Jaroslav 最终发现自己成为了一群才华横溢的开发者的中心人物,他们都致力于为 Linux 开发更出色的音频 API。
ALSA 的功能和受欢迎程度不断提高,以至于用户和开发者开始游说使用 ALSA 来取代内核源代码中打包的 OSS/Free 系统。测试从 2.5.x 开发内核开始,从 2.6.x 内核开始,ALSA 一直是默认的 Linux 声音架构。
正如前面提到的,ALSA 的开发者一直致力于为 Linux 设计一个真正卓越的声音系统。在 ALSA 网站上,我们读到对该项目最重要功能的描述
高效支持所有类型的音频接口,从消费级声卡到专业多通道音频接口。
完全模块化的声音驱动程序。
SMP 和线程安全设计。
用户空间库,用于简化应用程序编程并提供更高级别的功能。
支持旧的 OSS/Free API,为大多数 OSS/Free 程序提供二进制兼容性。
根据 GPL 和 LGPL 许可。
本文并非旨在指导安装或编程 ALSA,也没有描述所有功能。我只是相当概括地考虑上面列表中的功能,并简要描述我在自己的系统上如何利用 ALSA。
对于大多数普通用户来说,也许第一个也是最重要的问题是“ALSA 是否支持我的声卡?” 由于许多制造商不愿意提供驱动程序或可用于编写 Linux 驱动程序的规范,因此 Linux 对音频硬件的支持一直存在问题。然而,也出现了一些值得注意的例外情况,到现在为止,ALSA 已经支持许多最流行的声卡和音频板,包括来自 Creative Labs、RME 和 M-Audio 的硬件。ALSA 的驱动程序支持扩展到串行和并行端口接口以及 PCMCIA 和 USB 硬件。ALSA 甚至超越了硬件,提供了一个虚拟驱动程序和一个非常有用的虚拟 MIDI 驱动程序。请参阅 ALSA 声卡矩阵,了解当前支持的声卡和芯片组列表。
图 1. alsaconf 声卡配置实用程序
主流 Linux 发行版尝试在初始安装的配置阶段识别并安装适合您声卡的驱动程序。通常,会包含一个独立的声卡配置实用程序,用于在原始安装之外进行调整。ALSA 提供了 alsaconf(参见图 1),它对于简单的声卡配置来说很好用,但对于具有多张声卡的系统来说就不是那么好了,它也不能处理加载虚拟或虚拟驱动程序。幸运的是,加载和卸载 ALSA 驱动程序非常简单(更多内容请参见下一节)。
我已经在各种声卡上使用过 ALSA。我当前的系统(台式机和笔记本电脑)都享受 ALSA 对 SBLive 和台式机上的 PCI128 以及笔记本电脑上的 CS4232 音频芯片组的支持。外部 MIDI 硬件在声卡上处于活动状态,EMU10k1 合成器在 SBLive 上完全运行,两台机器都使用虚拟 MIDI 模块。我还有一个 Core Sound PDAudio-CF PCMCIA 卡,在笔记本电脑和 ALSA 驱动程序下运行良好,为我提供了该机器的出色数字音频接口。
在 2.6.x 内核系列之前,您必须自己构建和安装 ALSA 系统,之后您可以进行必要的安排来加载模块,并在 /etc/modules.conf 中进行任何必要的添加。加载模块可以通过将 OSS/Free 内核模块树替换为 ALSA 树,或者使用手动加载和/或卸载它们的脚本来完成。例如,我使用以下脚本在我的笔记本电脑上为内核 2.4.18 声音系统加载 ALSA 驱动程序
echo "Installing ALSA..." modprobe snd-cs4232 # load CS4232 module modprobe snd-seq # load ALSA sequencer module modprobe snd-pcm-oss # load OSS/Free PCM compatibility module modprobe snd-mixer-oss # load OSS/Free mixer compatibility module modprobe snd-virmidi # load ALSA virtual MIDI module sbiload -p 65:0 -4 /etc/std.o3 # load 4-operator patches into OPL3 (using ALSA's sbiload utility) echo "ALSA installed !"
不过,这种方法并不典型。通常,您只需安装驱动程序并重新启动即可。模块在启动期间被探测;它们安装在 /lib/modules/2.x.x 树中。我有时需要在笔记本电脑上在 OSS/Free、OSS/Linux 和 ALSA 之间切换,因此使用了上面的脚本。
ALSA 混音器默认情况下会静音所有通道。您必须使用软件混音器 (alsamixer) 取消静音并设置通道值,然后运行alsactl store。此外,将此命令添加到您的 .bashrc 或其他 shell 启动脚本中以调用存储的设置,alsactl restore.
ALSA 的模块化还提供了配置底层驱动程序模块参数的能力。普通用户可能不太需要此功能,但在某些情况下,它可以成为救星。例如,我的笔记本电脑的板载音频由 Crystal Semiconductor 的 CS4232 芯片组处理。ALSA 为该芯片组提供了一个模块,所以我安装了它,但没有成功。在向 ALSA 大师 Takashi Iwai 咨询了一些问题后,我在我的 /etc/modules.conf 文件中添加了这一行
options snd-cs4232 snd_port=0x534 snd_cport=0x538 snd_mpu_port=-1 snd_fm_port=0x388 snd_irq=5 snd_dma1=1 snd_dma2=0
此信息定义了声卡功能,其值与笔记本电脑 BIOS 中找到的值相似或相同。BIOS 报告的基本声音端口 (snd_port) 的值略有不同,但 Takashi 验证了此硬件中音频端口的正确基地址确实是 0x534。没有 MPU MIDI 接口硬件 (snd_mpu_port=-1),但所有其他选项值与 BIOS 中找到的值相同。
加载这些模块后,我的笔记本电脑具有 PCM 和 CD 声音服务,以及 OPL3 FM 合成器,并支持需要旧版 OSS/Free API 的应用程序。虚拟 MIDI 模块使我可以访问具有四个虚拟 MIDI 端口的虚拟第二声卡,这些端口可以像真正的 MIDI 硬件一样访问。
我将在这里扩展模块化的定义,并包括 ALSA 的 PCM 插件层。这些插件扩展了 PCM 设备的功能,提供了诸如采样率转换和直接混合多个音频流之类的便利功能。.asoundrc 文件是您可以优化这些插件以供 ALSA 感知应用程序使用的地方。例如,这是我的 $HOME/.asoundrc 文件
pcm.dsp0 { type plug slave.pcm "dmix" } ctl.mixer0 { type hw card 0 } pcm.ladspa { type ladspa slave.pcm "plughw:0,0"; path "/usr/lib/ladspa"; plugins [ { label delay_5s input { controls [ 0.8 0.3 ] } } ] }
感谢此配置,我的笔记本电脑可以在我的笔记本电脑上同时播放多个音频流(没有 dmix 是不可能的)。我还可以通过使用预定义的 LADSPA 插件为任何这些流添加五秒延迟。以下一系列命令启动了三个声音播放器,所有播放器都通过 dmix 的软件混音器路由,其中一个流由 LADSPA 延迟线处理
alsaplayer -o alsa -d plug:dmix Natacha_Atlas-I_put_a_spell_on_you.mp3" & aplay -Dplug:dmix -Dplug:ladspa ~/Basil_Bunting.wav & alsaplayer -o alsa -dplug:dmix Albert_King-Born_Under_A_Bad_Sign.mp3 &
此示例会产生很大的噪音,但在某些情况下,多个可听见的流可能是理想的。更重要的是,通常希望不关闭一个流即可听到另一个流。dmix 插件很好地解决了这个问题。
某些声卡需要通过 .asoundrc 进行显式配置。请查看内容丰富的 ALSA Wiki,以获取有关自定义该文件的更多信息。
ALSA 对 SMP 友好,这对于那些拥有双处理器和多处理器机器的 Ardour 用户来说是个好消息。唉,我不是幸运者之一,所以我没有关于 ALSA 在 SMP 机器上的性能的个人记录。但是,Ardour 和 ALSA 邮件列表中似乎没有关于它的投诉,这表明 SMP 支持是透明的且不是问题。
ALSA 符合使用 Linux 线程的应用程序的要求。对于您这些非程序员来说,线程是在程序中处理同时数据流的强大方法。因此,程序可能被设计为在一个线程中传输音频数据,而另一个线程更新程序的 GUI,并且两个线程都不会影响另一个线程的性能。ALSA 的线程支持确保其活动在线程环境中表现良好,即使其他进程出错,也遵循规则并在其进程线程中做正确的事情。虽然对于普通用户来说不是明显的关注点,但线程是现代音频软件设计的重要方面,在幕后工作以提高应用程序的性能。ALSA 对线程的显式支持使开发者和用户都受益。
ALSA 的 libasound 提供了对您的声卡驱动程序的功能和服务的库访问。应用程序开发者很快就利用了 ALSA 的功能,ALSA 包本身包含许多基于 libasound 的实用程序。我已经提到了 alsaconf 和 alsactl 程序以及 alsamixer GUI 声卡混音器。在上面的 dmix 示例中,aplay 程序是 ALSA 的命令行声音文件播放器;arecord 是它的录音兄弟程序。其他有用的 ALSA 应用程序包括 aconnect MIDI 端口连接工具、amidi sysex 发送/接收实用程序和 amixer 命令行混音器。所有这些应用程序都是小型命令行程序,它们访问 ALSA 库函数来执行特定任务。除了作为普通用户的有用程序之外,它们还为开发者提供了出色的示例。
开发者可以使用 libasound 来访问这些接口
信息接口 (/proc/asound)
控制接口 (/dev/snd/controlCx)
混音器接口 (/dev/snd/mixerCxDx)
PCM 接口 (/dev/snd/pcmCxDx)
原始 MIDI 接口 (/dev/snd/midiCxDx)
音序器接口 (/dev/snd/seq)
定时器接口 (/dev/snd/timer)
每个接口都有自己独特的一组服务。例如,PCM 接口处理数字音频,原始 MIDI 接口处理 MIDI 数据,混音器接口管理通道和其他混音器元素,等等。
ALSA 音序器接口值得特别关注。旨在利用此接口的 MIDI 应用程序被注册为 ALSA 音序器客户端,允许通过 ALSA 的 aconnect 实用程序在这些客户端之间进行自由和多重连接。图 2 展示了 Matthias Nagorni 的 kaconnect,这是一个方便这些连接的 GUI。图 2 还演示了单个目标上的多个输入、具有多个目标的单个输出源以及使用虚拟 MIDI 端口连接到软合成器。
图 2:Matthias Nagorni 的 kaconnect
许多现代 Linux MIDI 应用程序已经作为 ALSA 音序器客户端运行。我强烈建议开发者将其视为必备功能。
如图 2 所示,ALSA 库提供了到虚拟 MIDI 驱动程序的接口。此驱动程序提供了四个虚拟 MIDI 端口,这些端口在您的机器上显示为实际硬件。因此,我可以在我的笔记本电脑上运行没有 MIDI 硬件(端口或合成器)的 MIDI 应用程序,只需选择一个虚拟端口作为输出并将其连接到 ALSA 感知的软合成器,例如 ZynAddSubFX 或 ALSA Modular Synth。
随着 ALSA 被采用为默认的 Linux 声音系统,开发者和用户迎来了一个改进的音频资源的新世界。然而,自 1992 年以来,已经为现在已弃用的 OSS/Free 接口编写了许多出色的声音和音乐应用程序。ALSA 明智地提供了一个 OSS/Free 仿真层,当运行非 ALSA 音频应用程序时,该仿真层会透明地运行。普通用户无需重新配置任何内容;ALSA 只是对正在运行的程序显示为 OSS/Free。当然,应用程序不会获得原生 ALSA 软件的优势,但仿真层确实为许多为旧版 API 编写的有用程序提供了更长的寿命。
根据我的经验,ALSA 的 OSS/Free 仿真非常出色。我还没有遇到过任何无法与 ALSA 一起使用的 OSS/Free 特定应用程序。很可能存在一个或多个 ALSA 抗性程序,但我个人尚未发现一个。
ALSA 系统中可以探索许多其他功能,但我必须结束这个简短的介绍。ALSA 文档以 UNIX 手册页、ALSA 网站上的 HTML 页面和 ALSA Wiki 上的用户报告的形式提供。活跃的邮件列表可供开发者和用户使用,ALSA 社区对错误报告、礼貌的建议和慷慨的赞扬做出积极响应。
那么,确实要对 Jaroslav Kysela、Takashi Iwai、Frank van de Pol 以及 ALSA 贡献者 页面上列出的所有人员给予慷慨的赞扬。这些人太棒了,感谢他们,我的 Linux 机器也很棒。
Dave Phillips dlphilp@bright.net 是一位音乐家、教师和作家,居住在俄亥俄州芬德利。自 1995 年首次接触 Linux 以来,他一直是 Linux 音频社区的活跃成员。他是 The Book of Linux Music & Sound 的作者,以及 Linux Journal 中的众多文章的作者。