我的应用程序(仅适用于macOS)使用低级CoreAudio功能(AudioDevice-low,而非AudioUnit)。
我的问题是:输出缓冲区是在AudioDeviceIOProc
返回后立即播放还是需要额外的周期?
让我通过一个例子解释问题的来源。考虑一个输入监视应用程序,它对输入进行一些处理并立即播放,为简单起见考虑输入和输出的相同设备。
我通过AudioObjectSetPropertyData
寻址属性kAudioDevicePropertyBufferFrameSize
将缓冲区大小设置为480帧(10ms @ 48kHz)。当调用AudioDeviceIOProc
时,我有10ms的输入数据,我处理然后在AudioDeviceIOProc
返回之前写入输出缓冲区。
此时我需要理解(一劳永逸)以下两个案例中哪一个是正确的:
0.02 * 48000/1000 samples = 0.96 samples
)。我总是假设A)是正确的答案,这符合用于计算监测往返潜伏期为2*I/O buffersize
的经验法则(例如,如https://support.apple.com/en-om/HT201530所述),但最近我是&#39 ;我一直在阅读关于它的录音信息。任何人都可以为我清除这个吗?谢谢
答案 0 :(得分:3)
当coreaudiod
调用IO Proc时,它会填充内部缓冲区以输出到音频设备。由于Core Audio需要时间处理您的数据并可能将其与来自其他应用程序的流混合,因此输出不会立即发生。实际上,甚至还有一个属性可以让您控制样本准备所需的IO周期时间kAudioDevicePropertyIOCycleUsage
。
一旦Core Audio拥有您的数据,它可能不会立即将其发送到设备进行播放。 AudioDevice
和AudioStream
对象都具有可配置的延迟。对于AudioStream
,您可以阅读kAudioStreamPropertyLatency
。
鉴于这种复杂性,AudioDeviceIOProc
为您提供了一个参数,用于确定何时将样本写入设备。查看倒数第二个参数const AudioTimeStamp* inOutputTime
。