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 消息复制到回调中的环形缓冲区。然后在主线程上,轮询环形缓冲区并处理数据。
我在OSX/Darwin中有以下程序结构:
生产者线程生成数据并将其提供给循环缓冲区。
消费者实时 CoreAudio 线程将循环缓冲区中的数据渲染到 DAC。
它们是通过dispatch_semaphores协调的。
可以通过 GUI 控制生产者线程参数(GLUT,非Cocoa) 或通过 MIDI。
就从 GUI 控制生产者而言,一切正常。
但是,midiReadProc( ) 回调 "lives" 在它自己的实时线程上,生产者线程来自 既不应该被控制也不应该被通知,但是 MIDI 数据应该以某种方式传递给主线程, 生产者线程应该从中入队和更新。
有什么方法可以做到这一点又不会过于OSX具体吗?
提前致谢。
实现此目的的一种方法可能是对传入的 MIDI 数据使用无锁循环 fifo。然后,音频生产者线程可以在为实时消费者生成下一批数据之前轮询此 fifo。
我这样做的方法是使用环形缓冲区并将这些 MIDI 消息复制到回调中的环形缓冲区。然后在主线程上,轮询环形缓冲区并处理数据。