如何设置AVAudioEngine输入输出设备(swiftmacos)

问题描述 投票:0回答:1

我找遍了所有的地方,都没有找到解决这个问题的方法。我正在寻找一种方法来改变输入输出设备,而这种设备是由一个独立的输入输出设备组成的。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 required condition is false.[AVAudioEngine.mm:1055:CheckCanPerformIO: (canPerformIO)]。[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),虽然如果我选择了一个声卡,有输入和输出,它成功 - 似乎当我试图设置输出或输入节点,它实际上是设置两个设备。

我想,这意味着,如果我选择的声卡同时有输入和输出,就会出现错误(10853)。AVAudioEngine 实例只能处理一个设备,但是它很高兴与默认设备(麦克风和扬声器耳机)一起工作,所以我相信这不是问题所在。我在网上看到一些解决方案,人们只是简单地改变默认输入,但这不是一个非常好的解决方案。

有没有人有什么想法,是否可以这样做?

值得注意的是 kAudioOutputUnitProperty_CurrentDevice 是唯一可用的属性,没有等价的。kAudioInputUnitProperty_CurrentDevice 钥匙,因为据我了解,这两个。inputNodeoutputNode 被归类为 "输出单元"(因为它们都在某个地方发出声音)。

任何想法将是非常感激的,因为这是非常非常令人沮丧的!!

谢谢你

swift macos core-audio avaudioengine
1个回答
1
投票

所以我就这个问题和另一个问题向苹果提出了支持请求,得到的答复证实了一个AVAudioEngine只能被分配到一个单一的Aggregate设备(也就是一个具有输入和输出通道的设备)--系统默认的单元在内部有效地创建了一个聚合设备,这就是为什么它们可以工作的原因,不过我发现了一个额外的问题,如果输入设备也具有输出功能(并且你激活了inputNode),那么这个设备必须同时是输入和输出设备,因为否则输出似乎就不能工作了。

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

© www.soinside.com 2019 - 2024. All rights reserved.