渲染回调函数将音频传给音频单元
- 渲染回调函数将音频传给音频单元
- 了解音频单元渲染回调函数
渲染回调函数将音频传给音频单元
要将音频从磁盘或内存提供到音频单元输入总线,需使用符合 AURenderCallback 原型的渲染回调函数进行传输。当需要另一片样本帧时,音频单元输入将调用回调函数。
渲染回调函数是唯一可以对音频帧做处理的地方,与此同时,渲染回调具有严格的性能要求,必须遵守这些要求。渲染回调存在于实时优先级线程上,后续渲染调用异步到达。以录制为例,回调函数是按照固定时间间隔进行调用。当下一个渲染调用到达时,如果回调函数仍在生成示例帧以响应之前的渲染调用,那么将在声音中出现空隙。因此,不得在渲染回调函数内加锁、分配内存、访问文件系统或网络连接,或以其他方式执行耗时的任务。
了解音频单元渲染回调函数
下面展示一个符合 AURenderCallback 原型的渲染回调函数的函数声明。本节依次描述了每个参数的目的,并解释了如何使用每个参数。
static OSStatus MyAURenderCallback (
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData
) { /* callback body */ }
- inRefCon:注册回调函数时传递的指针,一般可传本类对象实例。因为回调函数是 C 语言形式,无法直接访问本类中属性与方法,所以将本类实例化对象传入可以间接调用本类中属性与方法。
- ioActionFlags:该参数允许回调向音频单元提供没有音频要处理的提示。例如,在想要输出沉默的回调调用期间,可以在回调正文中使用以下语句:
*ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence;
。此外,当想产生静音时,还必须将 ioData 参数所指向的缓冲区显式设置为 0。 - inTimeStamp:该参数表示调用回调的时间,可以用作音频同步的时间戳。它包含一个 AudioTimeStamp 结构,其 mSampleTime 字段是一个样本帧计数器。每次调用回调时,mSampleTime 字段的值会按 inNumberFrames 参数中的数字递增。应用程序可以使用 mSampleTime 值来调度声音。
- inBusNumber:该参数指示调用回调的音频单元总线,允许根据此值在回调中分支。此外,当将回调附加到音频单元时,可以为每个总线指定不同的上下文(inRefCon)。
- inNumberFrames:该参数表示在当前调用时要求回调提供的音频样本帧数。这些帧的数据保存在
ioData
参数中。 - ioData:该参数指向回调时必须填充的音频数据缓冲区。放入这些缓冲区的音频必须符合调用回调的总线的音频流格式。如果正在为回调播放静音,需要显式地将这些缓冲区设置为 0(比如使用 memset 函数)。
图 1-7 描绘了 ioData 参数中的一对非交错立体声缓冲区。使用图中的元素来可视化回调需要填充的 ioData 缓冲区的详细信息。