最近在看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 OpenGL库函数列表
  2. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态
  3. Android中切换屏幕方向时Activity生命周期函数执行情况分析
  4. Android 加载图片文件 函数
  5. Android为Menu添加item及响应函数
  6. android之检查service运行状态函数
  7. Android Studio 基础 之 一键快速实现一个类的 构造函数、getter
  8. Android Studio如何提示函数用法
  9. Android Studio怎样提示函数使用方法

随机推荐

  1. mysql5.7.18.zip免安装版本配置教程(windo
  2. Mysql免安装版设置密码教程详解
  3. mysql innodb 异常修复经验分享
  4. Mysql中几种插入效率的实例对比
  5. 一步步教你配置MySQL远程访问
  6. MySQL 5.7.18 release版安装指南(含有bin
  7. 利用MySQL统计一列中不同值的数量方法示
  8. centos 6.5下 mysql-community-server. 5
  9. mysql 5.7.11 winx64初始密码修改
  10. Mysql的增删改查语句简单实现