OSX - 将 midiReadProc 结果传递给 C 中的主线程

OSX - passing midiReadProc results to the main thread in C

我在OSX/Darwin中有以下程序结构:

生产者线程生成数据并将其提供给循环缓冲区。

消费者实时 CoreAudio 线程将循环缓冲区中的数据渲染到 DAC。

它们是通过dispatch_semaphores协调的。

可以通过 GUI 控制生产者线程参数(GLUT,非Cocoa) 或通过 MIDI。

就从 GUI 控制生产者而言,一切正常。

但是,midiReadProc( ) 回调 "lives" 在它自己的实时线程上,生产者线程来自 既不应该被控制也不应该被通知,但是 MIDI 数据应该以某种方式传递给主线程, 生产者线程应该从中入队和更新。

有什么方法可以做到这一点又不会过于OSX具体吗?

提前致谢。

实现此目的的一种方法可能是对传入的 MIDI 数据使用无锁循环 fifo。然后,音频生产者线程可以在为实时消费者生成下一批数据之前轮询此 fifo。

我这样做的方法是使用环形缓冲区并将这些 MIDI 消息复制到回调中的环形缓冲区。然后在主线程上,轮询环形缓冲区并处理数据。