マイクから処理するためのサンプルを取得中です。私は入力と出力用にオーディオユニットを設定しており、どちらもレンダリングコールバックを持っています。私の質問は、マイクコールバックのコールバックについてです。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;
}
あなたは自分のバッファを割り当てる必要があるレコーディングコールバックにあなたがいなくてもどうですか?また、再生コールバックでこのキャプチャされたオーディオを使用したい場合は、再生コールバックioDataにコピーするためにローカルバッファデータを他の自己管理バッファにコピーする必要がありますか? – dubbeat
mDataはNULLなので、AudioUnitはそれを割り当てて提供しています。これは独自のものを提供する場合とは異なります。独自のバッファを提供する場合は、まずそれらをmallocして後で解放する必要があります。後で使用するためにキャプチャしたい場合は、それを別のバッファにコピーすることもできますが、効率的ではありません。この場合は、独自のバッファを用意するだけです。 –
Catch 22.独自のバッファを用意しておらず、データが必要な場合は、データを自分のバッファにコピーする必要があります。 – hotpaw2