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
にセットしていたもの)を渡します。