【问题标题】:How to maximize performance of Real-Time processing (Portaudio)如何最大化实时处理的性能(Portaudio)
【发布时间】:2017-11-27 20:24:04
【问题描述】:

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

所以,我的问题:

  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?

【问题讨论】:

  • 这是很多调整,但在应用它们之前,您应该定义确切的“实时”是什么,并测量应用程序的现有性能/延迟,以确定您是否真的需要做任何事情。

标签: windows audio process real-time portaudio


【解决方案1】:

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

这取决于。 SetPriorityClass 适用于整个过程,而通常您只希望音频线程具有这样的功能。 PortAudio 源代码对此有评论here。然后,您当然必须使用SetThreadPriority 调整音频线程本身的优先级。 This thread on the PA mailing list has a lot of useful information.

它的要点似乎是它实际上取决于用于访问声卡的 Windows 方式:ASIO、WASAPI 等。

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2021-01-21
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多