1

我正在实现一个音频合成器。我有一个 AudioCallback 函数,它在需要 Audiodata 时被调用(由 Soundcarddriver !?)。现在我想在 Qt 中创建一个 GUI。但这不起作用,因为回调函数会干扰 GUI(我认为这是问题所在)。

我的问题:

1) 如何在 Qt 中实现回调函数?2)对音频和gui使用不同的线程是否合理?还是有一个更简单的解决方案?

谢谢 ;-)

4

1 回答 1

1

如果您打算以低延迟处理音频 - 这是实时使用的任何软合成器的绝对要求 - 必须使用单独的线程进行音频渲染,此外,您希望它具有实时调度优先级。您当然不想将其提供给您的 UI 代码。

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

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

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

根据您平台的音频库的设置方式:

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

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

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

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

您还可以考虑查看Juce - 它为 VST 主机和插件提供源代码。

于 2013-01-17T00:32:16.587 回答