我的应用程序(仅适用于macOS)使用低级CoreAudio功能(AudioDevice low,而不是AudioUnit)。
我的问题是:输出缓冲区是否在 AudioDeviceIOProc 返回或需要额外的周期?
AudioDeviceIOProc
让我用一个例子来解释这个问题的来源。考虑一个输入监控应用程序,它对输入进行一些处理并立即播放,为简单起见,考虑到输入和输出都使用相同的设备。
我通过以下方式将缓冲区大小设置为480帧(48kHz时为10ms): AudioObjectSetPropertyData 地址属性 kAudioDevicePropertyBufferFrameSize .当我 AudioDeviceIOProc 调用时,我有10ms的输入数据,我处理这些数据,然后在 AudioDeviceIOProc 返回。
AudioObjectSetPropertyData
kAudioDevicePropertyBufferFrameSize
此时,我需要(一劳永逸地)了解以下两种情况中哪一种是正确的:
0.02 * 48000/1000 samples = 0.96 samples
我总是假设A)是正确答案,这符合计算监控往返延迟的经验法则 2*I/O buffersize (例如,如本文所述 https://support.apple.com/en-om/HT201530 ),但最近我一直在读关于它的不和谐信息。有人能帮我清理一下吗?非常感谢。
2*I/O buffersize
什么时候 coreaudiod 调用IO Proc,它正在填充内部缓冲区,以便输出到音频设备。输出不会立即发生,因为核心音频需要时间来处理数据,并可能将其与来自其他应用程序的流混合。事实上,甚至有一个属性允许您控制IO周期中准备样本所需的时间, kAudioDevicePropertyIOCycleUsage .
coreaudiod
kAudioDevicePropertyIOCycleUsage
一旦核心音频拥有您的数据,它可能不会立即将其发送到设备进行播放。二者都 AudioDevice 和 AudioStream 对象具有可配置的延迟。对于 音频流 你可以继续读下去 kAudioStreamPropertyLatency .
AudioDevice
AudioStream
音频流
kAudioStreamPropertyLatency
鉴于这种复杂性 AudioDeviceIOProc 提供一个参数,用于确定何时将样本写入设备。看看倒数第二个参数, const AudioTimeStamp* inOutputTime .
const AudioTimeStamp* inOutputTime