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

How to set AVAudioEngine input and output devices (swift/macos)

我四处寻找,找不到解决这个问题的办法。我正在寻找一种方法来更改 AVAudioEngine 将在 macOS 上使用的 input/output 设备。

当简单地播放一个音频文件时,下面的工作如预期的那样:

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 required condition is false: [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) 尽管如果我 select 具有输入和输出的声卡它会成功 - 看起来当我尝试要设置输出或输入节点,它实际上是为两者设置设备。

我认为这意味着 AVAudioEngine 实例只能处理一个设备,但是它很乐意使用默认设备(麦克风和 speakers/headphones),所以我有信心不是问题。查看一些解决方案,我看到网上有人只是更改默认输入,但这不是一个非常好的解决方案。

有人知道这是否可行吗?

值得注意的是,kAudioOutputUnitProperty_CurrentDevice 是唯一可用的 属性,没有等效的 kAudioInputUnitProperty_CurrentDevice 密钥,因为据我了解 [=15] =] 和 outputNode 被归类为 "Output Units"(因为它们都在某处发出声音)。

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

谢谢

所以我就这个问题和另一个问题向苹果提出了支持请求,响应确认 AVAudioEngine 只能分配给单个聚合设备(即具有输入和输出通道的设备)——系统默认单元在内部有效地创建了一个聚合设备,这就是它们工作的原因,尽管我发现了一个额外的问题,如果输入设备也有输出功能(并且你激活了 inputNode),那么该设备必须既是输入又是输出设备,否则输出似乎不起作用。

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