【问题标题】:OSX - passing midiReadProc results to the main thread in COSX - 将 midiReadProc 结果传递给 C 中的主线程
【发布时间】:2016-01-30 18:38:58
【问题描述】:

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

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

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

它们通过 dispatch_semaphores 进行协调。

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

就从 GUI 控制生产者而言,一切都很好。

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

有没有什么方法可以做到这一点,而不是太特定于 OSX?

提前致谢。

【问题讨论】:

    标签: macos core-audio coremidi


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我希望尽可能远离 iOS,如果可能的话,更接近常见的 UNIX。我有一个声化实用程序,只要生成数据保留在 CA 渲染线程上,它就可以正常工作。不幸的是,这使渲染线程负担过重,而其他 11 个逻辑核心几乎处于空闲状态。一旦我设法将生产者从渲染线程中拆分和并行化,即使使用dispatch_async(dispatch_get_main_queue()..) 将相关数据移出循环缓冲区,包含相当复杂的数据过滤的 MIDI 阅读器迟早会崩溃。
    • 无锁消费者不应该要求调度。如何在 UNIX 或 Linux 中进行跨平台硬实时线程(如果可能的话)是一个完全不同的问题。
    • 谢谢。此处(解释的)MIDI 信息的消费者必须是生产者,它可以等待从(实时)CA 消费者渲染线程发出的 dispatch_semaphore_wait 信号。在这个阶段,我不追求严格的“硬”同步要求,而是试图找到最简单的解决方案,在这种解决方案中,从 MIDI 更新一些值不会导致数据损坏或在(非 CA)生产者和 CA 之间建立循环缓冲区消费者容易崩溃......
    • 无锁fifo消费者不应该有任何崩溃的理由。它应该只是从预先分配的内存中读取。
    • 感谢您鼓励我朝着正确的方向前进!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多