首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt中低延迟音频合成的最佳多线程方法是什么?

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

Stack Overflow用户
提问于 2015-11-25 18:07:48
回答 2查看 1.6K关注 0票数 0

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

软合成器的组成如下:

  • 主窗口,它处理UI。
  • 合成引擎,它是QIODevice的一个子类。
  • QAudioOutput,它是Qt多媒体低延迟音频输出类。

我已经基于我自己的黑客版本的频谱示例,以生成一个基本的波式合成器使用拉模式。

在实践中,我发现如果缓冲区小于100 is,就会出现故障。这条路太长了,不能有很好的反应能力。

解决方案似乎是多线程,但我不清楚如何在Qt中构建这个结构。我的直觉是把合成引擎放到自己的线上,但我不清楚

  1. 如何做到这一点,因为它已经是QIODevice的子类了
  2. 这是否会干扰QAudioOutput (反正它在一个线程中)?
EN

回答 2

Stack Overflow用户

发布于 2015-11-25 19:13:58

Qt对你的努力毫无帮助,而且很可能是阻碍。低延迟音频是最不重要的,特别是在windows上,它仍然使用过时的MME。不管你向它扔了多少线,它也不会变得更好。

我建议您下载并构建一个第三方库,我在RTAudio上取得了很好的效果,它在不同的平台上支持许多低延迟后端。您仍然可以为GUI使用Qt。如果您愿意,可以轻松地将RTAudio包装在QIODevice中。

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

票数 4
EN

Stack Overflow用户

发布于 2015-11-25 23:18:39

让我们再概述几个问题。正如其他人所说,Qt给聚会带来的好处很少。低延迟音频不是它的多媒体框架设计的对象。

架构:

商业软合成器总是作为其他音频软件的插件来编写。这种方法的优点是插件的体系结构受到很大的限制,而且其他人已经解决了许多硬线程和性能问题。斯坦伯格的VST和苹果的音频单元就是两个明显的例子。这两种方法都能够按毫秒顺序记录延迟。

实时特性

当考虑实时系统时,最坏的情况是延迟.在音频的情况下,示例缓冲区的持续时间为墙壁时间,加上所需的任何开销,以适应操作系统在执行和完成处理过程中的最坏延迟。

线程:

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

  • 实现呈现处理程序--在主机需要由synth生成的示例时由主机调用,并且通常以实时(或至少提升)线程优先级的方式调用。
  • 实现事件处理程序--这是在低优先级线程中调用的。复杂之处在于,这不应导致呈现线程中的优先级反演,因为它不可避免地与呈现线程共享某些数据结构。为此您需要无锁的数据结构。

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

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

主机应用程序

如果您也坚持编写主机应用程序,那么明智的做法是做几乎所有行业中的其他人所做的事情,并使用斯坦伯格(氏) ASIO层。

但是,您也可以签出朱斯 --其中包括使用ASIO的插件主机、示例插件,以及解决问题所需的其他一切。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33923542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档