什么是Qt中低延迟音频合成的最佳多线程方法?

时间:2015-11-25 18:07:48

标签: c++ multithreading qt audio qtmultimedia

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

软合成器的组件是:

  • 主窗口,用于处理UI
  • 综合引擎,是QIODevice的子类
  • QAudioOutput,这是Qt多媒体低延迟音频输出类

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

实际上,如果缓冲区小于100毫秒,我会发现毛刺。这对于良好的响应能力来说太长了。

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

  1. 如果它已经是QIODevice的子类
  2. ,该如何做到这一点
  3. 这是否会干扰QAudioOutput(无论如何都是在自己的线程中?)

2 个答案:

答案 0 :(得分:4)

Qt对你的努力将是零帮助,并且很可能 - 阻碍。低延迟音频是最不重要的,特别是在Windows上,它仍然使用过时的MME API。无论你投入多少线程,它都不会变得更好。

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

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

答案 1 :(得分:2)

让我们概述一些问题。正如其他人所说,Qt给党带来的一点点。低延迟音频不是其多媒体框架的设计目标。

架构:

商业软合成器总是被编写为其他音频软件的插件。这种方法的优点是插件的体系结构非常有限,而其他人已经解决了许多硬线程和性能问题。斯坦伯格的VST和Apple的Audio Units是两个明显的例子。两者都能够以毫秒的顺序处理延迟。

实时特征

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

线程:

编写综合插件时,您实际上只关注两件事:

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

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

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

主机应用程序

如果你坚持编写主机应用程序,那么你应该做几乎所有业内其他人的工作,并使用Steinberg's ASIO图层。

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