覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames

Posted

技术标签:

【中文标题】覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames【英文标题】:Audio Unit increases render callback inNumberFrames when proximity sensor is covered 【发布时间】:2018-05-10 06:31:37 【问题描述】:

我正在将 Linphone SDK 用于 VoIP ios 应用程序。而且我发现接近传感器(当您将手机靠近耳朵时会使屏幕变暗的传感器)会严重影响传入的声音。

我发现输入渲染回调的inBusNumber在覆盖接近时会增加到1024,通常是256。发生这种情况时还会导致Audio Unit不触发此回调的大约180ms时间间隙,这破坏了Linphone的缓冲策略.

设置渲染回调:

AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc       = au_write_cb;
renderCallbackStruct.inputProcRefCon = card;
auresult=AudioUnitSetProperty (
                               card->io_unit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               outputBus,
                               &renderCallbackStruct,
                               sizeof (renderCallbackStruct)
                               );

在渲染回调中:

static OSStatus au_write_cb (
                          void                        *inRefCon,
                          AudioUnitRenderActionFlags  *ioActionFlags,
                          const AudioTimeStamp        *inTimeStamp,
                          UInt32                      inBusNumber,
                          //it changes to 1024 when proximity sensor is triggered
                          UInt32                      inNumberFrames,
                          AudioBufferList             *ioData
                         ) 

据我了解,inNumberFrames 只会在切换播放设备(例如将耳机切换到蓝牙)的情况下发生变化。当接近传感器被触发时,有什么办法可以修复这个数字?

我也尝试将 kAudioUnitProperty_MaximumFramesPerSlice 设置为 256 并设置音频会话的 PreferredIOBufferDuration,但两者都不起作用。

我下载了名为 Speakerbox 的 Apple 官方演示,发现无论我如何触发接近传感器,他们的渲染回调的 inNumberFrames 都会持续到 256。我比较了苹果的代码和我的代码,但我找不到任何可能导致这种情况的差异。感谢任何帮助,谢谢。

【问题讨论】:

【参考方案1】:

你的理解不正确。 iOS 可以出于其他原因更改 inNumberFrames,例如当前正在运行的应用程序生命周期状态以及电源管理更改。应用的音频单元缓冲区管理策略需要容忍缓冲区大小的此类变化,例如音频丢失/错误隐藏或重新同步。

至于 iOS 缓冲区大小行为的差异,可能会因应用选择的音频单元、音频会话类型和选项以及背景模式选项而有所改变。

【讨论】:

感谢您的回复。我已经找到了一种降低攻击性的方法(在苹果官方演示中完成),将首选硬件 IO 缓冲区持续时间限制为 20 毫秒。现在它不受接近传感器或应用程序背景状态的影响 XD。

以上是关于覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames的主要内容,如果未能解决你的问题,请参考以下文章

编写远程 I/O 渲染回调函数时遇到问题

当接近传感器被覆盖时保持显示

直接调用音频单元而不是回调 iOS

Core Audio的渲染回调不会改变输出音频[重复]

Xamarin Monotouch 音频单元回调

从 Audio-Unit 渲染回调实时触发事件并获得严重失真