我有一个带有渲染回调的RemoteIO音频单元。我已经有一个渲染音频的缓冲区,出于性能原因,我想避免使用memcpy
。
OSStatus FMixerPlatformAudioUnit::AudioRenderCallback(void* RefCon, AudioUnitRenderActionFlags* ActionFlags,
const AudioTimeStamp* TimeStamp, UInt32 BusNumber,
UInt32 NumFrames, AudioBufferList* IOData)
{
IOData->mBuffers[0].mData = RenderedBufferPtr;
RefreshRenderedBufferPtr();
}
这可以正常工作,听起来不错。但是,我担心通过覆盖
IOData->mBuffers[0].mData
,我可能会留下mData
指向悬空的原始缓冲区,从而可能导致内存泄漏。在InputCallback proc中重写IOData->mBuffers[0].mData
是否有问题? 最佳答案
在任何当前的Apple arm64 CPU上,每个采样的memcpy时间比采样率周期快10,000倍,因此不太可能是音频单元回调率的可测量百分比。因此,交换缓冲区的执行速度不会明显提高。
但是,更大的问题是,iOS中每个连续的音频单元回调之间都不能保证NumFrames保持相同,因此,交换缓冲区指针与复制确切数量的样本或音频帧并不相同。音频会发生故障,具体取决于iOS设备上的其他事件(省电模式,通知,电话,按键等)。
此外,如果没有分配,就不知道换出的IOData缓冲区的内存分配大小,如果音频单元采用不同的大小,则这可能是导致内存损坏的另一个原因。