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

9

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

音频Midi设置程序提供了一个GUI界面来创建一个,但我想能够在代码中创建一个。

我已经找到了一些资源来创建聚合设备,但是多输出设备的功能不同,我找不到任何关于创建它们的信息。以下是我的进展:


通过Objective-C/Swift编程,还是通过AppleScript脚本化应用程序? - jkdev
@jkdev 通过 Objective-C/Swift - Justin Poliey
2个回答

7

我也有同样的需求,需要通过程序创建多输出设备。

这个例子: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不是堆叠的,它结合了多个设备,使自己看起来像一个具有许多通道的单一设备。

希望这可以帮到你。


谢谢!这节省了我很多时间。 - Andy Hin
太棒了!我想知道是否可以使用更现代的 AudioHardwareCreateAggregateDevice(),还是仍然要通过插件接口进行? - Rhythmic Fistman
2
是的!从macOS 10.9开始,您可以使用AudioHardwareCreateAggregateDevice + kAudioAggregateDeviceIsStackedKey来实现,尽管聚合设备的两种类型都不支持音量控制,这真是遗憾。 - Rhythmic Fistman

5

这基本上是 @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)
}

很遗憾,多输出设备没有音量控制,这使它们在成为默认输出设备时不太有用。


3
谢谢您“实现”失效的链接;-) - Teejay
2
借助于Wayback Machine的帮助 - Rhythmic Fistman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接