我们一直在使用 Core Audio 中的 AudioUnits。它同时是一个非常强大的音频框架,也是记录最差的框架之一,使用它既令人愉悦又令人沮丧。
我们想要完成一些我们知道 iPad 自 iOS 6.0 以来就能够做到的事情——多音频输入。
到目前为止 - 从 2012 年的开发者谈话中 - 看来您必须将音频会话设置为 MultiRoute。我们已经做到了。如果我从键盘插入声卡。我可以看到有两个输入。伟大的。然后我们被告知需要在远程 I/O 单元上设置 ChannelMap。
到什么?嗯......这就是它变得模糊的地方。我们需要将所有不想设置为 -1 的通道以及我们想要设置为 0 和 1 的通道(用于立体声输入还是用于单声道?)。
我们尝试这个并且......什么都没有。声音仍然在“最后获胜”的原则中发挥作用。麦克风,如果一切都插上,声卡,如果那是插入的。但我们不能在它们之间切换。
此设置代码始终在列出的其他功能之前运行
func setupAudioSession() {
self.audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryMultiRoute, with: [.mixWithOthers])
try audioSession.setActive(true)
audioSessionWasSetup = true
} catch let error {
//TODO: Implement something here
print(error)
audioSessionWasSetup = false
}
}
然后,我们有一个远程 I/O 并设置了相关的听力图。这已经过测试并且效果很好。但是我们需要能够设置它从哪里拉声音。
我试图这样做,但它不仅没有任何效果......没有任何反应。
我错过了什么吗?
private func setChannelMap(onAudioUnit audioUnit: AudioUnit?, toChannel channelIndex: Int = 0) {
var channelMap: [Int32] = []
if audioUnit == nil {
return
}
var numberOfInputChannels: UInt32 = 4 // Two stereo inputs? - I'm just guessing here
let mapSize: UInt32 = numberOfInputChannels * UInt32(MemoryLayout<Int32>.size);
for _ in 0...(numberOfInputChannels) {
channelMap.append(-1)
}
channelMap[2 * channelIndex] = 0;
channelMap[2 * channelIndex + 1] = 1;
let status = AudioUnitSetProperty(audioUnit!,
kAudioOutputUnitProperty_ChannelMap,
kAudioUnitScope_Input,
0,
&channelMap,
mapSize);
self.checkError(status, "Failed to set Channel Map on input unit")
}
据我所知,根本没有任何关于此的文档。也没有任何代码示例。
我希望你能帮助我们。