最近在看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的赋值:


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

更多相关文章

  1. Android之设置页面(PreferenceActivity使用)
  2. Android(安卓)8.0: java.lang.IllegalStateException: Not allow
  3. 2018年Android最新面试题
  4. Android(安卓)Java和JavaScript代码相互调用
  5. Android(安卓)WebView与Javascript交互
  6. Android(安卓)API学习 SoundPool 和 MediaPlayer
  7. Unity与Android接口互相调用
  8. Android(安卓)jni中数组参数的传递方式
  9. 箭头函数的基础使用

随机推荐

  1. Android Scroller、VelocityTracker
  2. Android 属性动画(Property Animation)介
  3. Android 获得图片并解码成缩略图以减少内
  4. android的休眠和唤醒流程
  5. android 虚拟键盘遮挡布局 顶起布局
  6. Asynchronous HTTP Requests in Android
  7. Android中定义的路径全局变量
  8. android UI线程向子线程发送Message
  9. Android(安卓)判断程序是否已安装 & 启动
  10. Android Studio插件整理