Audiocallback in Qt

Audiocallback in Qt

本文关键字:Qt in Audiocallback      更新时间:2023-10-16

我正在实现一个audiosynthesizer。我有一个AudioCallback函数,当需要Audiodata时,它被调用(由Soundcarddriver !?)。现在我想在qt中创建一个GUI。但这不起作用,因为callback函数会干扰GUI(我认为这就是问题所在)。

我的问题:

1)我如何在Qt中实现callback函数?2)音频和gui使用不同的线程是否合理?或者,从一开始,有没有更简单的解决方案?

谢谢;-)

如果您打算以低延迟处理音频——这是任何实时使用的软合成器的绝对要求——使用单独的线程进行音频渲染是强制性的,此外,您希望它具有实时调度优先级。你肯定不想把这个交给你的UI代码。

音频需要频繁的维护——可能每毫秒一次。UI线程忙于其他任务,在调度UI事件时,它无法处理音频。系统可实现的延迟受到填充音频缓冲区的最长调度延迟的限制。这在UI线程上可能是不受限制的。

我不清楚你使用哪个库来访问音频IO -或者实际上在哪个平台上。QtMultimedia提供的QAudioOutput似乎不是您想要的。

最有可能的是,音频渲染回调发生在很少与Qt交互的情况下,你当然不想将渲染请求发布到UI线程上——这似乎是Qt开发的自然范例。

取决于你的平台的音频库是如何设置的:

  1. 创建一个实时线程并阻塞直到缓冲区需要填充(Linux/Alsa);或者,
  2. 音频库为您完成此操作并回叫您(MacOSX &iOS/CoreAudio)

在你的渲染线程中,do应该除了生成数据来填充输出缓冲区之外什么都不做,并且你不应该执行任何可能阻塞的操作。

稍微棘手的一点是线程安全,将注释数据放入渲染循环。为了避免访问事件队列时的优先级反转,这通常实现为无锁FIFO。如果您打算在呈现线程中触发UI更新,则需要将这些更新发布到UI循环中。Qt的信号和插槽是一个很好的选择。

如果项目的真正目的是开发一个软合成器,那么最好开发一个VST插件。有很多开源的VST主机可以解决线程问题。

您还可以考虑看看Juce——它提供了VST主机和插件的源代码。