如何最大限度地提高实时处理的性能(Portaudio)

时间:2017-06-24 10:09:12

标签: windows audio process real-time portaudio

我在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)。

所以,我的问题:

  1. 将整个程序作为高(或最高,实时)进程启动是否值得,如下所示(使用SetPriorityClass WinAPI函数):

    SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

  2. 是否值得降低程序的GUI 线程的优先级,如下所示:

    QThread::currentThread()->setPriority(QThread::LowPriority);

  3. 在任何需要进行实时操作的程序中,最好是最大化整个流程优先级还是降低GUI线程优先级?

  4. 使用ASIO driver protocol进行实时音频处理时,Windows 10是否优于Windows 7?

1 个答案:

答案 0 :(得分:0)

  

将整个程序作为高(或最高,实时)进程启动是否值得,如下所示(使用SetPriorityClass WinAPI函数)

这取决于。 SetPriorityClass适用于整个过程,而通常您只需要音频线程这样的功能。 PortAudio源代码对它有一个评论here。那么您肯定必须使用SetThreadPriority调整音频线程本身的优先级。 This thread on the PA mailing list has a lot of useful information.

它的要点似乎是它真的取决于用于访问声卡的Windows方式:ASIO,WASAPI等。