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并在另一个线程中准备缓冲区吗?是的,典型的方法是让生产者线程填充环形缓冲区,渲染回调从环形缓冲区读取数据,并向生产者线程发出需要更多数据的信号。生产者-消费者模式工作得很好。非常感谢你!