1

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;
}
4

1 に答える 1

0

おそらく問題は解決したと思いますが、記録として: バッファには 1 つのチャネルが必要なので、現在の 2 チャネルの AudioBuffer ではなく、それぞれ 1 つのチャネルの 2 つの AudioBuffer をセットアップする必要があります。

于 2013-12-02T20:36:23.247 に答える