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

时间:2016-02-17 23:06:03

标签: objective-c macos audio core-audio

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

创建多输出设备和聚合设备并研究plist。它们几乎相同,除了聚合设备有主设备这一事实,而MOD没有。

考虑Dave Addey的例子: 我是一个,通过删除主设备并添加我自己的设备作为输出设法创建MOD。 (在我的例子中,Soundflower和默认输出)

除此之外,添加"堆叠" CF字典的布尔键。根据CoreAudio的消息来源,这个密钥可确保将相同的输出发送到所有输出通道,而不是未堆叠的聚合设备,并将多个设备组合在一起以使其自身“看起来”。作为一个拥有大量频道的单一设备。

希望这有帮助。

答案 1 :(得分:0)

这基本上是@Andrei B.的答案,带有链接的[现在已死]博客邮政编码 已更新为使用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)
}

糟糕的多输出设备没有音量控制,这使它们在成为默认输出设备时没有太大用处。

相关问题