这个让我保持清醒:
我有一个OS X音频应用程序,如果用户更改设备的当前采样率,则必须做出反应
为此,我在'kAudioDevicePropertyNominalSampleRate'上注册了输入和输出设备的回调。
因此,如果其中一个设备采样率发生变化,我将获得回调并在设备上设置新的采样率,并将“AudioObjectSetPropertyData”和“kAudioDevicePropertyNominalSampleRate”作为选择器。
苹果邮件列表中提到了接下来的步骤,我跟着他们:
渲染和输出回调再次开始,但现在音频失真。我相信它是输入渲染回调,负责信号,但我不确定 我忘记了什么? 据我所知,采样率不会影响缓冲区大小 如果我用其他采样率启动我的应用程序,一切正常,这是导致信号失真的变化 我查看之前和之后的流格式(kAudioUnitProperty_StreamFormat)。一切都保持不变,除了采样率当然会改变为新值。
正如我所说,我认为这是需要更改的输入渲染回调。我是否必须通知回调需要更多样本?我用44k和48k检查了回调和缓冲区大小,没有什么不同。
我写了一个小测试应用程序,所以如果你想让我提供代码,我可以告诉你。
编辑:我录制了失真的音频(正弦)并在Audacity中查看了它。
我发现每495个样本后,音频会再次下降17个样本。
我想你会看到它的发展方向:495个样本+17个样本= 512个样本。这是我的设备的缓冲区大小
但我仍然不知道我能用这个发现做些什么
我检查了输入和输出渲染过程以及他们对RingBuffer的访问(我使用固定版本的CARingBuffer)
存储和获取512帧,因此这里没有任何东西......
答案 0 :(得分:1)
知道了!
断开图表后,似乎有必要告诉两个设备新的采样率
我已经在回调之前做了这个,但似乎这必须在以后完成。