Audiocallback in Qt
Audiocallback in Qt
我正在实现一个audiosynthesizer。我有一个AudioCallback函数,当需要Audiodata时,它被调用(由Soundcarddriver !?)。现在我想在qt中创建一个GUI。但这不起作用,因为callback函数会干扰GUI(我认为这就是问题所在)。
我的问题:
1)我如何在Qt中实现callback函数?2)音频和gui使用不同的线程是否合理?或者,从一开始,有没有更简单的解决方案?
谢谢;-)
如果您打算以低延迟处理音频——这是任何实时使用的软合成器的绝对要求——使用单独的线程进行音频渲染是强制性的,此外,您希望它具有实时调度优先级。你肯定不想把这个交给你的UI代码。
音频需要频繁的维护——可能每毫秒一次。UI线程忙于其他任务,在调度UI事件时,它无法处理音频。系统可实现的延迟受到填充音频缓冲区的最长调度延迟的限制。这在UI线程上可能是不受限制的。
我不清楚你使用哪个库来访问音频IO -或者实际上在哪个平台上。QtMultimedia提供的QAudioOutput
似乎不是您想要的。
最有可能的是,音频渲染回调发生在很少与Qt交互的情况下,你当然不想将渲染请求发布到UI线程上——这似乎是Qt开发的自然范例。
取决于你的平台的音频库是如何设置的:
- 创建一个实时线程并阻塞直到缓冲区需要填充(Linux/Alsa);或者,
- 音频库为您完成此操作并回叫您(MacOSX &iOS/CoreAudio)
在你的渲染线程中,do应该除了生成数据来填充输出缓冲区之外什么都不做,并且你不应该执行任何可能阻塞的操作。
稍微棘手的一点是线程安全,将注释数据放入渲染循环。为了避免访问事件队列时的优先级反转,这通常实现为无锁FIFO。如果您打算在呈现线程中触发UI更新,则需要将这些更新发布到UI循环中。Qt的信号和插槽是一个很好的选择。
如果项目的真正目的是开发一个软合成器,那么最好开发一个VST插件。有很多开源的VST主机可以解决线程问题。
您还可以考虑看看Juce——它提供了VST主机和插件的源代码。
- cuda 10.2 in Qt 5.14 ubuntu 18.04
- QPaintedTextureImage in Qt3D (Qt 5.8)
- 没有成员命名 'setRawData' in 'QwtPlotCurve' - 转换 Qt 4.7 为 Qt 5.8
- 没有成员命名 'setResizeMode' in 'QHeaderView' - 转换 Qt 4.7 为 Qt 5.8
- QT c++ "Windows.h no such a file or dictionary in main.ccp"
- UCHAR to Qstring in QT C++
- AES 256 encryption in C++ and Qt 5
- Qt: set columns in treeView
- unique_ptr in Qt project
- QT QTcpServer in thread;如何在退出时关闭侦听服务器
- Qt控制台应用程序"WARNING: QApplication was not created in the main() thread"
- c++ QT and OpenCV. setMouseCallBack in QLabel?
- QSystemTrayIcon in ubuntu, sni-qt
- Qt textChange() in QTextEdit
- Qt + OpenCV in Debian
- Qt QPainter in paintEvent消除了使用paintGL绘制的图形
- const char* to LPCWSTR in Qt
- Qt GUI in a library?
- Qt 中 OpenCV "Can't load OpenGL extension [glBindBuffer] in function IntGetProcAddress"例外
- 分段错误 - OpenCV 和 Qt in Netbeans on Ubuntu