オーディオファイルにエフェクトをバッチ処理でかけるような時に、AudioUnitを使って出来ないかと思ったのですが、そういう事ができそうなkAudioUnitType_OfflineEffectを取得しても、VariSpeedやTimePitchしか出てきません。しかし、Logicとかで出来てる事が出来ないはずはないと思い、普通のkAudioUnitType_Effectをオフラインで使える方法はないかと調べてみました。
リアルタイムでの処理をシミュレートするという形で調べた結果、ポイントのみをとりあえず書いておきます。
・AudioUnitRender関数を実行すると別のスレッドでエフェクト処理をしてしまうので、AudioUnitAddRenderNotifyで、エフェクト処理した後のタイミングでデータを受け取る関数を設定する。
・その関数内ではActionFlagsがkAudioUnitRenderAction_PostRenderの時が処理後のデータとなる。
・AudioUnitRender関数に渡すAudioBufferListを自前で用意する。NotInterleaved。1024フレーム分くらいがベスト(小さいと処理が遅く、大きいと受け付けてくれない)。
・AudioUnitRender関数に渡すAudioUnitRenderActionFlagsは0。
・AudioUnitRender関数に渡すAudioTimeStampはmSampleTimeだけ必要だが、同じ数字を連続で渡してはいけない(一つでもずらしていればOK)。
ここらへんを守って、一回の処理が終わるごとに次のAudioUnitRenderを呼び出す、といったところでしょうか。ちなみにこの方法だと再生しながらバックグラウンドで処理させるみたいな事は出来ないと思います。
なんか、オフラインモードに切り替えてAudioUnitRender呼ぶだけでいいなんていうスマートな方法ってないですかねぇ。