我找遍了所有的地方,都没有找到解决这个问题的方法。我正在寻找一种方法来改变输入输出设备,而这种设备是由一个独立的输入输出设备组成的。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
钥匙,因为据我了解,这两个。inputNode
和 outputNode
被归类为 "输出单元"(因为它们都在某个地方发出声音)。
任何想法将是非常感激的,因为这是非常非常令人沮丧的!!
谢谢你
所以我就这个问题和另一个问题向苹果提出了支持请求,得到的答复证实了一个AVAudioEngine只能被分配到一个单一的Aggregate设备(也就是一个具有输入和输出通道的设备)--系统默认的单元在内部有效地创建了一个聚合设备,这就是为什么它们可以工作的原因,不过我发现了一个额外的问题,如果输入设备也具有输出功能(并且你激活了inputNode),那么这个设备必须同时是输入和输出设备,因为否则输出似乎就不能工作了。
所以答案是我认为没有答案...