0

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

软合成器的组件是:

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

我基于我自己的频谱示例的破解版本来使用拉模式生成基本波表合成器。

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

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

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

2 回答 2

4

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

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

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

于 2015-11-25T19:13:58.557 回答
2

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

建筑学:

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

实时特性

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

穿线:

在编写合成插件时,您实际上只关心两件事:

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

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

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

主机应用程序

如果您还坚持编写主机应用程序,那么明智的做法是按照业内几乎所有其他人所做的事情,并使用Steinberg 的 ASIO层。

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

于 2015-11-25T23:18:39.740 回答