Android 4.4 音量调节流程分析(二)
之前在Android 4.4 音量调节流程分析(一)里已经有简单的分析音量控制的流程,今天想接着继续分析下音量大小计算的方法。对于任一播放文件而言其本身都有着固定大小的音量Volume_Max,而在AudioPolicyManagerBase.cpp文件中音量调节可以理解为在Volume_Max的基础上乘以系数κ(0≤κ≤1)。
现在对AudioPolicyManagerBase.cpp中volIndexToAmpl函数做具体分析,volIndexToAmpl的函数定义如下:
float AudioPolicyManagerBase::volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc,
int indexInUi)
{
device_category deviceCategory = getDeviceCategory(device);
const VolumeCurvePoint *curve = streamDesc.mVolumeCurve[deviceCategory];
// the volume index in the UI is relative to the min and max volume indices for this stream type
int nbSteps = + curve[VOLMAX].mIndex -
curve[VOLMIN].mIndex;
int volIdx = (nbSteps * (indexInUi - streamDesc.mIndexMin)) /
(streamDesc.mIndexMax - streamDesc.mIndexMin); // find what part of the curve this index volume belongs to, or if it's out of bounds
int segment = ;
if (volIdx < curve[VOLMIN].mIndex) { // out of bounds
return 0.0f;
} else if (volIdx < curve[VOLKNEE1].mIndex) {
segment = ;
} else if (volIdx < curve[VOLKNEE2].mIndex) {
segment = ;
} else if (volIdx <= curve[VOLMAX].mIndex) {
segment = ;
} else { // out of bounds
return 1.0f;
} // linear interpolation in the attenuation table in dB
float decibels = curve[segment].mDBAttenuation +
((float)(volIdx - curve[segment].mIndex)) *
( (curve[segment+].mDBAttenuation -
curve[segment].mDBAttenuation) /
((float)(curve[segment+].mIndex -
curve[segment].mIndex)) ); float amplification = exp( decibels * 0.115129f); // exp( dB * ln(10) / 20 ) return amplification;
}
在该段代码内,主要是获取以下的7个变量值:
1.deviceCategory:Android系统中设备种类有如下三种,即DEVICE_CATEGORY_HEADSET,DEVICE_CATEGORY_SPEAKER & DEVICE_CATEGORY_EARPIECE。若当前使用Speaker播放音频流时,则deviceCategory即对应DEVICE_CATEGORY_SPEAKER;
2.curve:音量曲线是由Audio_Stream & device_Category两者共同决定,所有匹配类型都可以在sVolumeProfiles矩阵中获得,以Audio_Stream = AUDIO_STREAM_MUSIC & device_Category = DEVICE_CATEGORY_SPEAKER为例,则其对应的音量曲线为 sSpeakerMediaVolumeCurve;
sSpeakerMediaVolumeCurve:(以该音量曲线为例作数值计算)
const AudioPolicyManagerBase::VolumeCurvePoint
AudioPolicyManagerBase::sSpeakerMediaVolumeCurve[AudioPolicyManagerBase::VOLCNT] = {
{, -59.1f}, {, -48.3f}, {, -24.4f}, {, 0.0f}
};
从sSpeakerMediaVolumeCurve数组可以知道是由4个点来将音量曲线分为4个部分,分别为1~20、20~60、60~100。其中每个点中参数含义为:
class VolumeCurvePoint
{
public:
int mIndex;//百分制下标
float mDBAttenuation;//衰减
};
3.nbSteps:为了避免计算时出现循环小数,系统中将UI界面VolumeIndex转化为0~100,以sSpeakerMediaVolumeCurve为例,curve[VOLMAX].mIndex = 100,curve[VOLMIN].mIndex = 1,所以nbSteps = 1 + 100 -1 = 100;
4.volIdx:volIdx的求解过程其实就是将UI界面的音量Index转化为百进制的过程,其中AudioStream对应的indexInUi_Max可以在AudioService.java中获得,STREAM_MUSIC对应数值为15,故streamDesc.mIndexMax = 15,streamDesc.mIndexMin = 0,则volIdx = (20/3)*indexInUi。
//AudioService.java
/** @hide Maximum volume index values for audio streams */
private static final int[] MAX_STREAM_VOLUME = new int[] {
, // STREAM_VOICE_CALL
, // STREAM_SYSTEM
, // STREAM_RING
, // STREAM_MUSIC
, // STREAM_ALARM
, // STREAM_NOTIFICATION
, // STREAM_BLUETOOTH_SCO
, // STREAM_SYSTEM_ENFORCED
, // STREAM_DTMF
// STREAM_TTS
};
5.segment:是用来确定UI音量界面上的VolumeIndex转化为百进制处于哪一个区间内。
6.decibels:VolumeIndex对应的音量衰减,单位为dB。其计算公式如下图所示:

若想实现speaker每音阶之间的衰减差为M(dB),其计算方法就是计算decibels_Index_N & decibels_Index_(N+1)之间的差值。为了方便计算,可以默认N & N+1属于同一segment,这样

因为curve[VOLMAX].mDBAttenuation一般为0,即不衰减状态(当然也有可能为负数,但不管怎样,curve[VOLMAX].mDBAttenuation是最容易确定的值),所以一般计算是从segment = 2开始计算,这样在60~100区间内Δdecibels的值就为:
Δdecibels = (20/3)*((0 - curve[2].mDBAttenuation)/(100 - 60)) = -(curve[2].mDBAttenuation/6)
令Δdecibels = M,则curve[2].mDBAttenuation = -6M,依次类推curve[1].mDBAttenuation = -12M,curve[0].mDBAttenuation = -15M。
7.amplification:放大/缩小倍数。将求得的decibels带入公式就可以直接求到,没有什么特别要说的。
总结:该篇文章以sSpeakerMediaVolumeCurve为例,描述了音量衰减值的计算过程。其它音量曲线调节可以按照该方法同样实现。
Android 4.4 音量调节流程分析(二)的更多相关文章
- Android 4.4 音量调节流程分析(一)
最近在做Android Audio方面的工作,有需求是在调节Volume_Up_Key & Volume_Down_key时,Spearker or Headset每音阶的衰减变为3db左右. ...
- Android 7.1 WindowManagerService 屏幕旋转流程分析 (二)
一.概述 从上篇[Android 7.1 屏幕旋转流程分析]知道实际的旋转由WindowManagerService来完成,这里接着上面具体详细展开. 调了三个函数完成了三件事,即首先调用update ...
- Android 7.1 屏幕旋转流程分析
Android 7.1 屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...
- Gradle之Android Gradle Plugin 主要流程分析(二)
[Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要流程分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin ...
- Android之 MTP框架和流程分析
概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介 对Mtp协议进行简单的介绍.第2部分 MTP框架 介绍 ...
- MSM8909中LK阶段LCM屏适配与显示流程分析(二)
1.前言 在前面的文章MSM8909中LK阶段LCM屏适配与显示流程分析(一),链接如下: https://www.cnblogs.com/Cqlismy/p/12019317.html 介绍了如何使 ...
- Android系统之LK启动流程分析(一)
1.前言 LK是Little Kernel的缩写,在Qualcomm平台的Android系统中普遍采用LK作为bootloader,它是一个开源项目,LK是整个系统的引导部分,所以不是独立存在的,但是 ...
- Uboot启动流程分析(二)
1.前言 在前面的文章Uboot启动流程分析(一)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12000889.html 已经简单地分析了low_level_i ...
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程, ...
随机推荐
- 写个Python练练手吧
在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个.py文件, ...
- Retrofit2 源码解析
原文链接:http://bxbxbai.github.io/2015/12/13/retrofit2-analysis/ 公司里最近做的项目中网络框架用的就是Retrofit,用的多了以后觉得这个框架 ...
- 使用 Async 和 Await 的异步编程
来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源 ...
- Java API —— TreeSet类
1.TreeSet类 1)TreeSet类概述 使用元素的自然顺序对元素进行排序 或者根据创建 set 时提供的 Comparator 进行排序 ...
- 人脸识别必读的N篇文章
一,人脸检测/跟踪 人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小:对于跟踪而言,还需要确定帧间不同人脸间的对应关系. 1, Robust Real-time Object Dete ...
- 关于imx6核心板qt系统U盘挂载
在使用imx6核心板开发的时候,程序写到U盘,想通过U盘在板子上运行程序,U盘插到板子上后在minicom中有信息显示,但是无法找到挂载文件,/dev和/mnt下都没有找到相应的文件.后来百度后发现U ...
- STL容器的效率比较
1.介绍 顺序存储容器 : string.vector.list.deque 关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入 ...
- TagHighlight
:UpdateTypesFile 命令会生成相应的上色高亮文件(生成的着色文件可以叫types_c.taghl)还有相应的tags文件,寻找tags或taghl_config.txt确定project ...
- [51NOD1126]求递推序列的第n项(矩阵快速幂)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 存在参数a,b为负数的情况.这时候要这么处理: 根据mo ...
- th固定 td滚动的表格实现
为什么这样? 体验好 原理 通过两个表格,使其th td 对应,产生一种错觉. 代码 1.html <div class="content"> <div clas ...