如何在OS X中以编程方式创建多输出设备?

Jus*_*iey 5 audio macos objective-c core-audio

如何在Mac OS X中以编程方式创建多输出设备?

Audio Midi Setup程序提供了一个用于创建一个的GUI界面,但是我希望能够用代码创建一个。

我已经找到了一些用于创建聚合设备的资源,但是多输出设备的功能有所不同,在创建它们时找不到任何东西。到目前为止,这是我得到的:

小智 6

我同样需要以编程方式创建多输出设备。这个例子:http : //daveaddey.com/?p=51涵盖了需求。

我通过学习 /Library/Preferences/Audio/com.apple.audio.SystemSettings.plist 设法做到了。这是音频 MIDI 设置保存配置的地方(在我的盒子上,El Capitan)。

创建一个多输出设备和一个聚合设备并研究 plist。它们几乎相同,只是聚合设备有一个主设备,而 MOD 没有。

考虑 Dave Addey 的例子:我首先通过移除主设备并添加我自己的设备作为输出来创建 MOD。(在我的情况下,Soundflower 和默认输出)

除此之外,将“堆叠”布尔键添加到 CF 字典。根据 CoreAudio 消息来源,此键可确保将相同的输出发送到所有输出通道,而不是未堆叠的聚合设备,并将多个设备组合在一起,使自己“看起来”为具有许多通道的单个设备.

希望这可以帮助。

  • 是的!从 macOS 10.9 开始,您可以使用 `AudioHardwareCreateAggregateDevice` + `kAudioAggregateDeviceIsStackedKey` 来实现,尽管两种聚合设备都不支持音量控制,这是一种耻辱。 (2认同)

Rhy*_*man 5

这基本上是@Andrei B. 的答案,链接的 [now dead] 博客帖子代码已更新为使用AudioHardwareCreateAggregateDevice()kAudioAggregateDeviceIsStackedKey符号(而且很快,抱歉,我没有阅读问题):

func createMultiOutputAudioDevice(masterDeviceUID: CFString, secondDeviceUID: CFString, multiOutUID: String) -> (OSStatus, AudioDeviceID) {
    let desc: [String : Any] = [
        kAudioAggregateDeviceNameKey: "My Multi-Output Device",
        kAudioAggregateDeviceUIDKey: multiOutUID,
        kAudioAggregateDeviceSubDeviceListKey: [[kAudioSubDeviceUIDKey: masterDeviceUID], [kAudioSubDeviceUIDKey: secondDeviceUID]],
        kAudioAggregateDeviceMasterSubDeviceKey: masterDeviceUID,
        kAudioAggregateDeviceIsStackedKey: 1,
        ]

    var aggregateDevice: AudioDeviceID = 0
    return (AudioHardwareCreateAggregateDevice(desc as CFDictionary, &aggregateDevice), aggregateDevice)
}
Run Code Online (Sandbox Code Playgroud)

太糟糕了,多输出设备没有音量控制,当它们成为默认输出设备时,这使得它们不太有用。

  • 感谢您“具体化”死链接;-) (3认同)
  • 在回程机的帮助下 (2认同)