C 为什么portaudio会突然返回回调?

C 为什么portaudio会突然返回回调?,c,linux,audio,alsa,portaudio,C,Linux,Audio,Alsa,Portaudio,我正在使用portaudio网站上提供的示例录音程序。我对帧索引是如何递增的感到困惑 假设缓冲区大小为512帧,采样率设置为44100Hz,则假设程序通过缓冲区工作,返回回调,并大约每11.6毫秒将帧索引增加512。在main()中,我让程序每12毫秒输出一次当前帧索引(与示例中的每1000毫秒相反,但我的其余代码与他们的代码相同),我假设每行输出会增加512,但事实并非如此。这是输出的一部分: index at 12 ms = 0 index at 24 ms = 0 index at 36

我正在使用portaudio网站上提供的示例录音程序。我对帧索引是如何递增的感到困惑

假设缓冲区大小为512帧,采样率设置为44100Hz,则假设程序通过缓冲区工作,返回回调,并大约每11.6毫秒将帧索引增加512。在main()中,我让程序每12毫秒输出一次当前帧索引(与示例中的每1000毫秒相反,但我的其余代码与他们的代码相同),我假设每行输出会增加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,直到36毫秒,然后跳到1024,然后索引在60毫秒时突然从1024增加到2048。索引增加的方式不是预期的方式,也不一致。您会注意到索引从1递增需要24毫秒024到2048,然后36毫秒从2048增加到3072,但之后只有12毫秒从6144增加到7680


我的问题是,这里发生了什么?我能做些什么来让输出以更一致的速率发生?这可能与ALSA音频缓冲区大小有关吗?

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

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

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

我的回答中有更多信息:

我该怎么做才能使输出以更一致的速率发生

在适当的参数中请求一个较小的延迟,以获得Pa_OpenStream()

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

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


请注意,获得1024帧主机缓冲区可能有某些特定于ALSA或特定于设备的原因。但我会首先尝试上面的方法。

也许您的测量时钟的粒度比您预期的要大。显然,您正在尝试从
main
异步采样回调状态。最好存储fr数组中的ame索引和时间戳(在回调本身中)。然后您可以从
main
打印该信息。您所说的“帧索引”是什么意思?这个数字来自哪里?