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) 中做了相同的回调并且没有问题。
当流运行时,PortAudio 会定期调用流回调。回调函数负责处理通过输入和输出参数传递的音频样本的缓冲区。
PortAudio 流回调以非常高或实时的优先级运行。它需要始终如一地满足其时间期限。不要分配内存、访问文件系统、调用库函数或从流回调调用其他函数,这些函数可能会阻塞或需要不可预测的时间才能完成。
为了让流保持无故障操作,回调必须比记录和/或播放音频数据更快地消耗和返回音频数据。PortAudio 预计每个回调调用可能会以流采样率执行接近 frameCount 音频帧的持续时间。期望能够在 PortAudio 回调中利用 70% 或更多的可用 CPU 时间是合理的。但是,由于缓冲区大小自适应和其他因素,并非所有主机 API 都能够在 CPU 负载较大且具有任意固定回调缓冲区大小的情况下保证音频稳定性。当需要高回调 CPU 利用率时,可以通过使用 paFramesPerBufferUnspecified 作为 Pa_OpenStream() framesPerBuffer 参数来实现最稳健的行为。
我强调了相关部分。
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |