2016-12-16 111 views
1

我的应用程序(仅适用于macOS)使用低级CoreAudio功能(AudioDevice-low,而不是AudioUnit)。Mac Core AudioDeviceIOProc返回后播放的音频输出缓冲区?

我的问题是:在我的AudioDeviceIOProc返回或需要一个额外的周期后,输出缓冲器是否立即播放?

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

我通过AudioObjectSetPropertyData设置缓冲区的大小,以480帧(10毫秒@ 48kHz的)寻址的属性kAudioDevicePropertyBufferFrameSize。当我调用AudioDeviceIOProc时,我有10ms的输入数据,然后在我的AudioDeviceIOProc返回之前处理并写入输出缓冲区。

在这一点上我需要了解(一劳永逸),其中以下两种情况下是正确的:

  • A)10毫秒的时间需要,我只是设置输出缓冲器之前通过可以播放
  • B)在回调返回后立即播放缓冲区。这似乎是不可能的,因为它要求在每个周期同一时间回拨需要正好。实际上,如果我们考虑第二次调用ioproc时的处理,则处理比前一个处理花费的时间多20微秒,这会导致差不多一个样本(0.02 * 48000/1000 samples = 0.96 samples)。

我一直认为A)是正确答案,这将适合与经验法则来计算监控往返延迟为2*I/O buffersize(如这里https://support.apple.com/en-om/HT201530解释),但最近我一直在阅读有关discording信息它。任何人都可以为我解决这个问题吗?谢谢

回答

3

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

一旦核心音频有你的数据,它可能不会立即发送到设备播放。 AudioDeviceAudioStream对象都具有可配置的延迟。对于AudioStream,你可以阅读kAudioStreamPropertyLatency

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

相关问题