kAudioUnitProperty_ShouldAllocateBuffer无效

时间:2012-02-20 20:47:28

标签: 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 个答案:

答案 0 :(得分:5)

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阵列的大小。