Android Audio延迟(latency)

最近在看Android中播放延迟的问题,看了下代码,发现AudioTrack类中的函数latency有以下注释:


够强大,前几天自己还叭叭根据buffer计算延迟呢,原来可以调个函数就搞定。


看看函数AudioTrack::latency()的实现吧:


没什么内涵,直接返回了成员变量。
mLatency是在哪儿被 赋值的呢?


AudioTrack::createTrack函数中对mLatency进行了赋值:


其中afLatency是硬件的延迟。
(1000*mCblk->frameCount) / sampleRate,这一坨,是根据AudioTrack中的audio_track_cblk_t的buffer,计算AudioTrack buffer导致的延迟。


afLatency的来历,也在函数AudioTrack::createTrack中:


AudioSystem::getOutputLatency函数中首先根据stream type获取对应的output,然后尝试获取output的描述.
若取得成功,则使用output描述中的延迟;否则,获取AudioFlinger,并使用AudioFlinger中的延迟。
具体代码如下:


先看看AudioFlinger中的latency:
AudioFlinger::latency函数中,首先获取output对应的PlaybackThread,然后取得PlaybackThread的latency:


看看函数AudioFlinger::PlaybackThread::latency():


我做的这个项目中,mOutput其实就是AudioStreamOutALSA。
AudioStreamOutALSA::latency()函数:


mHandler中父类ALSAStreamOps的构造函数中被赋值。
用的是AudioStreamOutALSA构造函数中的参数handle。


AudioStreamOutALSA对象在函数AudioHardwareALSA::openOutputStream中被创建:


it的赋值:


mDeviceList的赋值在AudioHardwareALSA的构造函数中:


init函数其实就是s_init函数:




原来就是在这儿指定的latency:


回头看看,若是在函数AudioSystem::getOutputLatency中找到了output的描述,情况又是怎样的呢?


output描述是在AudioPolicyManagerBase的构造函数中被创建。
其中,latency是通过调用函数mpClientInterface->openOutput取得:


其实就是调用了函数AudioFlinger::openOutput。
其中对latency的赋值:


与前面的那条河流汇合了。

posted @ 2012-06-06 10:19  andriod2012  阅读(2351)  评论(0编辑  收藏  举报