2

我们一直在使用 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")
}

据我所知,根本没有任何关于此的文档。也没有任何代码示例。

我希望你能帮助我们。

4

0 回答 0