【问题标题】:What is the best multithreading approach to low-latency audio synthesis in Qt? [closed]Qt 中低延迟音频合成的最佳多线程方法是什么? [关闭]
【发布时间】:2015-11-25 18:07:48
【问题描述】:

我正在使用 Qt 创建一个软合成器。这意味着获得低延迟音频(缓冲区大小约为 5-10 毫秒),以便响应 UI 控件。

软合成器的组成部分是:

  • 处理 UI 的主窗口
  • 综合引擎,它是 QIODevice 的子类
  • QAudioOutput,它是 Qt Multimedia 低延迟音频输出类

我基于我自己的破解版spectrum example 使用拉模式生成基本波表合成器。

在实践中,如果缓冲区小于 100 毫秒左右,我发现我会出现故障。这对于良好的响应能力来说太长了。

解决方案似乎是多线程,但我不清楚如何在 Qt 中构建它。我的直觉是将合成器引擎放入自己的线程中,但我不清楚

  1. 鉴于它已经是 QIODevice 的子类,如何执行此操作
  2. 这是否会干扰 QAudioOutput(无论如何它都在自己的线程中?)

【问题讨论】:

    标签: c++ multithreading qt audio qtmultimedia


    【解决方案1】:

    Qt 对你的努力将是零帮助,而且很可能 - 阻碍。低延迟音频是最低优先级,尤其是在 Windows 上,它仍然使用过时的 MME API。不管你扔多少线程,它都不会好转。

    我建议你下载并构建一个第三方库,我使用 RTAudio 取得了非常好的结果,它支持不同平台上的许多低延迟后端。您仍然可以将 Qt 用于 GUI。如果需要,您可以轻松地将 RTAudio 封装在 QIODevice 中。

    是的,不用说你不应该使用主/GUI线程进行合成。

    【讨论】:

    • 感谢您的建议。完全是我不想听到的,在 Qt 上投入了一些时间,但在我进入兔子洞之前听到它非常有用。
    • 您在 Qt 上投入的时间并没有浪费,因为 Qt 是一个大型应用程序框架,特别是在低延迟音频方面,它并没有真正发挥作用。构建和使用 RTAudio 很容易,将其包装在 QIODevice 中以更好地兼容 Qt 的设计范例,即信号和插槽,甚至基于编程等等。
    • 作为我最初的问题和这个答案的后续,我将QThread 子类化并将我的合成器放入它创建的线程中(使用 rtAudio 进行音频输出)。将线程优先级设置为QThread::TimeCriticalPriority 并且我自己的生产者-消费者非阻塞信号将控制更改发送到合成器,我在 iOS、Windows 和 MacOS 上使用低至 3 毫秒的缓冲区长度没有问题。
    【解决方案2】:

    让我们再概述几个问题。正如其他人所说,Qt 对聚会没有什么好处。低延迟音频不是其多媒体框架的设计目标。

    架构:

    商业软件合成器总是被编写为其他音频软件的插件。这种方法的优点是插件的架构非常受限制,并且其他人已经解决了许多硬线程和性能问题。 Steinberg 的VST 和Apple 的Audio Units 是两个明显的例子。两者都能够处理毫秒级的延迟。

    实时特性

    在考虑实时系统时,最坏情况下的延迟。在音频的情况下,它是在墙上时间的样本缓冲区的持续时间加上任何开销,以适应操作系统安排执行和完成处理的最坏情况延迟。

    线程:

    在写合成插件的时候,你真的只关心两件事:

    • 实现渲染处理程序 - 当主机需要合成器生成的样本时由主机调用,通常以实时(或至少提升)线程优先级调用。
    • 实现事件处理程序 - 在较低优先级线程中调用。复杂的是,这不应该在渲染线程中导致priority inversion - 它不可避免地与它共享一些数据结构。为此,您需要无锁数据结构。

    您必须在某个地方管理软合成器参数的调制和参数自动化 - 可能在另一个线程中。

    当然,插件通常也有 UI,但它在 UI 线程上以最低优先级运行,并且应该通过事件处理程序与渲染处理程序完全解耦。

    托管应用程序

    如果您也坚持编写主机应用程序,那么您最好做业内几乎所有其他人都在做的事情,并使用Steinberg's ASIO 层。

    但是,您也可以查看 Juce - 其中包括使用 ASIO 的插件主机、示例插件以及解决问题所需的几乎所有其他内容。

    【讨论】:

    • 感谢您的建议和额外的细节。感谢 Ross Bencina 的出色文章 rossbencina.com/code/… 我了解了优先级反转问题以及避免锁定/互斥锁的必要性。我喜欢 Qt 的 GUI 以及使用 QML 和 JavaScript 对其进行原型制作的能力,但音频必须正确,所以我听取了您的建议并查看了 Juce。
    • 请记住,Juce 对封闭源代码应用程序不是免费的,最便宜的许可证每月要花 50 美元,即每年 600 美元,如果低于一年,您不能支付如果您愿意支付,还不如一次性获得 1000 美元的专业许可证。 Projucer 很酷,但使用 QML 更快。 Juce 在 IO、GUI 等方面内置了许多音频特定的东西,而 Qt 没有,但 Qt API 更易于使用。
    • 如果 OP 想要在商业上开发软件,这是一个很好的交易 - 请记住,QT 也不是免费的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多