Android 双簧管Systrace是否将非满缓冲区视为欠载?

Android 双簧管Systrace是否将非满缓冲区视为欠载?,android,systrace,oboe,Android,Systrace,Oboe,我正在使用library制作一个音乐应用程序。在那里,我通过将PCM浮点值写入给定指针来生成音乐。我很少有我能听到的低谷。我还通过以下双簧管API验证了这一点: managedStream->getXRunCount(); 这些文件说: 我正试图调试这个问题。我在唐那里找到了这个。我用以下内容捕捉了10秒钟的systrace,注意在这10秒钟内,我听到了0个可听到的低沉的砰砰声/咔嗒声: systrace.py--time=10-o trace.html-a com.example.ap

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

managedStream->getXRunCount();
这些文件说:

我正试图调试这个问题。我在唐那里找到了这个。我用以下内容捕捉了10秒钟的systrace,注意在这10秒钟内,我听到了0个可听到的低沉的砰砰声/咔嗒声:

systrace.py--time=10-o trace.html-a com.example.app audio sched 频率

通过
aaRdy
调用,结果如下(蓝框高度显示缓冲区中有多少样本,越高所需的样本越多): 这只是aaRdy呼叫的一小部分。从来没有一次我的缓冲区有0个样本是它。我都检查过了。在唐写的文章中,他说:

但随后缓冲区开始变空,首先下降到96帧, 然后……哦,天哪……归零!在零点,我们保证有一个音频 由于缓冲区中没有数据而出现故障

以下是文章的截图:

我的问题是,看看这篇文章,我可以保证,如果蓝框是空的,那么就有一个不足。然而,在我的systrace中,它从来都不是空的,我听到的不是运行不足的弹出式单击,而是
managedStream->getXRunCount()实际返回的调用
12
。我不确定是否有人跑得不够好


蓝色方框的减少是否意味着即使不是0,也存在不足?我深入研究发现了这一点

managedStream->getXRunCount()

返回流在整个生命周期内的运行次数。我认为它会返回与上一次调用相关的值。很明显,我得到了12分,但没有跑偏,因为这是上次跑偏的那节课

但是,我希望看到一个解释,说明在跟踪中有一个非满缓冲区意味着什么。Don here:)

跟踪中有一个非满缓冲区意味着什么

这意味着此时音频硬件从缓冲区读取(和删除)数据的速度要快于应用程序写入数据的速度

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

只有当慢速写入情况持续足够长的时间使缓冲区完全清空,并且音频设备在清空时从缓冲区读取时,这才会成为问题。在这种情况下,您将得到一个欠运行,并且XRuns计数器将递增


正如您正确指出的那样,XRuns计数器将记录流生命周期内的运行不足次数(或记录流的超限次数)。

我对音频处理一无所知,但您可以看到在Android源代码中如何测量
aaRdy
systrace计数器的值:。本质上,它是数据缓冲队列中的完整帧数。当它为0时,可能意味着缓冲区已满。我想你的意思是说“当它为0时,缓冲区为空”这是可用的完整帧数(
mAudioEndpoint->getFullFramesAvailable()
),意味着可用于写入的缓冲区帧。当它为0时,缓冲区已完全被占用,必须删除某些内容。感谢您的解释。顺便说一句,我真的很欣赏双簧管。它非常棒,使处理低级别音频比记录不全的低级别本机IOS音频框架容易得多。双簧管是非常好的记录,它是非常有趣的使用双簧管至今。继续做精彩的工作:)
 * 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".