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;
}
所以无论什么时候你在录音回调需要什么来分配自己的缓冲区?另外如果我想在回放回调中使用这个捕获的音频,我应该将本地缓冲区数据复制到其他自我管理的缓冲区以复制回放回调ioData? – dubbeat 2012-02-20 21:22:35
mData为NULL,因此AudioUnit正在为您分配和提供。这与提供自己的不同 - 如果您提供自己的缓冲区,则需要先将它们malloc并稍后释放它们。如果您想捕获它以备后用,可以将其复制到另一个缓冲区,但效率不高 - 在这种情况下,您可能应该提供自己的缓冲区。 – 2012-02-20 21:29:59
抓22.如果你不提供自己的缓冲区,并且想要的数据,你需要将数据无论如何复制到自己的缓冲区(一个或多个)。 – hotpaw2 2012-02-21 07:09:48