Audio Unit で、コールバック関数を登録するための方法が何通りかあって、何だかややこしかったので整理してみました。
AudioUnitSetProperty
まず一番基本的なものである AudioUnitSetProperty から。
AURenderCallbackStruct callbackStruct; callbackStruct.inputProc = renderCallback; callbackStruct.inputProcRefCon = &audioDataInfo; AudioUnitSetProperty(hogeUnit, // 対象となるAudio Unit kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, // スコープ 0, // バスナンバー &callbackStruct, // AURenderCallBackStruct構造体へのポインタ sizeof(callbackStruct) // AURenderCallBackStruct構造体のサイズ );
AudioUnitSetProperty は Audio Unit に対して各種プロパティをセットするための関数です。ここでは {対象となるAudio Unit}{スコープ}{バスナンバー} に対して kAudioUnitProperty_SetRenderCallback というプロパティに AURenderCallBackStruct 型の値を指定しています。
引数は多いですが、そのぶん暗黙的な部分がなくてわかりやすいです。
AUGraphSetNodeInputCallback
こちらは AUGraph の特定のノードの入力に対してコールバック関数を指定するための関数。
AURenderCallbackStruct callbackStruct; callbackStruct.inputProc = renderCallback; callbackStruct.inputProcRefCon = &audioDataInfo; AUGraphSetNodeInputCallback(processingGraph, // 対象となるAUGraph hogeNode, // 対象となるAUNode 0, // バスナンバー &callbackStruct // AURenderCallBackStruct構造体へのポインタ );
暗黙的にスコープは kAudioUnitScope_Input、構造体のサイズは AURenderCallBackStruct のサイズなので、AudioUnitSetProperty と比較するとこれら2つ分の引数が省略されています。
AUGraphAddRenderNotify
こちらは AUGraph がレンダリングを行った際に通知を受けるコールバック関数を登録するための関数。
AUGraphAddRenderNotify(processingGraph, renderCallback, (__bridge void *)(self));
これを使用した場合、AUGraph の最後、たとえば Remote IO Unit でスピーカー出力している場合は、その出力時に通知を受け、コールバックが呼ばれるようになります。
AURenderCallbackStruct 構造体を介さず直接コールバック関数と、コールバック関数で参照するデータ(inputProcRefCon にセットしていたもの)を渡します。