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) 需要再过 10 毫秒才能播放我刚刚设置的输出缓冲区
- B) 缓冲区在回调后立即播放 returns。这似乎是不可能的,因为它要求回调在每个周期中 完全 同时进行。事实上,如果我们考虑第二次调用 ioproc 的例子,处理比上一个周期多花费 20 微秒,这将导致几乎 1 个样本的差距(
0.02 * 48000/1000 samples = 0.96 samples
)。
我一直假设 A) 是正确答案,这符合计算监控往返延迟的经验法则 2*I/O buffersize
(例如,如此处所述 https://support.apple.com/en-om/HT201530),但最近我一直在阅读有关它的不和谐信息。谁能帮我解决这个问题?谢谢
当 coreaudiod
调用您的 IO Proc 时,它正在填充内部缓冲区以输出到音频设备。输出不会立即发生,因为 Core Audio 需要时间来处理您的数据并可能将其与来自其他应用程序的流混合。事实上,甚至还有一个 属性 允许您控制准备样品所需的 IO 周期时间,kAudioDevicePropertyIOCycleUsage
。
一旦 Core Audio 有了您的数据,它可能不会立即将其发送到设备进行播放。 AudioDevice
和 AudioStream
对象都有可配置的延迟。对于 AudioStream
,您可以阅读 kAudioStreamPropertyLatency
。
鉴于这种复杂性,AudioDeviceIOProc
为您提供了一个参数来确定何时将示例写入设备。查看倒数第二个参数,const AudioTimeStamp* inOutputTime
.
我的应用程序(仅适用于 macOS)使用低级 CoreAudio 功能(AudioDevice-low,而不是 AudioUnit)。
我的问题是:输出缓冲区是在我 AudioDeviceIOProc
returns 之后立即播放还是需要额外的循环?
让我用一个例子来解释问题的来源。考虑一个输入监控应用程序,它对输入进行一些处理并立即回放,为简单起见,考虑将同一设备用于输入和输出。
我通过 AudioObjectSetPropertyData
寻址 属性 kAudioDevicePropertyBufferFrameSize
将缓冲区大小设置为 480 帧(10ms @ 48kHz)。当我的 AudioDeviceIOProc
被调用时,我有 10ms 的输入数据,我处理这些数据然后在我的 AudioDeviceIOProc
returns 之前写入输出缓冲区。
此时我需要(一劳永逸地)了解以下两种情况中哪一种是正确的:
- A) 需要再过 10 毫秒才能播放我刚刚设置的输出缓冲区
- B) 缓冲区在回调后立即播放 returns。这似乎是不可能的,因为它要求回调在每个周期中 完全 同时进行。事实上,如果我们考虑第二次调用 ioproc 的例子,处理比上一个周期多花费 20 微秒,这将导致几乎 1 个样本的差距(
0.02 * 48000/1000 samples = 0.96 samples
)。
我一直假设 A) 是正确答案,这符合计算监控往返延迟的经验法则 2*I/O buffersize
(例如,如此处所述 https://support.apple.com/en-om/HT201530),但最近我一直在阅读有关它的不和谐信息。谁能帮我解决这个问题?谢谢
当 coreaudiod
调用您的 IO Proc 时,它正在填充内部缓冲区以输出到音频设备。输出不会立即发生,因为 Core Audio 需要时间来处理您的数据并可能将其与来自其他应用程序的流混合。事实上,甚至还有一个 属性 允许您控制准备样品所需的 IO 周期时间,kAudioDevicePropertyIOCycleUsage
。
一旦 Core Audio 有了您的数据,它可能不会立即将其发送到设备进行播放。 AudioDevice
和 AudioStream
对象都有可配置的延迟。对于 AudioStream
,您可以阅读 kAudioStreamPropertyLatency
。
鉴于这种复杂性,AudioDeviceIOProc
为您提供了一个参数来确定何时将示例写入设备。查看倒数第二个参数,const AudioTimeStamp* inOutputTime
.