我在OSX / Darwin中有以下程序结构:
生产者线程生成数据并将其提供给循环缓冲区。
消费者实时CoreAudio线程将数据从循环缓冲区渲染为DAC。
它们通过dispatch_semaphores进行协调。
生产者线程参数可以由GUI控制(GLUT,非Cocoa) 或者通过MIDI。
就控制GUI的生产者形式而言,事情很有效。
然而, midiReadProc() 回调"生活"在它自己的实时线程,从哪个生产者线程 既不应该控制也不应该通知,但MIDI数据应该以某种方式传递给主线程, 生产者线程应该从中排队和更新。
有没有办法在没有特定OSX的情况下这样做?
提前致谢。
答案 0 :(得分:3)
执行此操作的一种方法可能是使用无锁圆形fifo来传入MIDI数据。然后,音频制作者线程可以在为实时消费者生成下一批数据之前轮询此fifo。
答案 1 :(得分:1)
我这样做的方法是使用环形缓冲区并将这些midi消息复制到回调中的环形缓冲区。然后在主线程上轮询环形缓冲区并处理数据。