AudioDeviceIOProc返回后播放Mac Core Audio输出缓冲区?

时间:2016-12-16 17:51:23

标签: audio core-audio

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

我的问题是:输出缓冲区是在AudioDeviceIOProc返回后立即播放还是需要额外的周期?

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

我通过AudioObjectSetPropertyData寻址属性kAudioDevicePropertyBufferFrameSize将缓冲区大小设置为480帧(10ms @ 48kHz)。当调用AudioDeviceIOProc时,我有10ms的输入数据,我处理然后在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所述),但最近我是&#39 ;我一直在阅读关于它的录音信息。任何人都可以为我清除这个吗?谢谢

1 个答案:

答案 0 :(得分:3)

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

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

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