gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:48:53 25 4
gpt4 key购买 nike

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

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

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

我通过 AudioObjectSetPropertyData 将缓冲区大小设置为 480 帧 (10ms @ 48kHz)解决属性(property)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 ),但最近我一直在阅读关于它的不和谐信息。谁能帮我解决这个问题?谢谢

    最佳答案

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

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

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

    关于audio - AudioDeviceIOProc 返回后播放的 Mac Core Audio 输出缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41189861/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com