如何设置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),那么该设备必须既是输入又是输出设备,否则输出似乎不起作用。
所以答案是我认为没有答案..
我四处寻找,找不到解决这个问题的办法。我正在寻找一种方法来更改 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),那么该设备必须既是输入又是输出设备,否则输出似乎不起作用。
所以答案是我认为没有答案..