【发布时间】:2020-02-19 02:08:01
【问题描述】:
我正在构建一个基于 AudioUnit 回调工具和音频处理节点图的音频应用程序。我知道回调是在单独的(高优先级?)线程中执行的,因此与我的处理节点的所有交互,例如播放时更改 EQ 参数应以线程安全的方式进行。换句话说,在执行音频回调链时,应保护节点不被修改。
我对更底层的多线程的理解是,我需要在每个节点中使用一个锁,或者为整个图形设置一个锁,以防止在处理音频缓冲区时写入。
但是,我希望实现更加“Swifty”并使用应该提供上述功能的DispatchQueue/DispatchGroup。我只是不太明白如何以最有效的方式做到这一点。
假设所有音频参数的修改都在一个队列中完成,如下所示:
audioQueue.async {
eqNode.setEqParameters(...)
}
如何确保在 AudioUnit 回调完成之前不会执行此块?使用audioQueue.sync 不是一个选项,因为这意味着系统音频线程将依赖于我的audioQueue,这不是很好。
如果我使用DispatchGroup 实现上述流程的最佳方式是什么?
【问题讨论】:
标签: swift multithreading grand-central-dispatch audiounit dispatch-queue