运行时的 RemoteIO 配置
Posted
技术标签:
【中文标题】运行时的 RemoteIO 配置【英文标题】:RemoteIO configuration at runtime 【发布时间】:2016-12-05 08:46:08 【问题描述】:我有一个 RemoteIO 单元设置,可以从麦克风获取输入并播放它。只需轻按一下按钮,即可随时启用或禁用播放。我的问题是启用或禁用播放的调用是否需要音频单元停止、取消初始化然后配置或停止并且根本不需要取消初始化?这是我在 RIO 运行时用于在运行时启用或禁用播放的示例代码。
/* Are these two lines required or not???*/
[self stopIOUnit];
AudioUnitUninitialize(mAudioUnit);
int flag = enable? 1 : 0;
// play on io on the output bus
OSStatus status = AudioUnitSetProperty(mAudioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
0, /*output*/
&flag,
sizeof(flag));
【问题讨论】:
AudioOutputUnitStart
和 AudioOutputUnitStop
还不够吗?
这就是问题所在,是取消初始化还是停止,或者两者都需要与否。
【参考方案1】:
停止音频单元并不是绝对必要的,尽管它确实会降低应用程序的功耗,因此如果停止播放任何时间长度都应该这样做,以节省用户的电池寿命。不停止音频单元的优点是再次开始录制时会发生几毫秒的低延迟,这在某些应用程序中可能很重要。停止音频单元的替代方法是在记录回调中丢弃样本,并在播放回调中用静音(零)填充缓冲区。
仅当您稍后使用不同的配置重新初始化音频单元时才需要进行取消初始化。
【讨论】:
【参考方案2】:要启用和禁用音频单元,调用AudioOutputUnitStop()
和AudioOutputUnitStart()
就足够了。如果您还希望更改单元的状态(并且启用/禁用似乎不被视为“状态”),则只需要 AudioUnitUninitialize()
和 AudioUnitInitialize()
。
来自AudioUnitUninitialize()
documentation:
通常,音频单元的状态(例如其 I/O 格式和内存分配)在音频单元初始化时无法更改。
【讨论】:
以上是关于运行时的 RemoteIO 配置的主要内容,如果未能解决你的问题,请参考以下文章
RemoteIO 的 AudioSession 设置与 iPod 配合得很好
带有 AirPods 的 iOS11 上的 RemoteIO