将低延迟音频从一个CoreAudio设备路由到另一个

问题描述 投票:1回答:2

首先,一些背景信息:我正在编写一个MacOS / X应用程序,该应用程序使用CoreAudio从CoreAudio设备的输入流接收音频信号,对音频进行一些实时处理,然后将其发送回该CoreAudio。设备的输出流供用户收听。

此应用程序使用较低级别的CoreAudio API(即AudioDeviceAddIOProcAudioDeviceStart等-不是AudioUnits)来抢占用户指定的CoreAudio设备的专有访问权,将其设置为所需的采样率(96kHz),并做它的事情。它运行良好,我对它的性能感到非常满意。

但是,我的程序目前有一个限制-一次只能使用一个CoreAudio设备。我想做的就是扩展我的应用程序,以便用户可以彼此独立地选择其“输入CoreAudio设备”和“输出CoreAudio设备”,而不是仅限于使用提供两种功能的单个CoreAudio设备。输入音频源和输出音频接收器。

我的问题是,建议采用哪种技术?我可以要求两个CoreAudio设备都可以设置为相同的采样率,但是即使我这样做了,我仍然必须处理各种问题,例如:

  • 从两个设备集成单独的AudioDeviceStart()启动的回调,我怀疑不会以任何明确定义的顺序调用,甚至可能会相对于彼此并发调用(?)。我将需要以某种方式将音频从一个回调传递到另一个回调,理想情况下,不会显着增加音频延迟。

  • 处理两个设备的采样时钟速率差异。例如。即使两个设备都标称设置为96kHz采样率,我怀疑实际上可能是这种情况。上游设备以95.99999kHz的频率生成样本,而下游设备以96.000001kHz的频率生成样本(反之亦然),这最终将导致我最终得到“不够”或“太多”的样本来喂食给定的渲染回调期间,下游设备会出现故障。

  • [他们还没有考虑的其他陷阱

其他MacOS / X程序如何处理这些问题?

macos core-audio
2个回答
2
投票

不久前,我在C中使用概念证明操场上的混音器进行了演奏。这还没有完成,但是事情确实有效。该库使用了可用的最低Core Audio API,因此确实使用了AudioDeviceCreateIOProcIDAudioObjectAddPropertyListener之类的东西。

简而言之,这个游乐场使我可以使用MacOS已知的多个音频设备,并在它们之间通过不同类型的“节点”(例如,考虑矩阵混合器节点)时,在它们之间路由一个或多个音频流。] >

首先,回答您的问题


2
投票

“漏桶”算法与分数插值重采样器结合使用,可以动态调整非常微小(且非恒定!)的采样率差异。速率较大的跳跃或跳跃通常需要更复杂的错误隐藏策略。使用原子原语在异步音频线程之间传递数据的无锁循环/环形缓冲区有很多变化。我使用mach计时器或CADisplay链接计时器来驱动UI轮询线程(用于控件,显示等)。通常,我通常先尝试启动输出,并用静音填充它,直到输入开始提供样本为止,然后将其交叉淡入。然后在输入停止后交叉淡出以再次静音。

© www.soinside.com 2019 - 2024. All rights reserved.