Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX-在C中将midiReadProc结果传递给主线程_Macos_Core Audio_Coremidi - Fatal编程技术网

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

Macos OSX-在C中将midiReadProc结果传递给主线程,macos,core-audio,coremidi,Macos,Core Audio,Coremidi,我在OSX/Darwin中有以下程序结构: 生产者线程生成数据并将其提供给循环缓冲区 消费者实时CoreAudio线程将数据从循环缓冲区渲染到DAC中 它们通过dispatch_信号量进行协调 生产者线程参数可由GUI控制(GLUT、非Cocoa) 或者用MIDI 就从GUI控制生产者而言,一切都很顺利 但是,midiReadProc()回调“存在”在它自己的实时线程上,生产者线程从该线程开始 既不应控制也不应通知,但MIDI数据应以某种方式传递到主线程, 生产者线程应该从中排队并更新 有没有办

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

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

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

它们通过dispatch_信号量进行协调

生产者线程参数可由GUI控制(GLUT、非Cocoa) 或者用MIDI

就从GUI控制生产者而言,一切都很顺利

但是,midiReadProc()回调“存在”在它自己的实时线程上,生产者线程从该线程开始 既不应控制也不应通知,但MIDI数据应以某种方式传递到主线程, 生产者线程应该从中排队并更新

有没有办法做到这一点而不过于OSX专用


提前感谢。

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

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

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

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

谢谢。我希望尽量远离iOS,如果可能的话,尽量靠近普通的UNIX。我有一个超声波实用程序,只要生成的数据停留在CA渲染线程上,它就可以正常工作。不幸的是,这使渲染线程负担过重,同时使其他11个逻辑核几乎处于空闲状态。一旦我成功地从渲染线程分离并并行化了生产者,包含相当复杂的数据过滤的MIDI阅读器迟早会崩溃循环缓冲区,即使使用
dispatch\u async(dispatch\u get\u main\u queue()…)
用于将相关数据移出。无锁使用者不应要求分派。如何在UNIX或Linux中实现跨平台的硬实时线程(如果可能的话)是一个完全不同的问题。谢谢。此处(解释的)MIDI信息的使用者必须是生产者,生产者可以等待(实时)CA使用者呈现线程发出的调度信号。在这一阶段,我并不追求严格的“硬”同步要求,而是试图找到最简单的解决方案,其中从MIDI更新一些值不需要导致数据损坏或使(非CA)生产者和CA消费者之间的循环缓冲区容易崩溃……无锁fifo消费者不应该有任何崩溃的理由。它应该只是从预先分配的内存中读取。感谢您鼓励我沿着正确的方向走正确的道路!谢谢我希望尽量远离iOS,如果可能的话,尽量靠近普通的UNIX。我有一个超声波实用程序,只要生成的数据停留在CA渲染线程上,它就可以正常工作。不幸的是,这使渲染线程负担过重,同时使其他11个逻辑核几乎处于空闲状态。一旦我成功地从渲染线程分离并并行化了生产者,包含相当复杂的数据过滤的MIDI阅读器迟早会崩溃循环缓冲区,即使使用
dispatch\u async(dispatch\u get\u main\u queue()…)
用于将相关数据移出。无锁使用者不应要求分派。如何在UNIX或Linux中实现跨平台的硬实时线程(如果可能的话)是一个完全不同的问题。谢谢。此处(解释的)MIDI信息的使用者必须是生产者,生产者可以等待(实时)CA使用者呈现线程发出的调度信号。在这一阶段,我并不追求严格的“硬”同步要求,而是试图找到最简单的解决方案,其中从MIDI更新一些值不需要导致数据损坏或使(非CA)生产者和CA消费者之间的循环缓冲区容易崩溃……无锁fifo消费者不应该有任何崩溃的理由。它应该只是从预先分配的内存中读取。感谢您鼓励我沿着正确的方向走正确的道路!