音频输出单元的输入回调中允许采取哪些操作
我正在使用音频输出单元捕捉麦克风数据。 我收到通知,有数据要通过我使用kAudioOutputUnit_SetInputCallback属性设置的回调进行读取,并且在回调中,我通过调用AudioUnitRender()读取数据。
最终,我将根据通过分析此数据提取的某些信息更新我的应用程序的用户界面。 因此,我需要在某个阶段对主队列执行dispatch_async。 这个分析过程非常耗时,并且比我从AudioUnitRender()中获得的分块大得多,所以负载是突发的。
我的问题是:在实现输入回调本身时哪些操作被认为是可以接受的? 我发现有很多来源表示严格限制渲染回调(没有内存分配,没有I / O,没有与其他线程同步等),但没有关于输入回调的任何信息。
如果我遵循与呈现回调相同的规则,我会遇到一些挑战。 dispatch_async()本身是不受欢迎的,因为它分配内存,并且负载无论如何都是突发的(在某些转动中可能比一个渲染周期更长,而其他实际上零)。 因此,似乎有必要将我的数据发送给工作线程进行处理并进行dispatch_async()调用。 但是,我仍然需要管理将数据传递给此工作线程。 最简单的方法(在C ++中)是一个循环缓冲区,加上一个互斥量和条件变量来表示数据何时可用。 但是,这需要输入回调来锁定互斥锁,因此回调函数的指导原则明确禁止。
避免这种互斥锁会让我锁定循环缓冲区,信号量(POSIX或GCD),自旋锁等,我想知道这是否只是简单地听一个麦克风的矫枉过正。 这个东西有一个令人震惊的缺乏文档,我不知道幕后发生了什么。 我是否真的需要关注在我的输入回调实现中等待互斥体(只是简单且很少被另一个线程锁定)?
我使用来自https://github.com/michaeltyson/TPCircularBuffer的循环缓冲区
说明书指出:
只要您将多线程访问限制为只有一个生产者,并且仅限一个消费者,则此实用程序应该是线程安全的。
所以你可以安全地从循环缓冲区中安全地渲染(产生)和处理(消耗),而不用担心锁定。
更新 :
我是否真的需要关注在我的输入回调实现中等待互斥体(只是简单且很少被另一个线程锁定)?
对此我说是的。 “很少锁定”是您输入回调失败所需的全部。 而“简单”已经太长了。 我输入回调失败只是NSLogging的东西。
链接地址: http://www.djcxy.com/p/67029.html上一篇: What actions are permitted in an Audio Output Unit's input callback