【问题标题】:Audio producer threads with OSX AudioComponent consumer thread and callback in C带有 OSX AudioComponent 消费者线程的音频生产者线程和 C 中的回调
【发布时间】:2015-03-30 20:09:38
【问题描述】:

这个问题不是关于插件的,而是关于独立应用程序设计的,并且与我之前问过的几个问题有关。

我必须编写一个多线程音频合成函数,其处理的数据量远远超过 CoreAudio 渲染线程可以容纳的数据量:几千独立的幅度和相位实时插值采样精确的正弦波振荡器。这需要比任何单个处理器内核都能够承受的更多 CPU 功率,并且所有优化都可用。

我正在尽力学习它,但它似乎是一堵墙,而不是一条曲线。消费者线程可能是一个简单的CA实时优先级渲染回调,接受AudioBufferList iodata等…… …但是生产者线程应该是什么?如果选择另一个 AudioComponent,它并没有比将它全部放在输出线程上更好 - 它只会变得更加复杂并引入额外的延迟。

如果将 n 个并行 AudioComponents 放入一个 graph 中,该图提供一个环形缓冲区,该缓冲区提供消费者线程,如何保证它不会以相同的方式结束线程,保持同步和样本准确?

如果编写n传统POSIX线程加入输出,如何实现CoreAudio拉模型与这样的推模型实时共存?

有没有这样免费的示例代码?编写这样的代码是否有参考、教科书或教程?我没有找到任何公开的信息。这让我有点奇怪,以前没有人问过这样的问题吗?

提前致谢!

【问题讨论】:

    标签: c multithreading macos core-audio


    【解决方案1】:

    我的策略是让一个单独的线程(或多个线程)实时生成 LPCM 音频并将其写入适当大小的环形缓冲区。核心音频线程将从这个环形缓冲区中读取。

    如果阅读器(核心音频线程)请求的音频多于可用的音频,那么您将退出 (buffer underrun),因为阅读器无法等待。这表明您需要更大的缓冲区,或者您的音频生成算法不是实时的,需要优化。

    如果写入器在环形缓冲区已满时尝试写入,则最旧的音频将被覆盖,并且您会遇到另一个故障,这次是通过溢出。在这种情况下,您的音频生成代码运行速度过快,需要学习如何等待。在这里,通过条件变量添加写入等待性会很方便。

    我知道两个很酷的环形缓冲区实现,它们使用虚拟内存技巧来有效地实现模块化内存访问:

    如果您正在寻找更便携的东西,CBuffer 用于类 unix 系统,Magic Ring Buffer 用于 Windows。

    但是!您不必使用棘手的 MMU 环形缓冲区,如果您愿意,可以使用普通的旧便携式 C 版本。

    【讨论】:

    • 谢谢,这是一个非常合理的方向。我研究过 M. Tyson 的 TPCircularBuffer。尽管如此,我对如何编写一个(非CoreAudio)线程感到有些困惑,该线程将不断运行并用计算的样本或零填充循环缓冲区,并与渲染线程通信,而不会阻塞其他任何东西。我不想太特定于 OSX。提前致谢。
    • 我添加了一些关于阻塞和非 osx vm 环形缓冲区的注释。
    • 你能把它当作一个新问题来问吗?
    • 您想从其他问题中删除 gcd 吗?
    • 这不再是关于音频,而是线程同步。您需要将您的问题分解为“如何将此 gcd 代码重写为 posix”和“如何构建多个生产者/消费者”之类的问题。祝你好运
    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2016-03-18
    • 2017-02-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多