渲染回调函数将音频传给音频单元

渲染回调函数将音频传给音频单元

要将音频从磁盘或内存提供到音频单元输入总线,需使用符合 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 缓冲区的详细信息。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值