音频制作与线程OSX AudioComponent消费者线程和回调用C(Audio producer

2019-10-22 10:15发布

这个问题是不是一个插件,它是关于一个独立的应用程序设计,并与我以前问过几个问题相连。

我必须写一个多线程的音频合成功能,数据运算的,远远大于可以得到accomodated在CoreAudio的渲染线程的,其数额:几千个独立的振幅和相位内插实时采样精确正弦波振荡器。 这需要更多的CPU功率比任何单一处理器核心可以承受,所有可用的优化。

我尽我所能去学习它,但它似乎一堵墙,而不是曲线。 消费者线程可能是一个简单的CA实时渲染优先接受回调AudioBufferList iodata等......但应该是什么样的生产者线程(S)? 如果选择其他AudioComponent,它并不比有它所有的输出线程上更好 - 它只是变得更加复杂,并引入额外的延迟。

如果把n个并行AudioComponents成馈送环形缓冲区,其中饲料消费线的图形 ,一个怎么能保证它会不会在同一个线程结束了,留在同步和采样精度?

如果有加盟输出写作ñ传统的POSIX线程,如何实现CoreAudio的拉模型将与实时这样推模式共存?

是否有这样的免费提供的示例代码? 是否有一个参考,一本教科书或写这样的代码的教程? 我还没有发现任何公开信息。 这让样的我不知道,这样的问题以前没有人问?

提前致谢!

Answer 1:

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

如果读者(核心音频线)请求更多的声音比可用,那么你得到一个降( 缓存欠载 ),因为读者已经迫不及待了。 这表明,你需要一个更大的缓冲区,或者您的音频生成算法是不是实时的,需要优化。

如果笔者试图写入环形缓冲区,当它是满的,最古老的声音将被覆盖,你有其他故障,通过超限这个时候。 在这种情况下,您的音频生成代码运行速度过快,需要学习如何等待。 这将是方便的添加写waitability,通过条件变量。

我知道使用虚拟内存的技巧,有效地实现了模块化存储器存取两种小ringbuffer实现:

  • 迈克灰的MAMirroredQueue
  • 迈克尔·泰森的TPCircularBuffer

如果你正在寻找的东西更便携,有CBuffer类Unix系统和魔力环形缓冲区的Windows。

然而! 您不必使用棘手的MMU环缓冲区,可以使用普通的旧便携式C版,如果你喜欢。



文章来源: Audio producer threads with OSX AudioComponent consumer thread and callback in C