为什么portaudio会以突发方式返回回调?

时间:2016-10-27 20:04:58

标签: c linux audio alsa portaudio

我正在使用portaudio网站上可用的here示例录制程序。我对如何增加帧索引感到困惑

鉴于缓冲区大小为512帧,并且采样率设置为44100Hz,您可以假设程序通过缓冲区工作,返回回调,并且大约每11.6 ms将帧索引增加512。在main()中,我让程序每12ms输出一次当前帧索引(与示例中的每1000ms相反,但我的代码的其余部分与他们的相同),我假设每次增加512输出线,但事实并非如此。这是输出的一部分:

index at 12 ms = 0
index at 24 ms = 0
index at 36 ms = 1024
index at 48 ms = 1024
index at 60 ms = 2048
index at 72 ms = 2048
index at 84 ms = 2048
index at 96 ms = 3072
index at 108 ms = 3072
index at 120 ms = 3072
index at 132 ms = 4096
index at 144 ms = 4096
index at 156 ms = 4096
index at 168 ms = 5120
index at 180 ms = 5120
index at 192 ms = 5120
index at 204 ms = 6144
index at 216 ms = 7680

正如您所看到的,这种情况正在以一种奇怪的方式递增。索引保持在0到36ms,然后跳转到1024,然后索引在60ms时从1024突然增加到2048。索引增加的方式不是人们期望的方式,而且它也是不一致的。您会注意到索引需要24毫秒才能从1024增加到2048,然后是36毫秒从2048增加到3072,但之后只有12毫秒从6144增加到7680.

我的问题是,这里发生了什么,我该怎样做才能让输出以更一致的速度发生?是否与ALSA音频缓冲区大小有关?

1 个答案:

答案 0 :(得分:1)

PortAudio回调缓冲区大小不一定是主机缓冲区大小。两者之间的关系很复杂,因为并非所有主机API都支持所有缓冲区大小,但PortAudio将“适应”#34;支持您请求的回调缓冲区大小。

PortAudio使用包含多个约束的算法计算主机缓冲区大小,包括:用户缓冲区大小,请求的延迟,支持的主机缓冲区大小和启发式。

例如,如果您请求一个非常小的回调缓冲区大小,但是延迟很大,则PortAudio可能会使用更大的主机缓冲区大小,并且您可能会观察到突发回调。这看起来像你正在发生的事情:1024帧主机缓冲区大小,但512帧PA回调缓冲区大小。

我的答案中有更多信息: Time between callback calls?

  

我能做些什么来使输出以更一致的速度发生?

在Pa_OpenStream()的适当参数中请求较小的延迟。

对于某些PortAudio主机API,还有一种主机API特定的机制来强制主机缓冲区大小。我不确定ALSA是否提供该选项。

或者,您可以使用paFramesPerBufferUnspecified选项,这将导致PortAudio和ALSA根据您请求的延迟协商的任何缓冲区大小进行更频繁的回调。

请注意,为什么您需要获取1024帧主机缓冲区,因此可能存在某些ALSA特定或设备特定原因。但我先试试上面的内容。