私たちは 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")
}
私が見つけた限り、これに関するドキュメントはまったくありません。コード例もありません。
お役に立てば幸いです。