【发布时间】:2020-09-09 12:45:17
【问题描述】:
我正在尝试使用 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;
}
这是我的完整测试代码:https://gist.github.com/johnroper100/b87641f5609dbb49bc3c1121b1f4daf1
这个问题没有必要,但我在 python 等效项(sounddevice)中做了相同的回调,没有问题。
【问题讨论】:
-
如果完全删除
for循环会发生什么? -
如果优化,编译器将完全删除循环。我不确定您当前的代码在循环中没有任何内容。
-
我的水晶球说您正在测试未优化的调试版本(大多数编译器的默认设置)而不是优化的发布版本...
-
sn-p 代码只是为了演示还是你已经实际运行过?询问是因为返回值缺少声明并且代码不应该编译。
-
如果您提供问题的minimal reproducible example 的完整源代码,可能会有所帮助。您在 StackOverflow 上发布的代码不可重现,您在 GibHub 上发布的代码也不是最少的,因为它对音频数据进行了广泛的操作(这似乎没有必要,并且可能包含错误)。为了一个最小的可重现示例,您可能需要考虑通过算法生成音频数据,例如通过生成完全静音的音频数据。