Iphone 我可以限制iOS在回调函数中传递的inNumberFrames吗?

Iphone 我可以限制iOS在回调函数中传递的inNumberFrames吗?,iphone,ios,core-audio,audiounit,Iphone,Ios,Core Audio,Audiounit,我创建了使用AudioUnit和ExtAudioFile的自定义音频播放器类。 在我的课堂上,我准备了自己的呈现回调函数,比如 OSStatus MyAURenderCallack ( void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32

我创建了使用
AudioUnit
ExtAudioFile
的自定义音频播放器类。 在我的课堂上,我准备了自己的呈现回调函数,比如

OSStatus MyAURenderCallack (
   void                        *inRefCon,
   AudioUnitRenderActionFlags  *ioActionFlags,
   const AudioTimeStamp        *inTimeStamp,
   UInt32                      inBusNumber,
   UInt32                      inNumberFrames,
   AudioBufferList             *ioData
);
当我的应用程序是前台时,操作系统传递的参数
inNumberFrames
总是
512
1024
,我的播放器工作正常。
但是当iOS设备睡眠时,
inNumberFrames
变为
4096
,我的播放器无法工作,因为它不能一次准备这么多帧

很难改进帧准备过程,因为它大量使用
extAudioFileRead
功能,很难加速

因此,我想限制
inNumberFrames
的大小不超过
1024


我能做到吗?

正如@sbooth所指出的,您真的应该在另一个线程中写入磁盘。如果不是,这会给应用程序的主线程带来真正的压力,它应该专注于在不丢失的情况下提供音频

但要直接回答您的问题:不,您不能直接告诉操作系统用于块大小的确切帧数。您可以建议它使用特定的延迟,该延迟与请求的采样率相结合,将为您提供大致的块大小。但是,无法保证iOS会将这个区块大小还给您


然而,您最好的选择是使您的算法能够处理任意大小的块。除非你在做卷积之类的事情,一般来说,块大小越大就越容易。因此,如果您在4096遇到问题,您可能应该分析您的代码,看看根本的问题是什么。

您不应该在渲染回调中调用
ExtAudioFileRead
。它可能会阻塞一段未指定的时间并导致故障。那么我应该调用ExtAudioFileRead并在另一个线程中准备缓冲区吗?是的,典型的方法是让生产者线程填充环形缓冲区,渲染回调从环形缓冲区读取数据,并向生产者线程发出需要更多数据的信号。生产者-消费者模式工作得很好。非常感谢你!