2012-02-20 25 views
3

マイクから処理するためのサンプルを取得中です。私は入力と出力用にオーディオユニットを設定しており、どちらもレンダリングコールバックを持っています。私の質問は、マイクコールバックのコールバックについてです。kAudioUnitProperty_ShouldAllocateBufferは効果がありません

私はコアオーディオでマイクコールバックにバッファを割り当てます。

UInt32 shouldAllocateBuffer = 1; 
AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Global, 1, &shouldAllocateBuffer, sizeof(shouldAllocateBuffer)); 

これを行うと、常にコールバックにNULL ioDataポインタが生成されます。私は自分のバッファを割り当てていませんか?

入力

static OSStatus recordingCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) { 

OSStatus status; 
status = AudioUnitRender(audioUnit, 
         ioActionFlags, 
         inTimeStamp, 
         inBusNumber, 
         inNumberFrames, 
         ioData); // ioData is null here 
} 

再生

static OSStatus playbackCallback(void *inRefCon, 
            AudioUnitRenderActionFlags *ioActionFlags, 
            const AudioTimeStamp *inTimeStamp, 
            UInt32 inBusNumber, 
            UInt32 inNumberFrames, 
            AudioBufferList *ioData) {  
// ioData is not NULL here but I get silence in the headphones. 
    return noErr; 
} 

答えて

4

AudioUnitRenderは依然としてAudioBufferListパラメータ(ioData)が非NULLであることを期待します。

ioDataがAudioBufferListへのポインタである場合、ほとんどの場合、ioData-> mBuffers [0] .mDataにする必要があります(docsを参照)。バッファを割り当てていない場合、バッファリストはおそらくコールバックに対してのみ有効なので、ローカル変数にする必要があります。

したがって、基本的にioDataではなくローカル変数を使用します。

説明するトポロジと一致するようにAudioBufferListを設定する必要があることに注意してください。

AudioBufferList bufferList; 
bufferList.mNumberBuffers = 1; 
bufferList.mBuffers[0].mData = NULL; 
OSStatus status; 
status = AudioUnitRender(audioUnit, 
         ioActionFlags, 
         inTimeStamp, 
         inBusNumber, 
         inNumberFrames, 
         &bufferList); // bufferList.mBuffers[0].mData is null 
// Use the input data in now valid bufferList.mBuffers[0].mData 
// note the buffer is only valid for the callback. 

注複数のバッファを(あなたはおそらくステレオのために、ない)必要がある場合、あなたはmBuffers配列のサイズを拡張するためのmallocを使用することができます:ここで

は一例です。

+0

あなたは自分のバッファを割り当てる必要があるレコーディングコールバックにあなたがいなくてもどうですか?また、再生コールバックでこのキャプチャされたオーディオを使用したい場合は、再生コールバックioDataにコピーするためにローカルバッファデータを他の自己管理バッファにコピーする必要がありますか? – dubbeat

+0

mDataはNULLなので、AudioUnitはそれを割り当てて提供しています。これは独自のものを提供する場合とは異なります。独自のバッファを提供する場合は、まずそれらをmallocして後で解放する必要があります。後で使用するためにキャプチャしたい場合は、それを別のバッファにコピーすることもできますが、効率的ではありません。この場合は、独自のバッファを用意するだけです。 –

+0

Catch 22.独自のバッファを用意しておらず、データが必要な場合は、データを自分のバッファにコピーする必要があります。 – hotpaw2

関連する問題