我们一直在使用Core Audio中的AudioUnits。它同时也是一个非常强大的音频框架,也是最糟糕的文档之一,它使得它既是一种快乐也是一种挫折。
我们希望完成自iOS 6.0以来iPad已经能够做到的事情 - 多个音频输入。
到目前为止 - 从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")
}
据我所知,根本没有任何关于此的文件。也没有任何代码示例。
我希望你能帮助我们。