CoreAudio:多线程后端OS X

CoreAudio: multi-threaded back-end OS X

我想了解如何处理 OSX 中单个输入参数数组的音频渲染中使用多个 CPU 内核的可能性。

在 AudioToolbox 中,一个渲染回调通常存在于单个线程上,该线程似乎由单个 CPU 核心处理。

如何处理该核心上的输入数据溢出,而其他 3、5 或 7 个核心几乎处于闲置状态?

当然,不可能提前知道特定机器上有多少个内核可用。 有没有办法(静态或动态)将渲染回调分配给不同的线程或"threadbare blocks"? 有没有一种方法可以精确同步各种渲染回调在它们自己的(最高优先级)线程上并行产生它们的音频缓冲区的时刻? GCD API 有什么用吗?

提前致谢!

附言。这个问题与我前一段时间发布的另一个问题有关: OSX AudioUnit SMP ,不同之处在于我现在似乎更好地理解了问题的范围。

无论您如何在 macOS 上设置音频处理——无论是编写单个渲染回调,还是设置整个应用程序套件——CoreAudio 始终只为您提供一个实时音频线程。该线程以最高优先级运行,因此这是系统至少可以为您提供 一些 处理时间等保证的唯一方法。

如果您确实需要在多个 CPU 核心上分配负载,您需要手动创建自己的线程,并在它们之间共享样本和计时数据。但是,您将无法创建与系统音频线程具有相同优先级的线程,因此您的额外线程应该比音频线程多 "slower",这意味着您可能必须等待音频线程对于比您可用时间更长的其他一些线程,这会导致可听见的故障。

长话短说,最关键的部分是仔细设计实际的处理算法,因为在所有场景中你都需要知道什么任务需要多长时间。


编辑:我之前在这里的回答完全不同而且没有受过教育。我为以后遇到此答案的任何人更新了以上部分,以免被引导到错误的方向。
可以找到之前的版本in the history of this answer.

我不是很确定,但我认为这不可能。当然,您可以使用 Apple 的 Accelerate.framework,它使用可用资源。但是

A render callback lives on a real-time priority thread on which subsequent render calls arrive asynchronously. Apple Documentation

在用户级别您无法创建此类线程。

顺便说一下,these slides by Godfrey van der Linden 你可能会感兴趣。