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

  • 停止输入 AudioUnit 和由混音器和输出 AudioUnit 组成的 AUGraph
  • 取消初始化它们。
  • 检查节点数,跳过它们并使用 AUGraphDisconnectNodeInput 断开混合器与输出的连接
  • 现在在输入单元
  • 的输出范围上设置新的采样率
  • 以及混频器单元上的输入和输出范围
  • 将混频器节点重新连接到输出单元
  • 更新图表
  • 初始化输入和图形
  • 开始输入并绘制

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

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

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

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

    最佳答案

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

    关于ios - 采样率改变后声音失真,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13527195/

    10-11 16:48