音频输出进阶技巧:当“聚合设备”(Aggregate Devices)失效时的替代方案
在 OSx86 上修补好 AppleHDA 后,若想让模拟音频输出(Line Out)与数字光纤/同轴(S/PDIF)同时发声,内置的“聚合设备”往往只会从单一接口输出且缺乏软件音量控制。本文分享结合 Soundflower 与 Xcode AU Lab 实现全音箱同步输出与音量调节的实战方案。
- 主笔作者
- @Dies 发表于 2008-11-28
- 所属专区
- OSx86 10.X 核心架构与安装配置
- 典藏规模与记录
- 212,798 次历史阅读 · 5 则精选技术笔记(萃取自 6 则原始回帖) · 2008-11-28 – 2011-11-13
- 参与贡献成员 (5)
- @Dies (2)@Ianxxx@fahrvergnuugen@mr_murder@zorro23
- 相关硬件参考
- Mac USB Audio DACs ↗ SATA III & NVMe SSDs ↗ USB 3.2 Boot Flash Drives ↗
我不确定这是只有我的硬件配置才会遇到的特殊情况,还是其他人也面临着同样的困扰,但我觉得背后的原理应该能帮到想实现类似多声道同步输出需求的朋友。
至少对我而言,这方面的相关信息非常难找;而当我好不容易找到解决方案时,内容却早已过时。我原本也很想在这里附上当年那篇讨论帖的链接,但无奈实在找不回来了……
对我来说,在非标准 PC 硬件上运行 OS X 的一大缺点在于音频路由机制:其他主流操作系统只要装好驱动程序,就能毫不费力地自动将音频同时传送到所有可用的输出接口;然而 OS X 处理这件事的方式却截然不同。在标准 Apple 硬件环境下,CoreAudio 或许是一套更优秀的音频架构,但在这种情况下却显得相当不够友好。
在完成 HDA 声卡驱动修补后,系统成功识别内置声卡,耳机孔、音频输出(Line Out)、S/PDIF 数字输出与麦克风全都工作正常,非常棒。接下来我只需要让声音同时从 Line Out 与 S/PDIF 输出即可。照理说这应该不成问题,我在网上查到的所有资料都说只要创建一个“聚合设备”(Aggregate Device)就能“即设即用”。
然而我的实际测试结果却是:
a.) 完全行不通!无论我怎么设置,声音永远只会从其中一个输出接口发出——也就是排在聚合设备列表最顶端的那个接口。
b.) 由于数字输出(Digital Out)在系统内不支持软件音量控制,这意味着就算聚合设备真的成功工作,我也完全无法通过软件调节该设备的音量。
最终我的解决方案是结合使用 Soundflower ↗ 以及包含在 Xcode 开发工具内的 AU Lab(路径为 /Developer/Applications/Audio/AU Lab)。安装 Soundflower 后,系统会新增两个虚拟音频设备(一个 2 声道、一个 16 声道),但在你配置路由之前它们并不会有任何实质作用,而这正是 AU Lab 派上用场的地方。
安装完 Soundflower 并重启后,我打开“音频 MIDI 设置”(Audio/MIDI Setup),新建了一个名为“Surround Sound”的聚合设备,并将“数字输出”(Digital Output)、“线路输出”(Line Out)以及新出现的“Soundflower (16ch)”勾选合并在一起。接着我打开 AU Lab 并开始配置这些新设备:在应用程序启动后出现的第一个窗口中,我添加了几组输出(Outputs),让它同时涵盖 Line Out 与 S/PDIF 的输出声道。
在下一个部分(Inputs),我只需要设置一组输入。
接下来的步骤就是关键所在:我点击“Input Channels”(输入声道),并选择“Soundflower (16ch)”设备;
然后点击“Output Channels”(输出声道),选择我稍早创建的“Surround Sound”聚合设备,再按下“Done”(完成)。
最终呈现出如下图的配置界面:
画面中额外加入的 Bus 1 与 Bus 2 作用就像功放一样,能让声音变得更响亮清晰;至于保留那组未使用的输出(Unused Output),是因为我发现如果不留着它的话,有时会出现刺耳的回授啸叫(Feedback)。
老实说,这个解决方案实在称不上优雅,而且本质上它并不是真正的环绕声(Surround Sound),而是将立体声复制输出;但它确实解决了我的问题!现在我的全部 7 个音箱加上低音炮都能同时发声,而且还能直接用系统软件调节总音量。最后只要将这个 AU Lab 配置文件设为“登录时自动打开”,平时只需将窗口最小化或右键隐藏起来,使用上就不会造成太大不便了。
希望这篇分享能对遇到相同问题的朋友有所帮助。
社区实测与技术补充笔记
自 6 则原始讨论回帖中萃取 5 则高价值技术回应
这招太管用了,非常感谢!
我还研究出一个不用每次开机都手动把窗口最小化的方法:
用 TextMate(或任何纯文本编辑器)打开保存好的 .trak(AU Lab 配置文件),滚动到最底部,将原本的:
<key>Window Frame</key>
<string>{{388, 40}, {355, 577}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{360, 540}</string>
修改为:
<key>Window Frame</key>
<string>{{1, 1}, {1, 1}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{1, 1}</string>
美中不足的是,如果在退出程序前没有先手动关闭该配置文件,退出时会弹出崩溃报错提示;不过鱼与熊掌不可兼得,这样已经很方便了。
另一个更优雅的解决方案是使用与 Soundflower 同属一家软件公司开发的“Upmix”程序,但遗憾的是它不仅是付费软件,而且售价高达近 500 美元!
版主编辑:抱歉 Ianxxx,我不小心误删了你帖文的前半段内容,请问方便重新补上吗?万分抱歉!
没问题 :-) Ian
我特地注册账号就是为了上来向你道谢!我整整花了两天时间研究怎样让我的 Mac 同时从两张声卡输出声音,真不敢相信在 OS X 下要做到这件事居然这么困难。
超赞的教程 (Y),非常感谢!希望未来能出现更“干净利落”的原生解决方案……目前看来 VoodooHDA 相当有希望。
@Diesa.) 完全行不通!无论我怎么设置,声音永远只会从其中一个输出接口发出——也就是排在聚合设备列表最顶端的那个接口。
播放双声道立体声(Stereo)音源时确实会这样,因为 OS X 并没有内置“音箱填充”(Speaker Fill)选项,音频只会被传送到媒体源所指定的对应独立声道(Discrete Channel)上。请问你有试过播放带有 AC3 5.1 声道的视频文件,并将 Perian 设为多声道输出吗?另外,Apple 内置的“DVD 播放程序”只支持通过 S/PDIF(数字输出)输出 5.1 环绕声,若要走模拟多声道输出则必须改用 VLC 播放器。
@Diesb.) 由于数字输出(Digital Out)在系统内不支持软件音量控制,这意味着就算聚合设备真的成功工作,我也完全无法通过软件调节该设备的音量。
S/PDIF 数字输出没有软件音量控制是很正常的吧?因为数字输出信号并不会经过软件层处理,而是直接原封不动地进行数字直通(Pass-thru)输出。
我自己是将 3 个模拟线路输出(Line-out)合并为一个 5.1 声道的聚合设备(芯片为 ALC888),但合并后同样会失去软件音量控制功能,我想这是 OS X“聚合设备”本身的架构限制。
不过我自己摸索出一个小技巧,遇到相同问题的朋友可以按照以下步骤强制启用软件音量控制:
1) 先在“系统偏好设置”›“声音”中,确保你打算使用的每一个独立输出接口音量都已调到最大。
2) 照常在“音频 MIDI 设置”中创建聚合设备,并配置好各个声道对应的音箱。
3) 使用 Soundflowerbed(Soundflower 附带的菜单栏工具),将聚合设备的 6 个声道分别映射到 Soundflower (16ch) 的前 6 个声道。
4) 将系统默认音频输出设为 Soundflower (16ch),并在“音频 MIDI 设置”中将其音箱配置设为多声道输出。
5) 大功告成!现在你的 5.1 声道系统就拥有完整的系统软件音量控制功能了!
希望这招能帮到大家……
@mr_murderS/PDIF 数字输出没有软件音量控制是很正常的吧?因为数字输出信号并不会经过软件层处理,而是直接原封不动地进行数字直通(Pass-thru)输出。
从纯技术角度来说,你说的当然没错,因为系统默认会假设负责接收解码该数字信号的后端设备(或最终输出设备)本身就具备音量控制功能。
但是,至少就我的使用经验而言,其他所有主流操作系统(无论是 Linux 还是 Windows)通常都会为系统内每一个可用的输出接口提供软件层级的音量控制功能。
特定输出设备的声音延迟(不同步)问题
现在到了 OS X Lion,在“音频 MIDI 设置”中创建“多输出设备”(Multi-Output Device)让多个接口同时发声已经变得非常简单了。
我的黑苹果主机同时使用标准模拟音频输出(Line-out,连接至立体声功放)以及 HDMI 音频输出(连接至 LG 液晶电视的内置小喇叭)。
但问题是,我的 LG 液晶电视那边会有非常明显的声音延迟(回音感)。
我正在寻找一种能够单独为模拟 Line-out 加上些许音频延迟、而数字输出保持零延迟的解决方案,这样两边的音箱就能完全同步发声了。
请问有人知道该怎么做到吗?
文献来源与贡献者溯源名录(共 5 位具名成员 · 原始讨论串 #1645)
| 成员用户名 | 本卷贡献角色 | 发帖数 | 活跃时间窗 |
|---|---|---|---|
| @Dies | 主笔作者 | 2 | 2008-11-28 → 2009-04-27 |
| @Ianxxx | 协作成员 | 1 | 2008-12-17 |
| @fahrvergnuugen | 协作成员 | 1 | 2009-04-03 |
| @mr_murder | 协作成员 | 1 | 2009-04-25 |
| @zorro23 | 协作成员 | 1 | 2011-11-13 |