我在c ++实时音频处理程序中使用Portaudio库 我想知道是否可以在我的主处理函数中进一步卸载和加速处理,这被称为callback from the Portaudio high-priority thread:
“回调”是由PortAudio引擎调用的函数 无论何时捕获音频数据,或需要更多音频数据 输出。
在开始之前,重要的是要意识到回调是一个 精致的地方。这是因为某些系统在a中执行回调 特殊线程,或中断处理程序,它很少得到处理 与其余代码相同。对于大多数现代系统,你不会 能够通过在回调中进行不允许的调用来导致崩溃,但是 如果您希望您的代码产生无故障音频,您将不得不这样做 确保你避免可能需要无限量的函数调用 时间执行。究竟是什么取决于您的平台,但 几乎肯定包括以下内容:记忆 分配/解除分配,I / O(包括文件I / O以及控制台 I / O,例如printf()),上下文切换(例如exec()或yield()), 互斥操作,或任何可能依赖于操作系统的操作。如果你 认为简短的关键部分是安全的请阅读优先权 反转。 Windows和Mac OS调度程序没有实时安全性 优先反转预防。其他平台需要特殊的互斥锁 标志。此外,调用任何PortAudio API函数是不安全的 在回调中,除非在文档中明确允许。
目标操作系统:Windows 7(x32和x64)。
所以,我的问题:
将整个程序作为高(或最高,实时)进程启动是否值得,如下所示(使用SetPriorityClass WinAPI函数):
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
是否值得降低程序的GUI 线程的优先级,如下所示:
QThread::currentThread()->setPriority(QThread::LowPriority);
在任何需要进行实时操作的程序中,最好是最大化整个流程优先级还是降低GUI线程优先级?
使用ASIO driver protocol进行实时音频处理时,Windows 10是否优于Windows 7?
答案 0 :(得分:0)
将整个程序作为高(或最高,实时)进程启动是否值得,如下所示(使用SetPriorityClass WinAPI函数)
这取决于。 SetPriorityClass适用于整个过程,而通常您只需要音频线程这样的功能。 PortAudio源代码对它有一个评论here。那么您肯定必须使用SetThreadPriority调整音频线程本身的优先级。 This thread on the PA mailing list has a lot of useful information.
它的要点似乎是它真的取决于用于访问声卡的Windows方式:ASIO,WASAPI等。