kAudioUnitProperty_ShouldAllocateBuffer не имеет никакого эффекта - PullRequest
5 голосов
/ 21 февраля 2012

Я просто работаю над получением образцов для обработки с микрофона.У меня есть аудиоустройство, настроенное для ввода и вывода, и оба имеют обратные вызовы рендеринга.Мой вопрос касается обратного вызова для обратного вызова микрофона.

Я хочу, чтобы core-audio выделил мне буфер обратного вызова микрофона.

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

1 Ответ

5 голосов
/ 21 февраля 2012

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.

Обратите внимание, что если вам нужно более одного буфера (вероятно, нет, даже для стерео), вы можете использовать malloc для увеличения размера массива mBuffers.

...