【发布时间】:2011-10-05 17:49:44
【问题描述】:
我创建了使用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。
我能做到吗?
【问题讨论】:
-
你不应该在你的渲染回调中调用
ExtAudioFileRead。它可能会阻塞一段未指定的时间并导致故障。 -
那么我应该调用 ExtAudioFileRead 并在另一个线程中准备缓冲区吗?
-
是的,典型的方式是让生产者线程填充环形缓冲区,渲染回调从环形缓冲区中读取并向生产者线程发出需要更多数据的信号。
-
生产者-消费者模式效果很好。非常感谢!
标签: iphone ios core-audio audiounit