その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Audio Unitのコールバック関数を登録する方法3種の比較

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