【发布时间】:2016-12-17 06:34:42
【问题描述】:
我的应用程序(仅适用于 macOS)使用低级 CoreAudio 功能(AudioDevice-low,而不是 AudioUnit)。
我的问题是:输出缓冲区是在我的AudioDeviceIOProc 返回后立即播放还是需要额外的循环?
让我用一个例子来解释问题的出处。考虑一个输入监控应用程序,它对输入进行一些处理并立即播放它,为简单起见,考虑到输入和输出使用相同的设备。
我将缓冲区大小设置为 480 帧 (10ms @ 48kHz) 到 AudioObjectSetPropertyData 寻址属性 kAudioDevicePropertyBufferFrameSize。当我的AudioDeviceIOProc 被调用时,我处理了 10 毫秒的输入数据,然后在我的AudioDeviceIOProc 返回之前写入输出缓冲区。
此时我需要(一劳永逸地)了解以下两种情况中哪一种是正确的:
- A) 需要再过 10 毫秒才能播放我刚刚设置的输出缓冲区
- B) 缓冲区在回调返回后立即播放。这似乎是不可能的,因为它要求回调在每个周期都完全在同一时间进行。事实上,如果我们考虑第二次调用 ioproc 时的处理时间比上一个周期多 20 微秒,这将导致几乎 1 个样本的间隙 (
0.02 * 48000/1000 samples = 0.96 samples)。
我一直认为 A) 是正确的答案,这符合将监控往返延迟计算为 2*I/O buffersize 的经验法则(例如,此处解释为 https://support.apple.com/en-om/HT201530),但最近我一直在阅读不和谐的信息关于它。谁能帮我解决这个问题?谢谢
【问题讨论】:
标签: audio core-audio