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