如何在Mac OS X中以编程方式创建多输出设备?
音频Midi设置程序提供了一个GUI界面来创建一个,但我想能够在代码中创建一个。
我已经找到了一些资源来创建聚合设备,但是多输出设备的功能不同,我找不到任何关于创建它们的信息。以下是我的进展:
如何在Mac OS X中以编程方式创建多输出设备?
音频Midi设置程序提供了一个GUI界面来创建一个,但我想能够在代码中创建一个。
我已经找到了一些资源来创建聚合设备,但是多输出设备的功能不同,我找不到任何关于创建它们的信息。以下是我的进展:
我也有同样的需求,需要通过程序创建多输出设备。
这个例子:http://daveaddey.com/?p=51可以满足需求。
我通过研究/Library/Preferences/Audio/com.apple.audio.SystemSettings.plist实现了它。这是Audio MIDI Setup保存配置的地方(在我的机器上是El Capitan)。
创建一个Multi-Output Device和一个Aggregate Device并研究plist。它们几乎相同,除了Aggregate Device有一个主设备,而MOD没有。
考虑Dave Addey的例子:
我通过删除主设备并将我的设备添加为输出来创建了MOD。(在我的情况下,Soundflower和默认输出)
此外,将“stacked”布尔键添加到CF Dictionary中。根据CoreAudio源码,这个键确保将相同的输出发送到所有输出通道,而Aggregate Device不是堆叠的,它结合了多个设备,使自己看起来像一个具有许多通道的单一设备。
希望这可以帮到你。
AudioHardwareCreateAggregateDevice()
,还是仍然要通过插件接口进行? - Rhythmic FistmanAudioHardwareCreateAggregateDevice
+ kAudioAggregateDeviceIsStackedKey
来实现,尽管聚合设备的两种类型都不支持音量控制,这真是遗憾。 - Rhythmic Fistman这基本上是 @Andrei B. 的答案,用链接(现在已失效)的博客文章代码更新为使用 AudioHardwareCreateAggregateDevice()
和 kAudioAggregateDeviceIsStackedKey
符号(它是用 swift 编写的,抱歉,我没有看清问题):
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)
}
很遗憾,多输出设备没有音量控制,这使它们在成为默认输出设备时不太有用。