Mac 在 AudioDeviceIOProc returns 之后播放核心音频输出缓冲区?

Mac Core Audio output buffer played after AudioDeviceIOProc returns?

我的应用程序(仅适用于 macOS)使用低级 CoreAudio 功能(AudioDevice-low,而不是 AudioUnit)。

我的问题是:输出缓冲区是在我 AudioDeviceIOProc returns 之后立即播放还是需要额外的循环?

让我用一个例子来解释问题的来源。考虑一个输入监控应用程序,它对输入进行一些处理并立即回放,为简单起见,考虑将同一设备用于输入和输出。

我通过 AudioObjectSetPropertyData 寻址 属性 kAudioDevicePropertyBufferFrameSize 将缓冲区大小设置为 480 帧(10ms @ 48kHz)。当我的 AudioDeviceIOProc 被调用时,我有 10ms 的输入数据,我处理这些数据然后在我的 AudioDeviceIOProc returns 之前写入输出缓冲区。

此时我需要(一劳永逸地)了解以下两种情况中哪一种是正确的:

我一直假设 A) 是正确答案,这符合计算监控往返延迟的经验法则 2*I/O buffersize(例如,如此处所述 https://support.apple.com/en-om/HT201530),但最近我一直在阅读有关它的不和谐信息。谁能帮我解决这个问题?谢谢

coreaudiod 调用您的 IO Proc 时,它正在填充内部缓冲区以输出到音频设备。输出不会立即发生,因为 Core Audio 需要时间来处理您的数据并可能将其与来自其他应用程序的流混合。事实上,甚至还有一个 属性 允许您控制准备样品所需的 IO 周期时间,kAudioDevicePropertyIOCycleUsage

一旦 Core Audio 有了您的数据,它可能不会立即将其发送到设备进行播放。 AudioDeviceAudioStream 对象都有可配置的延迟。对于 AudioStream,您可以阅读 kAudioStreamPropertyLatency

鉴于这种复杂性,AudioDeviceIOProc 为您提供了一个参数来确定何时将示例写入设备。查看倒数第二个参数,const AudioTimeStamp* inOutputTime.