2

私たちは Core Audio で AudioUnits を扱ってきました。これは非常に強力なオーディオ フレームワークであると同時に、文書化されている最悪のフレームワークの 1 つであるため、作業するのが楽しみであると同時に不満でもあります。

私たちは、iOS 6.0 以降の iPad で可能だったことを実現したいと考えています - 複数のオーディオ入力。

これまでのところ - 2012 年の Developer Talk から - オーディオ セッションを MultiRoute に設定する必要があるようです。これを行いました。キーボードからサウンドカードを接続した場合。2 つの入力があることがわかります。偉大な。次に、リモート 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