我只是在从麦克风获取样品进行处理。我为输入和输出设置了音频单元,并且都具有渲染回调。我的问题是关于麦克风回调的回调。
我希望核心音频为我分配麦克风回调中的缓冲区。
UInt32 shouldAllocateBuffer = 1;
AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Global, 1, &shouldAllocateBuffer, sizeof(shouldAllocateBuffer));
Run Code Online (Sandbox Code Playgroud)
但是,这样做总是会导致回调中的ioData指针为NULL。我是否在分配自己的缓冲区?
输入项
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
}
Run Code Online (Sandbox Code Playgroud)
回放
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;
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
请注意,如果您需要多个缓冲区(即使对于立体声缓冲区也可能不需要),则可以使用malloc扩展mBuffers数组的大小。