AudioUnit Mixer のコールバックで audioUnit Effect を使用して AudioUnitRender を実行しようとしていますが、うまくいきません。
私のミキサーは RemoteIO ユニットに入り、そのコールバックで (ファイルからの) AudioData を処理します。うまく動作します。
次に、AudioUnit エフェクト ノード (Reverb) をグラフに追加し、それを AudioUnit にリンクしました。エフェクト ノードがグラフ内のどこにも接続されていません。
AudioComponentDescription auEffectDescription;
auEffectDescription.componentType = kAudioUnitType_Effect;
auEffectDescription.componentSubType = kAudioUnitSubType_Reverb2;
auEffectDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
auEffectDescription.componentFlags = 0;
auEffectDescription.componentFlagsMask = 0;
AudioGraph (zerokidz.com/audiograph) の例で説明されているように StreamFormat の問題を認識しており、AudioGraph で説明されているようにエフェクト ユニットの StreamFormat を設定しました。
したがって、ストリーム形式の互換性の問題があることはわかっています (「オーディオ サンプルを Float32 から SInt16 にビットシフトすると深刻なクリッピングが発生する」を参照)。私のASBD:
[AudioUnitEffect]------------------------------
[AudioUnitEffect] Sample Rate: 44100
[AudioUnitEffect] Format ID: lpcm
[AudioUnitEffect] Format Flags: 41
[AudioUnitEffect] Bytes per Packet: 4
[AudioUnitEffect] Frames per Packet: 1
[AudioUnitEffect] Bytes per Frame: 4
[AudioUnitEffect] Channels per Frame: 2
[AudioUnitEffect] Bits per Channel: 32
[AudioUnitEffect]------------------------------
[AudioUnitMixer]------------------------------
[AudioUnitMixer] Sample Rate: 44100
[AudioUnitMixer] Format ID: lpcm
[AudioUnitMixer] Format Flags: 3116
[AudioUnitMixer] Bytes per Packet: 4
[AudioUnitMixer] Frames per Packet: 1
[AudioUnitMixer] Bytes per Frame: 4
[AudioUnitMixer] Channels per Frame: 2
[AudioUnitMixer] Bits per Channel: 32
[AudioUnitMixer]------------------------------
ミキサーが AudioUnitSampleType タイプ (SInt32) を使用している間、エフェクトが Float32 にあることを理解しました (間違っていたら訂正してください)。エフェクトで AudioUnitRender を呼び出す前後に、データ バッファーを変換するさまざまな方法を試しました。ミキサーの ASBD を AudioUnit Effect に合わせようとしましたが、動作しますが、恐ろしい歪みが発生します (Effect が Float32 タイプ ([-1,+1] の間) を使用している場合は正常です)。
Apple doc は次のように述べています。
※Effect Units Stream形式の注意事項
入力スコープでは、次のようにストリーム形式を管理します。 - 入力がオーディオ ユニット接続によって供給される場合、その接続からストリーム形式を取得します。- 入力がレンダリング コールバック関数によって供給される場合は、完全なアプリケーション ストリーム フォーマットをバスに設定します。コールバックによって提供されるデータに使用されるのと同じストリーム形式を使用します。出力スコープで、入力に使用したものと同じフル ストリーム形式を設定します。*
私が見つけたものはそれほど役に立ちません..
とにかく、Effect Unit で AudioRenderRender を実行する方法が必要です。成功した人はいますか?ありがとう。
アンドレ
私のミキサーのコールバック:
static OSStatus mainMixerCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
SoundEngine* se = (SoundEngine*)inRefCon;
// init buffers with zeros
memset((Byte *)ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
memset((Byte *)ioData->mBuffers[1].mData, 0, ioData->mBuffers[1].mDataByteSize);
// Render the Audio Track (works fine)
AudioUnitRender((AudioUnit)se.auTrack,ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
// Effect (fails when there. Error:-50)
AudioUnitRender((AudioUnit)se.auEffect, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
return noErr;
}