代码之家  ›  专栏  ›  技术社区  ›  Stefano Bider

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

  •  1
  • Stefano Bider  · 技术社区  · 8 年前

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

    我的问题是:输出缓冲区是否在 AudioDeviceIOProc 返回或需要额外的周期?

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

    我通过以下方式将缓冲区大小设置为480帧(48kHz时为10ms): AudioObjectSetPropertyData 地址属性 kAudioDevicePropertyBufferFrameSize .当我 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 ),但最近我一直在读关于它的不和谐信息。有人能帮我清理一下吗?非常感谢。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Tim    8 年前

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

    一旦核心音频拥有您的数据,它可能不会立即将其发送到设备进行播放。二者都 AudioDevice AudioStream 对象具有可配置的延迟。对于 音频流 你可以继续读下去 kAudioStreamPropertyLatency .

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