在 Linux 上使用 Hammerfall HDSP

作者:Peter Todd

RME 的 Hammerfall HDSP 声卡是一款功能强大的专业级声卡,在全球各地的录音棚中使用。它也可以在 Linux 下使用 ALSA 项目驱动程序。例如,您普通的消费级声卡,比如 Sound Blaster Live!,其设计目的是将声音输出到一组扬声器,无论是立体声设置还是环绕声。声音输入,例如来自麦克风的输入,是由极少数需要它的程序完成的独立功能。另一方面,HDSP 被设计为声音 I/O 设备。它有输入和输出,您可以在它们之间任意路由声音。这就像网卡和路由器之间的区别。当然,网卡很有用,但是如果您想运行网络或录音棚,您需要一个功能齐全的路由器。

那么,到底是什么让 HDSP 如此特别呢?首先,它实际上由两个部分组成,一个 PCI 或 PCMCIA 主机卡和一个外部声音 I/O 模块。卡和模块通过 10 英尺的 Firewire 电缆连接,尽管使用的协议实际上不是 Firewire。有两种类型的声音模块可供选择,Multiface 和 Digiface。Multiface 提供八个通道的模拟 I/O 和数字 SPDIF,以及 ADAT 输入和输出,总共 20 个通道的 24 位/96kHz 音频。Digiface 提供三个 ADAT 输入和输出以及 SPDIF,总共 26 个通道。通过这种分离式设计,您可以购买例如一个 Multiface,并在您的台式机和笔记本电脑之间共享它。一个使用场景是在现场 DJ 表演中。您不必购买两张完整的声卡,这为您节省了资金,而且您还可以在台式机上测试软件,因为知道环境与笔记本电脑上的环境相同。

本文重点介绍将 Multiface 模块与 PCI 主机卡一起使用。如果您有不同的硬件,本文的大部分内容仍然适用,并且在可能的情况下,我包含了有关差异的信息。

架构

图 1 显示了声音如何在 HDSP 内部路由。顶部是输入,模拟、ADAT 等等,通道号在下方。底部是输出,同样带有通道号。中间是矩阵混音器,它执行实际的声音路由。在矩阵混音器中,任何输入通道都可以路由到任意数量的输出通道,每个通道都具有可选择的增益。所有路由都在 HDSP 内部执行,主机 CPU 负载为零。这使您可以完全灵活地路由声音,例如,甚至允许模拟输入直接进入数字 SPDIF 输出,而无需中间的软件,也无需加载主机 CPU。

Using the Hammerfall HDSP on Linux

图 1. Hammerfall HDSP 内的声音路由

顶部的播放框实际上是指播放声音的应用程序。假设您想用 xmms 播放一个简单的立体声 MP3。前两个播放通道将用于左声道和右声道。这些通道映射到通道号 26 和 27,然后像任何其他输入一样处理。这种方法有趣之处在于,播放通道与任何其他输入通道具有相同的灵活性。例如,您可以将一个播放通道同时发送到多个硬件输出,甚至可以将播放通道与硬件输入混合以产生一个输出。与所有其他输入通道不同,播放通道为每个通道都有一个主增益控制。

最后,由于各种实现细节,HDSP 在高于 48kHz 的采样率下工作方式略有不同。由于 ADAT 在采样率小于或等于 48kHz 时有八个通道,而在采样率大于 48kHz 时只有四个通道,因此该卡使用两种模式来区分它们,SingleSpeed 模式和 DoubleSpeed 模式。在 SingleSpeed 模式下,在 Multiface 上有 18 个通道,输入和输出。在 DoubleSpeed 模式下,这减少到 14 个。这意味着应用程序使用的通道号会发生变化。在 SingleSpeed 模式下,SPDIF 在通道 16 和 17 上,而在 DoubleSpeed 模式下,这变为通道 12 和 13。不幸的是,ALSA 无法通知应用程序通道数量正在减少,因此您必须在切换两种模式之间关闭所有使用 HDSP 的应用程序。但是,矩阵混音器通道号不会更改。

硬件设置

www.alsa-project.org 下载并安装最新稳定版本的 ALSA 驱动程序。您需要编译并安装 alsa-tools 中的 HDSP 模块和 hdsploader 程序。最好确保 snd-hdsp 模块在启动时首先加载,因为它需要为 DMA 传输保留一些连续的内存块。如果它无法保留此内存,则该卡将无法工作。但是,首先加载 HDSP 模块会使其成为 ALSA 中的默认声音设备。如果您打算使用另一张卡进行常规声音 I/O,强烈建议这样做,请在使用模块时使用 index 参数。例如,我的 modules.conf 文件顶部有这两行,首先加载我的 HDSP,然后加载我的 Sound Blaster Live!

snd-hdsp index=1
snd-emu10k1 index=0

本文中使用 amixer 的所有命令行示例都假定您的 HDSP 的索引为 1。完成后,运行 hdsploader 程序以将正确的固件加载到 Multiface 或 Digiface 中。最好确保每次加载驱动程序时都完成此操作,因此将其添加到您的启动脚本中。如果您拔下 Multiface 或 Digiface,您还需要重新加载 snd-hdsp 模块,并在重新插入时再次运行 hdsploader。

最后,您应该在 /etc/asound.conf 或您的主目录中的 .asoundrc 文件中添加几行。HDSP 以非交错模式运行,许多应用程序无法使用该模式。您通常也只想处理许多可用输入和输出通道的子集。使用 asoundrc,您可以为不同的通道集附加标签。因此,您可以引用 hdsp_spdif 而不是引用通道 16 和 17。深入了解 asoundrc 配置超出了本文的范围,但以下内容应该是使用 Multiface 的一个好的开始。如果您有 Digiface,则标签将是错误的;hdsp_analog 将对应于您的第一个 ADAT 连接器,hdsp_adat 将对应于您的第二个 ADAT 连接器,而 hdsp_spdif 将是错误的。有关在这种情况下正确配置 asoundrc 的详细信息,请参阅 asoundrc 文档。

pcm.hdsp {
        type hw
        card 1
}

ctl.hdsp {
        type hw
        card 1
}

pcm.hdsp_analog {
        type plug
        ttable.0.0 1
        ttable.1.1 1
        ttable.2.2 1
        ttable.3.3 1
        ttable.4.4 1
        ttable.5.5 1
        ttable.6.6 1
        ttable.7.7 1
        slave.pcm hdsp
}

pcm.hdsp_adat {
        type plug
        ttable.0.8  1
        ttable.1.9  1
        ttable.2.10 1
        ttable.3.11 1
        ttable.4.12 1
        ttable.5.13 1
        ttable.6.14 1
        ttable.7.15 1
        slave.pcm hdsp
}

pcm.hdsp_spdif {
    type plug
    ttable.0.16 1
    ttable.1.17 1
    slave.pcm hdsp
}

测试 HDSP——播放和录制声音

现在模块已加载,并且 hdsploader 已运行,我们可以尝试使用 aplay 播放声音。像任何其他 ALSA 驱动程序一样,HDSP 驱动程序在启动时会静音所有通道,因此首先您需要为您的播放通道正确设置增益控制或音量。一种方法是简单地运行alsamixer -c 1。当条形图位于 50% 时,通道以大约 0dB 增益输出。更精确的方法是直接使用 amixer。增益如下

    0 = -inf dB
32768 =    0 dB
65535 =   +6 dB

将所有通道设置为 0dB 增益的简单方法是使用以下脚本

#!/bin/bash
for i in $(seq 1 18);do
	amixer -c 1 cset name=Chn,index=$i 32768
done

现在您已经完成了这些操作,将您的扬声器连接到前两个模拟输出,并尝试以下操作

aplay -D hdsp_analog some_stereo_file.wav

如果一切顺利,您应该看到类似这样的内容

Playing WAVE 'some_stereo_file.wav' : Signed 16 bit 
    Little Endian, Rate 48000 Hz, Stereo

默认情况下,播放通道连接到它们各自的硬件输出;如果您的设置不是这种情况,您将听不到任何声音。如果是这种情况,请阅读以下有关配置矩阵混音器的部分。

您还可以更改 -D 选项以将音频发送到不同的通道。例如,使用 hdsp_adat 会将音频发送到前两个 adat 通道;hdsp_spdif 将转到 spdif 输出。所有这些都由 asoundrc 控制。

如果播放声音有效,请尝试使用 arecord 录制声音。这次,将声源连接到您的前两个模拟通道,并运行以下命令

arecord -D hdsp_analog -f dat recording.wav

按 Crtl-C 停止录制。如果一切正常,recording.wav 应该是一个 48kHz 的立体声文件。在这种情况下,矩阵混音器对录制的内容没有影响;录制的第一个通道始终对应于第一个硬件输入,依此类推。

在 SingleSpeed 和 DoubleSpeed 模式之间切换——使用 96kHz

如上所述,在使用 HDSP 的所有软件都必须在 SingleSpeed 和 DoubleSpeed 模式之间切换之前关闭。但通常,软件会设置采样率。那么现在怎么办?嗯,有一个与 AutoSync 功能(稍后会详细介绍)相关的设置可以完成这项工作,即 Sample Clock Source(采样时钟源)。我现在不会确切解释它是如何工作的,但基本上,通过将内部时钟设置为不同的频率,该卡会自动切换模式。例如,要切换到 DoubleSpeed 模式,请运行

amixer -c 1 cset numid=11 6

要切换回 SingleSpeed 模式,请运行

amixer -c 1 cset numid=11 3

在这两种情况下,都不要忘记确保当前没有应用程序正在使用声卡。

矩阵混音器

声音路由是 HDSP 提供的最强大的功能。不幸的是,由于它不是许多声卡上的功能,因此用于控制它的界面不是 ALSA 标准。从 ALSA 0.9.3 版本开始,矩阵混音器界面在某种程度上是一种 hack,并且可能会发生变化。可以向其中写入值,但不能将其读回。在任何情况下,使用的语法都是 source,destination,gain,其中 gain 如上所述,source 和 destination 如下

对于 Multiface

input: 0-7 (analog), 16-23 (adat), 
      24-25 (spdif), 26-43 (playback)
output: 0-7 (analog), 16-23 (adat) 
        24-25 (spdif), 26-27 (line out)

对于 Digiface

input_source : 0-25  (physical channels), 
               26-51 (playback)
output_source : 0-25 (physical channels), 
               26-27 (line out)

Multiface 的路由也如图 1 所示。默认情况下,播放通道按顺序路由到硬件输出通道。所有其他可能的连接都被静音(0 或 -inf dB 增益)。

要更改条目,请使用以下命令

amixer -c 1 cset numid=5 src,dest,gain

例如,您可以使用以下命令将 SPDIF 输入定向到模拟输出

amixer -c 1 cset numid=5 24,0,32768
amixer -c 1 cset numid=5 25,1,32768

完成后,再次运行这些命令,但将增益设置为 0 而不是 32768。不要忘记,您可以将多个通道连接到一个输出,或将单个输入连接到多个输出。任何组合都是可能的——发挥您的想象力。

使用 SPDIF

HDSP Multiface 上的 SPDIF 非常简单明了;但是,由于 ADAT 和光纤 SPDIF 共享相同的光纤连接器,因此您需要调整一些混音器控件。Digiface 也使用类似的设置,但由于无法访问其中一个,我不知道确切的细节。要为 SPDIF 启用光纤输入,请更改 IEC958 Input Connector 设置

numid=6,iface=PCM,name='IEC958 Input Connector'
; type=ENUMERATED,access=rw---,values=1,items=3
; Item #0 'ADAT1'
; Item #1 'Coaxial'
; Item #2 'Internal'
: values=2

在驱动程序的更高版本中,将值设置为 Internal 似乎会在光纤 (ADAT1) 和同轴之间自动选择,而在其他版本中则不执行任何操作。我不知道您的驱动程序的行为会是什么,因此您应该自己检查一下。

光纤输出类似。默认情况下,SPDIF 输出仅转到同轴连接器,但当启用 IEC958 Output(也在 ADAT1 上,numid 7)时,输出也会转到光纤连接器。

采样时钟和 AutoSync

像所有数字音频设备一样,HDSP 需要时钟源才能工作。这可以来自内部时钟发生器或外部数字源,例如 ADAT 或 SPDIF 输入或字时钟。当从外部数字源录制时,这很重要;如果时钟未正确同步,则可能会导致丢帧和咔哒声。当时钟来自内部源时,HDSP 被称为在主模式下运行,如果时钟来自外部源,则称为从模式。如图 2 所示,各种时钟源进入 AutoSync 系统,然后 AutoSync 系统向时钟用户发送单个时钟信号。

Using the Hammerfall HDSP on Linux

图 2. AutoSync 系统决定使用哪个时钟信号。

AutoSync 决定使用哪个时钟信号。这由 Sample Clock Source 设置和 Preferred Sync Reference 设置控制。前者 Sample Clock Source 确定 HDSP 是在主模式还是从模式下运行。其可能的设置如下

numid=11,iface=PCM,name='Sample Clock Source'
; type=ENUMERATED,access=rw---,values=1,items=7
; Item #0 'AutoSync'
; Item #1 'Internal 32.0 kHz'
; Item #2 'Internal 44.1 kHz'
; Item #3 'Internal 48.0 kHz'
; Item #4 'Internal 64.0 kHz'
; Item #5 'Internal 88.2 kHz'
; Item #6 'Internal 96.0 kHz'
: values=0

如果您指定 AutoSync, 0,则 HDSP 在从模式下运行,并遵循外部时钟源。在此模式下,只有当采样率与外部采样率匹配时,播放声音才有效;否则,您将收到错误消息。此外,如果没有可用的有效外部时钟,驱动程序将不允许您切换到 AutoSync 模式。任何其他设置都会将内部时钟源采样率设置为指定的频率。一旦卡未处于 AutoSync 模式,以与当前采样率不同的采样率播放声音会更改当前采样率。

另一个设置 Preferred Sync Reference 在您连接了多个可能的时钟源但需要指定要用作时钟源的时钟源时很有用。假设您有一个通过 SPDIF 连接的消费级 CD 播放器和一个通过 ADAT 连接到您的 HDSP 的八轨磁带录音机。几乎没有消费级 CD 播放器可以在从模式下运行并接收时钟信号。因此,CD 播放器必须是主设备。但是,AutoSync 通常会尝试首先同步到 ADAT。现在怎么办?嗯,通过将 Preferred Sync Reference 设置为 IEC958 (SPDIF),AutoSync 将时钟同步到 CD 播放器。然后可以通过其他方式同步磁带录音机。Multiface 上 Preferred Sync Reference 的可能设置如下

numid=13,iface=HWDEP,name='Preferred Sync Reference'
; type=ENUMERATED,access=rw---,values=1,items=4
; Item #0 'Word'
; Item #1 'ADAT Sync'
; Item #2 'IEC958'
; Item #3 'ADAT1'
: values=2

ADAT Sync 和 ADAT1 是不同的东西。ADAT1 是指光纤 ADAT 连接,ADAT Sync 是指 D-sub 9 针 ADAT Sync 连接器。还有一堆只读混音器项目显示同步的各个方面,输入amixer -c 1 contents以查看所有这些项目。

最常见的 Linux 声音问题是,“我的声音出现咔哒声和丢帧!” 这可能是由多种因素引起的,例如 PCI 总线带宽、不符合标准的 PCI 卡、过小的块大小或延迟。如果可能,请安装低延迟内核补丁或 2.6 内核(如果在本文发表时可用),并确保您的音频程序设置为使用实时调度。您也可以尝试增加程序使用的块大小。对于硬件困难,已知各种 PCI 卡,例如某些 3Com 网卡和 RAID 控制器,不遵循 PCI 总线规范并使用比它们应该使用的更多的带宽,从而使 HDSP 缺乏带宽。您可能还需要更改 PCI 延迟计时器设置;有关此信息,请参阅 www-106.ibm.com/developerworks/library/l-hw2.html。已知某些主板的 PCI 总线性能也很差。RME 的网站在硬件不兼容方面提供了相当多的信息。我建议查看支持部分,无论是在购买 Hammerfall 之前还是之后。

结束语

希望本文能帮助您使用 Hammerfall,并为您节省一些时间和麻烦来弄清楚它是如何工作的。此时,您可能想知道“接下来该怎么办?” 如果是这样,请尝试以下一些与您的 HDSP 一起使用的开源软件

Peter Todd 从 14 岁起就开始使用 Linux。他有一份兼职工作,是一家小型基于 Linux 的录音棚的首席技术员,并且非常感谢他的老板给他时间和设备来撰写本文。当他不工作时,他会在 Wexford Collegiate 上学,目前在那里学习陶瓷和图形设计。

加载 Disqus 评论