我有一个带有渲染回调的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缓冲区的内存分配大小,如果音频单元采用不同的大小,则这可能是导致内存损坏的另一个原因。

09-07 07:37