【问题标题】:Mac Core Audio output buffer played after AudioDeviceIOProc returns?AudioDeviceIOProc 返回后播放的 Mac Core Audio 输出缓冲区?
【发布时间】:2016-12-17 06:34:42
【问题描述】:

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

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

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

我将缓冲区大小设置为 480 帧 (10ms @ 48kHz) 到 AudioObjectSetPropertyData 寻址属性 kAudioDevicePropertyBufferFrameSize。当我的AudioDeviceIOProc 被调用时,我处理了 10 毫秒的输入数据,然后在我的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),但最近我一直在阅读不和谐的信息关于它。谁能帮我解决这个问题?谢谢

【问题讨论】:

    标签: audio core-audio


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多