采样率变化后声音失真

时间:2012-11-23 10:29:19

标签: ios macos audio core-audio sample-rate

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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