gpt4 book ai didi

swift - AudioUnit回调与同步 : how to ensure thread safety with GCD

转载 作者:行者123 更新时间:2023-11-28 11:24:55 25 4
gpt4 key购买 nike

我正在构建一个基于 AudioUnit 回调工具和音频处理节点图的音频应用程序。我知道回调是在一个单独的(高优先级?)线程中执行的,因此所有与我的处理节点的交互,例如播放时更改 EQ 参数应以线程安全的方式进行。换句话说,在执行音频回调链时应保护节点不被修改。

我在更底层的多线程方面的理解是,我需要在每个节点或整个图形中使用一个锁,以防止在处理音频缓冲区时写入。

但是,我希望实现更加“敏捷”,并使用应该提供上述功能的 DispatchQueue/DispatchGroup。我只是不太明白如何以最有效的方式做到这一点。

假设所有音频参数修改都在队列上完成,如下所示:

audioQueue.async {
eqNode.setEqParameters(...)
}

如何确保在 AudioUnit 回调完成之前不执行此 block ?使用 audioQueue.sync 不是一个选项,因为这意味着系统音频线程将依赖于我的 audioQueue,这不是很好。

如果我要使用 DispatchGroup 什么是实现上述流程的最佳方式?

最佳答案

实时音频单元回调不应锁定、等待锁定或管理内存(Swift 或 Objective C 对象或方法)。

我会加倍缓冲音频参数集(或更多,例如参数集的环形缓冲区)。让作者锁定正在更改的设置,完成后解锁,并且永远不要以已知音频回调速率或比已知音频回调速率更快的速度切换设置(慢 2 倍以上是安全的)。让定期读取器(音频单元实时回调)检查锁定并且不使用锁定的参数集。

为了不在线程间环形缓冲区上使用锁,您可能希望在指针、索引或状态加载/存储上使用操作系统原子内存屏障:load_acquire、store_release 等,以防止 ARM 处理器写入缓冲区重新排序,或 Swift 优化器指令重新排序,以免损坏您的数据。

关于swift - AudioUnit回调与同步 : how to ensure thread safety with GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com