ios – 采样率变化后的失真声音

这让我保持清醒:
我有一个OS X音频应用程序,如果用户更改设备的当前采样率,则必须做出反应.
为此,我在’kAudioDevicePropertyNominalSampleRate’上注册了输入和输出设备的回调.
因此,如果其中一个设备采样率发生变化,我会得到回调并在设备上设置新的采样率,其中’AudioObjectSetPropertyData’和’kAudioDevicePropertyNominalSampleRate’作为选择器.
苹果邮件列表中提到了接下来的步骤,我跟着他们:

>停止输入AudioUnit和由混音器和输出AudioUnit组成的AUGraph
>将两者都放在一边.
>检查节点计数,跳过它们并使用AUGraphDisconnectNodeInput断开混音器与输出的连接
>现在在输入单元的输出范围上设置新的采样率
>以及混合器单元的输入和输出范围
>将混音器节点重新连接到输出单元
>更新图表
> init输入和图形
>开始输入和图表

渲染和输出回调再次开始,但现在音频失真.我相信它是输入渲染回调,负责信号,但我不确定.
我忘记了什么?
据我所知,采样率不会影响缓冲区大小.
如果我用其他采样率开始我的应用程序一切正常,那就是导致信号失真的变化.
我查看之前和之后的流格式(kAudioUnitProperty_StreamFormat).一切都保持不变,除了采样率当然会改变为新值.

正如我所说,我认为这是需要更改的输入渲染回调.我是否必须通知回调需要更多样本?我用44k和48k检查了回调和缓冲区大小,没有什么不同.

我写了一个小测试应用程序,所以如果你想让我提供代码,我可以告诉你.

编辑:我录制了失真的音频(正弦)并在Audacity中查看了它.
我发现每495个样本后,音频会再次下降17个样本.
我想你会看到它的发展方向:495个样本17个样本= 512个样本.这是我的设备的缓冲区大小.
但我仍然不知道我能用这个发现做些什么.
我检查了输入和输出渲染过程以及它们对RingBuffer的访问(我使用固定版本的CARingBuffer)
存储和获取512帧,所以这里没有遗漏…

解决方法

得到它了! 断开图表后,似乎有必要告诉两个设备新的采样率. 我已经在回调之前做了这个,但似乎这必须在以后完成.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...