iOS中的MultiRoute音频输入

时间:2018-03-27 13:02:10

标签: core-audio remoteio

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

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

我希望你能帮助我们。

0 个答案:

没有答案