ALSA 用户指南

作者:Dave Phillips

自从 2.6 Linux 稳定内核系列公开发布以来,高级 Linux 声音架构 (ALSA) 已成为默认的内核声音系统。这一变化为 Linux 音频和 MIDI 功能带来了显著改进,包括对专业音频硬件、3D 环绕声、高级 MIDI 功能和软件混音或音频流多路复用的支持。当与针对低延迟进行过修补的内核结合使用时,ALSA 提供的声音和 MIDI 资源可以与竞争平台相媲美,在某些方面甚至优于它们。这是一个大胆的声明,所以让我们看看 ALSA,了解它为何如此出色。

故事的开端

ALSA 项目始于一位名叫 Jaroslav Kysela 的年轻程序员,他对内核声音系统缺乏对其 Gravis Ultrasound 音频/MIDI 卡的全面支持感到沮丧。Gravis 卡通过使用存储在卡内存中的采样声音(PAT(补丁)文件格式)来创建声音。只要用户运行 Microsoft Windows 或 Apple Mac OS,就可以编辑和存储 PAT 声音库。遗憾的是,Linux 没有提供如此全面的资源,导致 Jaroslav 的声卡无法完全运行。

当时,Linux 内核声音系统是 OSS/Free 系统,这是一个稳固且可用的音频/MIDI 子系统,自 Linux 的早期以来就一直存在于内核源代码中,这主要归功于 Hannu Savolainen 的开创性工作。唉,OSS/Free 没有跟上快速发展的桌面音频制作世界,许多声卡要么不受支持,要么只得到部分支持,Gravis 板卡就是这种情况。公平地说,OSS/Free 维护人员很少;通用 Linux 音频世界缺乏组织性;而且制造商当时(就像现在仍然有些制造商一样)对其驱动程序规范过于保密。

将对 Gravis 卡的更大支持纳入 OSS/Free 可能是可行的,但当 Jaroslav Kysela 研究 OSS/Free 应用程序编程接口 (API) 时,他意识到需要一个新的 API,它可以更广泛地支持现代声卡和数字音频接口的发展。专业级和消费级用户的期望都提高了,他们要求支持诸如高采样率和位深度(用于专业录音)、5.1 和其他 3D/环绕声音频输出阵列、多通道数字音频 I/O 以及多个 MIDI I/O 端口等功能。OSS/Free 中需要进行根本性更改的进步实在太多了,因此 Jaroslav 做了任何真正的硬核 Linux 程序员都会做的事情:他为 Linux 设计了一个新的音频/MIDI API,称之为高级 Linux 声音架构。

设计和实现一个能够涵盖当代音频要求的 API 是一项非同小可的任务,ALSA 花费了许多年、许多程序员和许多版本才达到其目前作为内核声音系统的地位。在其早期阶段,普通用户必须手动安装该系统,通常是作为 OSS/Free 系统的替代品,以便获得对某张卡或某张卡的扩展功能的支持。此过程包括卸载 OSS/Free 并重新编译内核以支持 ALSA,在当时这是一项非常重要的任务。尽管如此,ALSA 的忠实用户队伍不断壮大,开发蓬勃发展,最终 ALSA 被纳入 Linux 2.5 内核开发轨道。最终,随着 2.6 内核系列的公开发布,ALSA 成为默认的内核声音系统。

什么是 ALSA?

ALSA 首页为我们提供了以下信息

高级 Linux 声音架构为 Linux 操作系统提供音频和 MIDI 功能。ALSA 具有以下重要功能

  1. 高效支持所有类型的音频接口,从消费级声卡到专业多通道音频接口。

  2. 完全模块化的声音驱动程序。

  3. SMP 和线程安全设计。

  4. 用户空间库 (alsa-lib) 以简化应用程序编程并提供更高级别的功能。

  5. 支持旧的 OSS API,为大多数 OSS 程序提供二进制兼容性。

ALSA 根据 GPL(GNU 通用公共许可证)和 LGPL(GNU 宽通用公共许可证)发布。

让我们来看看这些功能中的每一个,用更易于普通用户理解的语言来重述它们。

高效支持意味着您可以使用 ALSA 工具(如声卡配置实用程序和混音器程序)轻松管理受支持声卡的基本和高级功能。这些工具是完整 ALSA 安装的组成部分。

模块化声音驱动程序意味着 ALSA 声卡驱动程序易于安装和更新。它们还提供了用户可以更详细地控制卡可用选项的方法。在本文的后面,我们将展示如何使用驱动程序模块来访问和控制 ALSA 支持的声卡的功能。

ALSA 支持多处理器或 SMP 机器。线程安全是一个编程术语,它表示软件提供的服务可以在不同的线程中并发运行,而不会相互干扰。在现代音频/MIDI 应用程序中,线程安全是一件非常好的事情。

ALSA 的用户空间库为程序员以及他们的程序提供了对 ALSA 服务的轻松访问,它对普通用户的重要性可能看起来相当渺小。但是,ALSA 库提供了应用程序可以访问这些功能的接口,有助于在用户级别形成更统一的环境。您的程序可以彼此更和谐地运行,并增强应用程序之间连接和通信的可能性。

ALSA 是在 Linux 声音支持的第一阶段发展起来的,当时大多数应用程序都在使用 OSS/Free API,因此对于普通用户来说,OSS/Free 兼容层是当务之急。许多 Linux 声音应用程序仍然需要 OSS/Free 兼容性,因此 ALSA 为旧 API 提供了无缝支持。但是,程序员应该注意,旧 API 现在已正式弃用。

安装和配置

有关安装的完整详细信息,请访问 ALSA 首页(请参阅在线资源),因此我在此仅提及一些详细信息和说明。如果您使用的是基于 2.6 内核的发行版或自定义 Linux 系统,则 ALSA 已安装。基于早期内核的发行版和系统需要手动安装 ALSA。

安装 ALSA 并非特别困难,并且至少部分地通过音频中心 Linux 发行版/捆绑包提供的软件包(例如 Debian 的 AGNULA/Demudi、Red Hat 和 Fedora 的 PlanetCCRMA 以及 SlackWare 的 AudioSlack)简化了安装过程。Mandrake 用户可以安装 Thac 的软件包之一(请参阅资源)。无论您的基本系统是什么,您都必须在安装 ALSA 软件包之前卸载 OSS/Free 模块。通常,此任务仅需将旧模块移动到临时目录(以防您想要或需要将其放回),并确保内核的 soundcore.o 对象文件保留在其原始位置,通常是 /lib/modules/您的内核编号/kernel/drivers/sound/。删除 OSS/Free 后,您需要通过您选择的软件包管理器安装 ALSA 软件包。

多年来,ALSA 配置得到了极大的改进,但它仍然可能是一个棘手的过程,尤其是当您的系统有多个声音设备,或者设备通过 USB 或 PCMCIA 总线连接到您的计算机时。显然,我无法详细介绍每种可能的配置,但幸运的是,ALSA 网站包含大量受支持设备的配置页面,通常包括其他用户的提示和技巧。

基本配置

基本配置可以使用 alsaconf 实用程序完成(图 1)。alsaconf 在识别单个设备方面效果很好,但对于包含多个设备的系统,它可能效果不佳。不用担心;容纳多个音频和 MIDI 设备仍然相当简单,我们稍后将回到该任务。现在,让我们假设您的机器只有一个音频设备。

A User's Guide to ALSA

图 1. alsaconf 配置工具非常适合在安装了一张声卡的系统上查找声音硬件。

在 alsaconf 设置了对您的声音设备的基本支持后,您需要激活其播放和录制通道。默认情况下,ALSA 启动时会使您设备的所有通道静音。对于某些用户来说,这可能是一种烦恼,但它肯定会降低您在首次启动新系统时意外炸毁扬声器的可能性。您可以使用 ALSA 的 alsamixer 实用程序设置声音设备的通道功能,这是一个字符图形混音器,其中包含检测到的设备的每个通道的滑块和开关(图 2)。使用箭头键选择通道,使用 <> 键取消静音/静音通道,并使用空格键选择通道作为录制源(在 ALSA 术语中称为捕获)。当您设置好混音器首选项后,运行 alsactl 实用程序以保存和调用您的设置(alsactl store|restore).

A User's Guide to ALSA

图 2. 默认情况下,ALSA 启动时声音静音,因此您需要使用 alsamixer 设置音频通道值。

正如您已经看到的,ALSA 周到地提供了许多有用的工具来帮助配置系统。如果您想了解有关使用这些工具的更多详细信息,只需使用 -h 选项运行该实用程序,或使用 man 命令查看更详细的描述。以下示例显示了我已经提到的实用程序的帮助手册页

  • man alsaconf

  • man alsamixer

  • man alsactl

高级配置

现在我们已经考虑了一些基本的安装和配置细节,让我们看看如何设置更复杂的系统。对于以下示例,我使用了我的笔记本电脑系统的配置详细信息,这是一台 Pentium II 366MHz HP Omnobook 4150,配备了 NeoMagic 制造的组合音频/视频芯片组。

在 Linux 下设置笔记本电脑音频支持可能是一项复杂的任务,而且碰巧我的硬件有点问题。值得庆幸的是,ALSA 提供了我需要的工具来解决我在查找正确的芯片和驱动程序标识方面遇到的困难。

alsaconf 实用程序尝试识别您系统的音频和 MIDI 功能,然后将基本配置文件写入 /etc/modules.conf。但是,在笔记本电脑声音支持的奇怪世界中,事情可能并不总是表面看起来那样。例如,alsaconf 正确地将我的笔记本电脑音频芯片识别为 NeoMagic NM256。但是,配置失败,报告说我应该使用基本 SoundBlaster16 驱动程序 (sb16) 或 Crystal Sound 驱动程序之一 (cs423x)。

根据 ALSA 专家 Takashi Iwai 的建议,我尝试使用 alsaconf 为 CS4232 芯片组功能设置驱动程序,从 alsaconf 的非 PnP ISA 芯片组列表中选择 cs4232 模块。当我选择探测所有可能的 DMA 和 IRQ 设置时,我的机器死机了,键盘被锁定,并且强制关机和冷启动。公平地说,我必须提到 alsaconf 警告过我可能会发生这种情况。幸运的是,当我拒绝更激进的搜索时,alsaconf 顺利完成了其任务,并将以下部分添加到我的 /etc/modules.conf 文件中

	# --- BEGIN: Generated by ALSACONF, do not edit. ---
	# --- ALSACONF version 1.0.4 ---
alias char-major-116 snd
alias snd-card-0 snd-cs4232
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias snd-card-1 snd-virmidi
alias sound-slot-1 snd-card-1
	# --- END: Generated by ALSACONF, do not edit. ---

Alsaconf 只是为 ALSA 可以为我的机器提供的通用和特定于卡的服务设置了一系列别名。对于正常使用,此部分应保持 alsaconf 生成时的状态。顺便说一句,virmidi 模块的条目在那里是因为我正在运行 Red Hat 9,并使用了 PlanetCCRMA 的 ALSA 软件包,PlanetCCRMA 是一套用于设置低延迟、高性能 Linux 音频/MIDI 工作站的组件。PlanetCCRMA 默认安装虚拟 MIDI 模块。

接下来,我编辑了 /etc/modules.conf 中的驱动程序选项。在此部分中,我可以自定义我的声音芯片的各种功能,设置 I/O 端口和 IRQ 地址,启用或禁用板载合成器功能,以及定义 DMA 通道。

我运行了alsaconf -P以查看旧式非 PnP 模块的列表

# alsaconf -P
opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8

接下来,我探测了 CS4232 驱动程序的默认选项设置

# alsaconf -p cs4232
port=0x534 cport=0x538 isapnp=0 dma1=1 dma2=0 irq=5

我可以接受这些值并拥有一个正常工作的音频系统,但再次感谢 Takashi Iwai,我发现我还可以启用一个板载合成器芯片,Yamaha OPL3,这是一款廉价的 4 运算符 FM 合成器,因其在廉价声卡中的普及及其声音的普遍廉价而臭名昭著。Takashi 还建议输入并禁用物理 MIDI 端口的选项,只是为了表明它作为芯片组功能的存在。因此,我当前的 /etc/modules.conf 中的选项部分现在包括 CS4232 的更完整配置

options snd-cs4232 port=0x534 cport=0x538 mpu_port=-1
↪fm_port=0x388 irq=5 dma1=1 dma2=0 isapnp=0

通过此配置,我现在拥有正常工作的音频 I/O 和一个廉价的板载 FM 合成器。但是,合成器需要一组声音补丁才能发出任何声音,当然 ALSA 提供了所需的实用程序 (sbiload) 来将补丁数据加载到合成器中——ALSA 甚至提供了补丁。我按如下方式使用加载器

sbiload -p 65:0 --opl3 \
/home/dlphilp/soundfiles/sbi-patches/std.o3 \
/home/dlphilp/soundfiles/sbi-patches/drums.o3

这些选项包括所需的目标端口(使用以下命令确定aconnect -o)以及用于 OPL2 或 OPL3 支持的开关;OPL2 只是一个 2 运算符 FM 合成器。示例的补丁包含在 ALSA 工具中(请参阅locate *.o3locate *.db以获取位置)。互联网上还提供了一些其他用于 OPL3 的补丁集,并且还提供补丁编辑器。

此时,我打开 alsamixer 以设置 CS4232 的通道状态。上面显示的图 2 显示了结果。我现在可以播放 OGG 和其他音乐文件 (PCM),收听我的音乐 CD (Aux1),以及观看和收听 DVD 和其他视频格式 (Aux)。我可以录制通过麦克风输入或线路输入插孔输入的模拟音频,甚至可以收听由声卡芯片合成器 (Aux1) 播放的 MIDI 音乐文件。默认情况下,我一次只能执行这些活动中的一项,但 ALSA 提供了一个用于软件混音的简洁插件,我稍后会对此进行描述。

顺便说一句,在 Red Hat 或 Fedora 上,可以使用以下命令启动和停止整个 ALSA 系统

/etc/init.d/alsasound start
/etc/init.d/alsasound stop
/etc/init.d/alsasound restart

如果您安装了 Debian 软件包,则该文件为 /etc/init.d/alsa。此功能使测试新配置变得容易。可以使用以下命令确定 alsasound 控件的确切位置locate alsasound.

ALSA 虚拟 MIDI 模块

细心的读者可能会想知道,在没有 MIDI 硬件的情况下,我如何路由 MIDI 数据。感谢 ALSA 的 virmidi 模块,我的系统有四个虚拟设备可用作任何其他 ALSA 音序器客户端的原始 MIDI I/O 端口。所谓的 ALSA 音序器 API 的音序器不是像 MusE 或 Rosegarden 这样的音序应用程序。此音序器管理自由互连的 MIDI 数据流的合并和定时,包括与单个端口的多个连接。符合 ALSA 音序器 API 允许每个客户端自由地互连到一个或多个其他客户端,并且它已成为现代 Linux 音频软件的预期功能。

ALSA aconnect 实用程序告诉我哪些端口可通过 ALSA 音序器连接

aconnect -i
client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
    0 'VirMIDI 1-0     '
client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
    0 'VirMIDI 1-1     '
client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
    0 'VirMIDI 1-2     '
client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
    0 'VirMIDI 1-3     '

此报告表明我有四个虚拟 MIDI 端口。我分配给这些端口的任何软件随后都可以连接到任何其他 ALSA 音序器客户端

aconnect -o
client 65: 'OPL3 FM synth' [type=kernel]
    0 'OPL3 FM Port    '
client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
    0 'VirMIDI 1-0     '
client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
    0 'VirMIDI 1-1     '
client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
    0 'VirMIDI 1-2     '
client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
    0 'VirMIDI 1-3     '

此报告显示了我可用的接收端口。因此,以下命令将第一个 virmidi 端口连接到我的板载 FM 合成器

aconnect 72:0 65:0

kconnect、alsa-patch-bay 和 QJackCtl 程序为设备识别和连接提供了图形界面。

A User's Guide to ALSA

图 3. 基本 Linux 笔记本电脑 MIDI 系统

图 3 展示了一个小巧但功能强大的 MIDI 音序系统。主要程序是 Rob Buse 的 seq24,这是一个轻量级的循环音序器,其设计风格类似于 20 世纪 80 年代和 90 年代的硬件音序器。seq24 在内部管理其连接,该图隐藏了虚拟键盘和 seq24 之间的连接以及各个序列的输出目标。一些序列已路由到 OPL3 合成器;另一些序列已发送到作为 Soundfont 服务器运行的 TiMidity 实例。

USB MIDI 接口

像许多其他笔记本电脑用户一样,我将一个 USB 设备连接到我的机器上,在本例中是一个 MIDIman 2x2 MidiSport。MidiSport 提供两个独立的 I/O 端口,是的,ALSA 支持多端口 MIDI 硬件。但是,当我使用这台机器时,我并不总是随身携带 MidiSport,所以我更喜欢在设置好我的 CS4232 和 virmidi 卡之后再加载 USB 模块。为了阻止我的 USB MIDI 模块的自动加载,我在 /etc/hotplug/blacklist 中添加了以下行

# So I can keep my preferred order of sound cards:
snd-usb-audio

# uhci ... usb-uhci handles the same pci class:
usb-uhci

接下来,我编写了以下脚本来配置和激活 MidiSport 2x2

echo "Loading MidiSport firmware..."
modprobe snd-usb-audio
sfxload -I \
  /usr/share/usb/ezusbmidi/ezusbmidi2x2.ihx \
  -D /proc/bus/usb/001/003
echo "Done !"

固件和加载器包含在 ALSA 安装中。您可能需要查询 /proc/bus/usb 文件系统以获取您可用的 USB 标识符,并且您可能需要尝试每个标识符以找到哪个标识符适用于您的硬件。使用cat命令列出您的标识符编号

$ cat /proc/bus/usb/001/
001 003

如果您选择了错误的标识符,系统会报告错误,因此至少在我的情况下,试错过程并没有持续很长时间。

PCMCIA 音频卡

好像我还没有在我的小系统中塞满 ALSA 驱动程序一样,我还想使用 Core Sound PDAudioCF 卡,这是一款高质量的数字音频输入卡,专为手持计算机(如 Zaurus)制造,但与 CF-to-PCMCIA 适配器非常兼容。同样,我想在设置 PDAudioCF 之前配置我的其他设备,所以我只需等到我拥有所有其他设备都按预期工作后再插入卡。系统会自动检测新硬件并加载相应的模块 (snd-pdaudiocf),该过程对最终用户完全透明。

使用此卡很容易。以下示例说明了如何使用 ALSA 的 arecord 实用程序从我的台式机系统的 SBLive 的 S/PDIF 数字输出录制 30 秒的立体声数字音频流到 PDAudioCF 卡

arecord -f dat -D hw:3,0 -d 30 foo.wav

The-f dat选项将录制格式设置为包含 48kHz 的采样率,这是 SBLive 唯一支持的输出采样率。我替换了-f cdDAT 选项,并从我的 Delta 66 的 S/PDIF 输出再次录制,这次使用标准的红皮书 CD 音频值,即采样率为 44.1kHz 的 16 位立体声音频。在这两种情况下,录制和播放都完美无瑕,并且具有优美的音质,这要归功于 PDAudioCD 卡。有关 ALSA 播放和录制实用程序的更多详细信息,请参阅man aplayman arecord.

Linux 笔记本电脑声音支持是一个奇怪的世界,我花了很多时间才使一切正常工作。但是,我的机器现在有一个声音系统,支持立体声模拟 PCM I/O、CD 音频通道、MIDI 可访问的板载合成器、四个虚拟 MIDI I/O 端口、一个外部 2x2 MIDI 接口和一个高质量的数字音频输入端口。对于 PII 366 来说,这套功能还不错,当然,真正的功劳归功于 ALSA。

顺便说一句,如果我忘记了我的卡的有序编号,我总是可以查询 proc 文件系统以获取它们的编号和状态

$ cat /proc/asound/cards
0 [CS4231         ]: CS4231 - CS4231
        	     CS4231 at 0x534, irq 5, dma 1&0
1 [VirMIDI        ]: VirMIDI - VirMIDI
        	     Virtual MIDI Card 1
2 [M2x2           ]: USB-Audio - Midisport 2x2
                     Midiman Midisport 2x2 at usb-00:07.2-1, full speed
3 [PDAudioCF      ]: PDAudio-CF - Core Sound PDAudio-CF
	             Core Sound PDAudio-CF at 0x100, irq 11

因此,具体的硬件定义将是 hw:0、hw:1、hw:2 和 hw:3。hw:1 和 hw:2 是仅限 MIDI 的设备,不能用于音频目的。是的,proc 报告的是 CS4231,而我配置的是 CS4232,但 Takashi Iwai 向我保证,这种行为对于芯片组来说是正常的。我知道,这很奇怪。

基本和高级桌面配置

我的台式机系统配置起来容易得多。它仍然是一个相当复杂的系统,支持一张声卡——SoundBlaster Live Value,带有外部 MIDI 适配器——虚拟 MIDI 模块和一个 M-Audio Delta 66 多通道音频接口。

与我的笔记本电脑上的 OPL3 合成器一样,我必须将声音数据加载到 SBLive 的 EMU10k1 硬件合成器中,使用 ALSA sfxload 实用程序将音色库加载到合成器中。此命令使用随声卡分发的通用 MIDI 音色库配置我的 SBLive 合成器

sfxload 8mbgmsfx

最近,开发人员 Lee Revell 显著改进了 Creative Labs SBLive 和 Audigy 声卡的 ALSA 驱动程序,释放了比以前的驱动程序更大的潜力。Lee 效仿了 kX Project,这是一个基于 Windows 的开源项目,旨在打开 SBLive/Audigy 卡的所有功能,包括真正的多通道 I/O、对 DSP 寄存器的访问以及对 x.1 环绕声的支持。Lee 的工作极大地扩展了廉价硬件的录制和播放可能性,为 Linux 作为桌面音乐和声音工作站带来了更多价值。

我的台式机的虚拟 MIDI 驱动程序的安装和操作与我的笔记本电脑完全相同。有关详细信息,请参阅上面的相应部分。

可以使用 alsamixer 进行我的 SBLive 的通道设置,但设置我的 Delta 66 需要使用专门的 envy24control 混音器(图 4)。此混音器提供对带有 ice1712 芯片组的卡(包括 M-Audio Delta 卡)的高级功能的访问和控制。

A User's Guide to ALSA

图 4. envy24control 混音器

ALSA 可以轻松处理具有多张卡的系统。ALSA 实用程序通常包含一个用于特定卡选择的选项,如我的 SBLive 和 Delta 卡的以下示例所示

alsactl restore 0
alsactl restore 2
alsamixer -c 0
alsamixer -c 2

在我的系统中,卡 1 是虚拟 MIDI 卡,它不占用通道设置,因此没有关联的混音器。

ALSA 插件和 .asoundrc 文件

ALSA 插件是通过名为 .asoundrc 的文件提供的实用程序服务,该文件通常放置在您的主目录中。插件服务包括重采样、通道路由、采样格式转换和软件音量控制。有关这些和其他 ALSA 插件的详细信息,请参阅 ALSA Wiki 上关于 .asoundrc 的注释。

正如我之前提到的,我的笔记本电脑的默认声音功能仅限于一次一个应用程序。幸运的是,ALSA 提供了一个名为 dmix 的酷炫插件,其唯一功能是提供一种称为软件混音的音频流多路复用类型。不幸的是,ALSA 不会自动检测到对 dmix 插件的需求,因此用户必须准备必要的组件。

这是我的笔记本电脑的 .asoundrc

pcm.!default {
        type plug
        slave.pcm "dmixer"
}

pcm.dmixer  {
        type dmix
        ipc_key 1024
        slave {
            pcm "hw:0,0"
            period_time 0
            period_size 1024
            buffer_size 4096
            rate 32000
}
        bindings {
            0 0
            1 1
        }
}

pcm.dsp {
        type plug
        slave.pcm "dmixer"
}

ctl.dmixer {
        type hw
        card 0
}

此文件定义了一个名为 dmixer 的新 PCM 设备,其插件类型为 dmix,该插件从属于声卡芯片的 PCM 功能。该插件还允许我根据硬件的功能定制采样率,从而减轻 CPU 需求。

使用 dmix 插件,我可以同时运行音频播放器和视频播放器。如果您想知道我为什么要这样做,请考虑我经常研究 DivX 光盘上提供的太极拳视频。视频通常很精彩,但背景音乐并不总是合我的口味,因此能够听一些更符合我口味的东西很高兴。以下命令启动了 Andy Lo A Fo 的简洁 alsaplayer 音频文件播放器和 MPlayer 视频播放器

mplayer -ao alsa9:dmixer -aop list=volume:volume=0 \
  -framedrop foo.avi
alsaplayer -o alsa -d plug:dmixer cool-foo.mp3

由于 MPlayer 的软件音量控制,视频播放器的音频输出被否定,而 alsaplayer 播放我喜欢的音乐。非常酷的东西,由 dmix 插件提供。

我的台式机系统没有特殊需求,但我为我的 .asoundrc 文件配置了 SBLive 和 Delta 66 的基本配置

pcm.emu10k1 {
        type hw
        card 0
}

ctl.emu10k1 {
        type hw
        card 0
}

pcm.Delta66 {
        type hw
        card 2
}

ctl.Delta66 {
        type hw
        card 2
}

pcm.DeltaPlug {
        type plug
        card 2
}

ctl.DeltaPlug {
        type plug
        card 2
}

pcm.DeltaPlugHW {
	type plughw
	card 2
}

ctl.DeltaPlugHW {
        type plughw
        card 2
}

卡编号反映了我查询 /proc/asound 时的排序列表

$ cat /proc/asound/cards
0 [Live           ]: EMU10K1 - Sound Blaster Live!
                     Sound Blaster Live! (rev.8) at 0xd000, irq 3
1 [VirMIDI        ]: VirMIDI - VirMIDI
	             Virtual MIDI Card 1
2 [M66            ]: ICE1712 - M Audio Delta 66
	             M Audio Delta 66 at 0xd800, irq 5

ALSA 不提供默认的 .asoundrc 文件,也不是绝对必要的。但是,许多有趣的 ALSA 功能只能通过 .asoundrc 访问,建议读者研究 ALSA 网站上找到的示例文件。

有关高级示例,请参阅 Timo Sivula 的 El Cheapo HOWTO,这是一个相当惊人的硬件/软件破解,它允许使用两张或多张消费级声卡进行采样精确的多通道录音(Timo 使用了 Creative Labs PCI128)。在正常情况下,由于卡的时钟晶体之间固有的不稳定性,这种方法注定会失败,但 Timo 的硬件修改和 .asoundrc 的功能使其成为可能。El Cheapo HOWTO 不适合胆小者,但它确实成功地为 Linux 桌面上的高质量多通道录音提供了一条廉价途径。

关于 JACK 的简要说明

图 4 展示了 JACK 环境中的 envy24control 混音器。JACK 是一个音频连接管理器,专为 JACK 服务器及其客户端之间的低延迟通信而设计,符合专业规范。JACK 需要一个本机系统音频驱动程序,对于 Linux 而言,它可以是虚拟驱动程序、OSS 驱动程序、PortAudio 或最常见的 ALSA。我将在未来的文章中详细介绍 JACK 系统。

ALSA 应用程序软件基础

毫不夸张地说,所有当代主要的 Linux 音频软件都想要 ALSA 的特殊服务。MIDI 程序享受 ALSA 音序器的连接性,数字音频系统利用 ALSA 的专业音频硬件驱动程序,并且为常见的桌面音频/视频活动提供了全面的支持。图 5 和图 6 展示了我桌面上常见的一些屏幕,这要归功于 ALSA。

A User's Guide to ALSA

图 5. 使用 Ardour 录音

A User's Guide to ALSA

图 6. Rosegarden 中的音频/MIDI 音序

未来工作

从普通用户的角度来看,ALSA 最明显的弱点是缺乏各种工具和实用程序的 GUI 前端,这些工具和实用程序构成了系统的大部分功能:一个配置面板,其中包含用于配置和重新排序已安装卡、加载虚拟 MIDI 驱动程序、选择 .asoundrc 插件和生成新文件、操作 alsactl 等的选项。ALSA 的确功能丰富,但它的许多出色功能只有我们这些愿意编写脚本和资源文件的人才能使用。

幸运的是,ALSA 为所有级别的用户提供了大量的文档和信息。我已经提到了 ALSA 实用程序的帮助手册页。ALSA 网站包含许多有关系统基本和高级使用的资源。此外,alsa-user 和 alsa-devel 邮件列表是智慧和帮助的源泉,优秀的 ALSA Wiki 也是如此。

该项目始终需要程序员,但也需要图形艺术家、技术作家和 beta 测试人员,因此即使您不会编码,您的技能也可能对该项目有价值。硬件和现金捐赠也受到欢迎;请访问 ALSA 网站以获取相应的联系方式。

普通用户可以期望看到更多受支持的卡,以及更多可供用户使用的功能。希望卡配置会变得更容易:充分利用 ALSA 可能是一件简单的事情,也可能是一件困难的事情。的确,困难的事情并非不可能,而且付出努力肯定是有价值的。但是,我们希望也能看到一些更易于访问的工具,用于用户级配置。

致谢

作者感谢 Jaroslav Kysela 和 Takashi Iwai 多年来在使用 ALSA 过程中给予的巨大耐心和出色帮助。还要感谢 ALSA 开发团队的所有成员,无论是过去、现在还是将来,感谢他们为 Linux 声音世界带来的这份伟大的礼物。最后,感谢 Len Moskowitz 长期借给我他出色的 Core Sound PDAudioCF 卡。

本文的资源: /article/8324

Dave Phillips 是一位音乐家、教师和作家,居住在俄亥俄州芬德利市。自 1995 年首次接触 Linux 以来,他一直是 Linux 音频社区的活跃成员。他是 The Book of Linux Music & Sound 的作者,也是 Linux Journal 中众多文章的作者。

加载 Disqus 评论