OSX:AudioUnit 回调未被充分调用
OSX: AudioUnit callback not being called enough
我有一个简单的应用程序可以记录音频,并处理传入的字节。我发现我丢失了很多应该传入的数据,比如 2/3它的。
这个例程:
static OSStatus AudioCallBack (void* userData, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 nFrames, AudioBufferList* ioData)
调用次数不够。通常是什么原因导致这种情况?
如果您尝试在音频单元回调(或任何其他 Objective C 消息传递、同步、锁定或内存管理等)内进行大量处理,您的回调函数或块可能会花费太长时间,因此您的应用可能会错过一些回调,从而错过一些音频数据。您可以通过删除回调中的所有处理来检查这一点,并仅计算收到的音频样本的总数以确保每秒传入正确的数量。
如果发生这种情况,那么,为了防止您的回调阻塞时间过长,您应该重新安排您的处理以在另一个线程中完成全部或大部分,然后快速将音频单元回调中的数据复制到传递给其他处理任务或线程的数组、队列或 fifo。由于您知道音频回调的速率,因此您可以确定正确的速率以轮询所需的处理。
我有一个简单的应用程序可以记录音频,并处理传入的字节。我发现我丢失了很多应该传入的数据,比如 2/3它的。
这个例程:
static OSStatus AudioCallBack (void* userData, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 nFrames, AudioBufferList* ioData)
调用次数不够。通常是什么原因导致这种情况?
如果您尝试在音频单元回调(或任何其他 Objective C 消息传递、同步、锁定或内存管理等)内进行大量处理,您的回调函数或块可能会花费太长时间,因此您的应用可能会错过一些回调,从而错过一些音频数据。您可以通过删除回调中的所有处理来检查这一点,并仅计算收到的音频样本的总数以确保每秒传入正确的数量。
如果发生这种情况,那么,为了防止您的回调阻塞时间过长,您应该重新安排您的处理以在另一个线程中完成全部或大部分,然后快速将音频单元回调中的数据复制到传递给其他处理任务或线程的数组、队列或 fifo。由于您知道音频回调的速率,因此您可以确定正确的速率以轮询所需的处理。