gpt4 book ai didi

c++ - 我如何在 Windows 上有效地使用 PortAudio Pa_OpenStream()?

转载 作者:可可西里 更新时间:2023-11-01 09:59:45 24 4
gpt4 key购买 nike

我在 Linux 上用 PortAudio 编写了一个小型声音播放库。这是一个小游戏,所以当各种事情发生时会有很多小声音。我通过调用 Pa_OpenStream() 为每个要播放的 wav 文件打开一个流。在 Linux 上,这个调用平均需要 10 毫秒左右。但是在 Windows 上,这通常需要 40 到 70 毫秒。更糟糕的是,第一次调用需要 1.3 秒。然后偶尔会再次花费 1.3 秒。我一直无法找到关于它挂起原因的任何一致的地方,除了每次第一次通话都会发生这种情况。 Windows 构建实际上在 Wine 上运行良好。

我认为这与不同系统中使用的底层声音 API 的差异有关。但奇怪的是,尽管进行了广泛的搜索,但我在任何地方都找不到任何信息。

这是我的播放功能:

int play(const char * sN)
{
float threshold = .01f;

char * soundName = (char*)sN;
float g = glfwGetTime();
updatePlayer();
float g2 = glfwGetTime();
if (g2-g > threshold) printf("updatePlayer: %f/", g2 - g);
if (!paused && (int)streams.size() < maxStreams && !mute)
{
streamStr * ss = new streamStr;

g = glfwGetTime();
if (g-g2 > threshold) printf("new stream: %f/", g - g2);
PaError err;

sfData * sdata = getData(soundName);
ss->sfd = sdata;

g2 = glfwGetTime();
if (g2-g > threshold)printf("getData: %f/", g2 - g);
err = Pa_OpenStream(&(ss->stream), 0, &sdata->outputParameters, sdata->sfInfo.samplerate, paFramesPerBufferUnspecified, paNoFlag, PaCallback, ss);
if (err)
{
printf("PortAudio error opening output: %s\n", Pa_GetErrorText(err));
delete ss;
return 1;
}

g = glfwGetTime();
if (g-g2 > threshold)
printf("Pa_OpenStream: %f/", g - g2);

Pa_StartStream(ss->stream);

g2 = glfwGetTime();
if (g2-g > threshold)printf("Pa_StartStream: %f/", g2 - g);
addStreams(ss);

g = glfwGetTime();
if (g-g2 > threshold)printf("addStreams: %f", g - g2);
//Pa_SetStreamFinishedCallback(ss, finishedCallback);
printf("\n");
}
return 0;
}

最佳答案

我不知道为什么要花这么长时间(因为我不了解 Windows),但我可以说你的做法是错误的。具体来说,您不应该对打开新流有任何时间期望。例如,我希望在 OS X 上出现类似的问题(尽管程度要小得多)。

正确的实现是始终打开一个流,播放静音。然后,当您需要播放声音时,您可以立即播放。为了获得最佳延迟,您应该预加载文件的前几个缓冲区,这样您就不需要在播放开始时访问磁盘。我不知道在 Windows 上打开流的确切开销是多少(我确定这取决于 API),但在某些版本的 OS X 上,它是巨大的(整个内核开关如果之前没有音频运行,则进入抢占模式。

也就是说,1.3 秒太疯狂了。我建议在邮件列表上询问。请务必说明您正在使用的主机 API,因为您没有在此处说明,而且对于 Windows,这很重要。还有,什么版本的windows。

关于c++ - 我如何在 Windows 上有效地使用 PortAudio Pa_OpenStream()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com