C++ for 循环太慢

Joh*_*per 1 c++ callback portaudio

我正在尝试使用 PortAudio 制作音频应用程序。我的回调函数一直很慢,它一直在造成不断的欠载。我一一删除了回调中的所有内容,直到找到问题:for 循环。我删除了所有内容,以便回调函数中唯一发生的事情是 for 循环,它仍然导致欠载。我知道这是 for 循环,因为当我减少迭代次数时,欠载就会消失。

static int patestCallback(const void *inputBuffer, void *outputBuffer,
                      unsigned long framesPerBuffer,
                      const PaStreamCallbackTimeInfo *timeInfo,
                      PaStreamCallbackFlags statusFlags, void *userData)
{
    int x = 0;
    for (int jj = 0; jj < 10000; jj++)
    {
        x++; // for testing, not actually used
    };
    return paContinue;
}
Run Code Online (Sandbox Code Playgroud)

这是我用于测试的完整代码: https //gist.github.com/johnroper100/b87641f5609dbb49bc3c1121b1f4daf1

这个问题并不是真正必要的,但我在 python 等价物 (sounddevice) 中做了相同的回调并且没有问题。

Ada*_*adi 6

从 API 文档

当流运行时,PortAudio 会定期调用流回调。回调函数负责处理通过输入和输出参数传递的音频样本的缓冲区。

PortAudio 流回调以非常高或实时的优先级运行。它需要始终如一地满足其时间期限。不要分配内存、访问文件系统、调用库函数或从流回调调用其他函数,这些函数可能会阻塞或需要不可预测的时间才能完成。

为了让流保持无故障操作,回调必须比记录和/或播放音频数据更快地消耗和返回音频数据。PortAudio 预计每个回调调用可能会以流采样率执行接近 frameCount 音频帧的持续时间。期望能够在 PortAudio 回调中利用 70% 或更多的可用 CPU 时间是合理的。但是,由于缓冲区大小自适应和其他因素,并非所有主机 API 都能够在 CPU 负载较大且具有任意固定回调缓冲区大小的情况下保证音频稳定性。当需要高回调 CPU 利用率时,可以通过使用 paFramesPerBufferUnspecified 作为 Pa_OpenStream() framesPerBuffer 参数来实现最稳健的行为。

我强调了相关部分。