如何设置AVAudioEngine输入和输出设备(swift / macos)

时间:2020-05-15 20:34:27

标签: swift macos core-audio avaudioengine

我高低寻觅,找不到解决此问题的方法。我正在寻找一种更改AVAudioEngine将在macOS上使用的输入/输出设备的方法。

当简单地播放音频文件时,将按预期工作:

var outputDeviceID:AudioDeviceID = xxx 
let result:OSStatus = AudioUnitSetProperty(outputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &outputDeviceID, UInt32(MemoryLayout<AudioObjectPropertyAddress>.size))
if result != 0  {
   print("error setting output device \(result)")
   return
}

但是,如果我初始化音频输入(使用let input = engine.inputNode),则在尝试启动引擎时会收到错误消息:

AVAEInternal.h:88必需条件为假:[AVAudioEngine.mm:1055:CheckCanPerformIO:(canPerformIO)]

我知道我的播放代码正常,因为如果我避免更改输出设备,则可以听到麦克风和音频文件,并且如果更改输出设备但不初始化inputNode文件将播放到指定的目的地。

除此之外,我一直在尝试更改输入设备,我从不同的地方了解到以下应该执行此操作:

let result1:OSStatus = AudioUnitSetProperty(inputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Output, 0, &inputDeviceID, UInt32(MemoryLayout<AudioObjectPropertyAddress>.size))
if result1 != 0  {
    print("failed with error \(result1)")
    return
}

但是,这不起作用-在大多数情况下,它会引发错误(10853),尽管如果我选择同时具有输入和输出的声卡,则它会成功-似乎在尝试设置输出或输入节点,实际上是为两者设置设备。

我认为这意味着AVAudioEngine实例只能处理一台设备,但是使用默认设备(麦克风和扬声器/耳机)非常高兴,因此我相信不是问题。查看一些解决方案后,我发现在线用户只是更改默认输入即可,但这并不是一个很好的解决方案。

有人对这是否可能有任何想法吗?

值得注意的是,kAudioOutputUnitProperty_CurrentDevice是唯一可用的属性,没有等效的kAudioInputUnitProperty_CurrentDevice键,因为据我所知,inputNode和{{1 }}被归类为“输出单元”(因为它们都在某处发出声音)。

任何想法都将不胜感激,因为这非常令人沮丧!

谢谢

1 个答案:

答案 0 :(得分:1)

因此,我就此问题和另一个问题向Apple提出了支持请求,并且响应确认AVAudioEngine只能分配给单个聚合设备(即具有输入和输出通道的设备)-系统默认单位在内部有效地创建聚合设备,这就是它们起作用的原因,尽管我发现另一个问题是,如果输入设备还具有输出功能(并且您激活了inputNode),则该设备必须同时是输入和输出设备,因为否则输出似乎无法正常工作。

所以答案是我认为没有答案。