2

我正在使用双簧管库来制作音乐应用程序。在那里,我通过将 PCM 浮点值写入给定的指针来制作音乐。我很少听到我能听到的underruns。我还使用以下双簧管 API 验证了这一点:

managedStream->getXRunCount();

文档说以下内容:

 * An XRun is an Underrun or an Overrun.
 * During playing, an underrun will occur if the stream is not written in time
 * and the system runs out of valid data.
 * An underrun or overrun can cause an audible "pop" or "glitch".

我正在尝试调试问题。我发现了 Don 的这个很棒的教程。我使用以下内容捕获了 10 秒的 systrace,请注意,在这 10 秒内,我听到了 0 个可听的欠载弹出/点击声音:

systrace.py --time=10 -o trace.html -a com.example.app 音频调度频率

调用结果如下aaRdy(蓝色框高度显示缓冲区中有多少样本,需要的样本越多高度越高): 在此处输入图像描述 这只是 aaRdy 调用的一小部分。我的缓冲区永远不会有 0 个样本。我检查了所有的。在唐写的文章中,他说:

但随后缓冲区开始为空,首先下降到 96 帧,然后……哦,天哪……到零!在零时,我们保证会出现音频故障,因为缓冲区中没有数据。

这是文章的截图: 在此处输入图像描述

我的问题是看这篇文章,我可以保证如果蓝框是空的,那么就会出现欠载。但是,在我的 systrace 中,它永远不会是空的,而且我没有听到没有运行不足的弹出点击,但managedStream->getXRunCount();实际上返回了调用12。我不确定是否存在欠载。

蓝框的减少是否意味着即使它不是 0 也存在欠载?

4

2 回答 2

3

唐在这里:)

跟踪中的缓冲区未满是什么意思。

这意味着在那个时刻,音频硬件从缓冲区中读取(和删除)数据的速度比您的应用程序写入数据的速度要快。

如果您的应用程序使用大量 CPU 来生成音频数据,这是相当正常的情况。也许系统上的某些其他进程优先于音频线程,并且您的应用程序无法足够快地生成所需数量的音频帧。

仅当缓慢写入情况持续足够长的时间以使缓冲区完全清空,并且音频设备在缓冲区为空时从缓冲区读取时,这才会成为问题。在这种情况下,您将遇到欠载,并且 XRuns 计数器将增加。

正如您正确指出的那样,XRuns 计数器将记录流生命周期内的欠载(或记录流的溢出)的数量。

于 2021-06-04T14:10:08.740 回答
0

我深入研究并发现

managedStream->getXRunCount();

返回流整个生命周期的 XRun 数。我认为它会返回相对于先前调用的值。所以显然我得到了 12,但没有出现欠载,因为这是来自之前欠载的会话。

但是,我很想看到在跟踪中有一个非完整缓冲区意味着什么的解释。

于 2021-04-14T23:08:22.527 回答