複数のFile PlayerオーディオユニットをMultiChannelMixerユニットに供給してAUGraphをセットアップし、リモートI/O出力に送ります。この設定はうまくいきました。複数のファイルプレーヤーでのCore Audioサウンドメーター
私は個々のファイルプレーヤーの音量を計算できるようにコールバックを追加することに苦労しています。
private let meteringCallback: AURenderCallback = { (
inRefCon,
ioActionFlags,
inTimeStamp,
inBusNumber,
frameCount,
ioData) -> OSStatus in
var status = noErr
var track: AUTrack = unsafeBitCast(inRefCon, to: AUTrack.self)
status = AudioUnitRender(track.fileAU!,
ioActionFlags,
inTimeStamp,
inBusNumber,
frameCount,
ioData!);
var samples = [Float]()
let ptr = ioData!.pointee.mBuffers.mData?.assumingMemoryBound(to: Float.self)
samples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(frameCount)))
// ... fancy algorithm calculating DB value ...
}
AUTrack simpleは、特定のトラックに関する情報を保持します。クラスインスタンス全体をコールバックに渡すことは、複数のファイルプレーヤーが存在するため、ここでは意味がありません。
ここでこのコールバックをどこかに設定する必要があります。そのため、ミキサーに入る各ファイルプレーヤーの値を取得できます。しかし、私はそれをやろうとすると-10877(無効な要素)エラーが発生します。
これでメータリングコールバックをセットアップしようとします。
// Set metering callback
var meteringCallbackStruct = AURenderCallbackStruct(inputProc: meteringCallback,
inputProcRefCon: &self.tracks[1])
status = AudioUnitSetProperty(self.tracks[1].fileAU!,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Output,
0,
&meteringCallbackStruct,
UInt32(MemoryLayout<AURenderCallbackStruct>.size))
私はこれをどのように解決するのかよく分かりません。
私は何らかの形でミキサーユニットに戻さない限り、このコールバックはサンプルを「食べる」でしょうか?
ありがとうございました。これは私のための大きな助けです、私は自分のミキサーを書く途中でした。私はヘッダーファイルでこれらのパラメータが欠けているとは思えません。 :D –