[Android] audio音量曲线

一、音量曲线调试流程

Android根据不同的音频流类型定义不同的曲线,曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volume_tables.xml
下面要看music音频流类型耳机所引用的xml。
audio_policy_volumes.xml
在这里插入图片描述

default_volume_tables.xml
在这里插入图片描述

曲线定义如上,music headset对应的曲线是DEFAULT_DEVICE_CATEGORY_HEADSET_VOLUME_CURVE,
point的两个值分别为index 和db。 定义的index范围是1到100, 而db的范围为-4950 到0。音量等级分成4段为100、66、33、1就是音量百分比;0,-1700,-3350,-4950就是对应百分比时衰减的音量,代表衰减-17db,-33.50db,-49.50db。

外部的index范围不一定是1,100 比如外部index范围为0,15。
1.ui的index寻找在曲线index位置
那么第一步先将传递进去的index,转换为1,100等比例的位置。 假设传递是x, 要求等比例的y。
x/(15 -0) = y / (100 -1)。 假设传递的7 ,求出来y = 46。

2.寻找曲线index对应的分贝。
首先46是处在【33,66】的这个区间内,这个区间对应的db区间是【-3350,-1700】。先求这个区间一个index对应多少db 将总的index(66 -33)除于总的db(-1700 - (-3350)) 为单位index对应的db。那46对应的有多少index,46对应为 46 -33。 将这两者相乘就是46对应在这个区间内的db值, 加上起始的-3350就是最终的db。
db就在这个区间里面算。 所求的db = -3350 + (((- 1700 - (-3350))/(66 -33) x(46 -33)) = -2700。
也等比例计算的一个方式。 相对于一个个区间是独立。起始点是最靠近的上一个区间的index,然后计算区间内一个index对应多少db。传递进去的index相对于起始index的值。

二、音量曲线的类型

曲线的类型:
voice_call 电话
system 系统
ring 铃声
music 音乐
alarm 闹铃
notification 通知音
bluetooth_sco 蓝牙
enforced_audible 强制播放 (例如在日本的强制拍照音,防偷拍)
dtmf 拨号盘按键
tts 文本转语音

三、音量调用逻辑

源码:

frameworks/base/media/java/android/media/AudioManager.java
frameworks/av/services/audiopolicy/engine/common/managerdefinitions/src/VolumeCurve.cpp 
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
frameworks/av/services/audiopolicy/common/include/Volume.h

音量设置首先调用到AudioManager.java中
在这里有两种方法可以设置音量setStreamVolume和adjustStreamVolume
setStreamVolume:传入index直接设置音量等级
adjustStreamVolume:传入direction,根据direction和获取到的步长设置音量。
这2中方式都会call到native 层的AudioPolicyManager.cpp中的setStreamVolumeIndex()。

setStreamVolumeIndex()函数中调试到checkAndSetVolume();
在这里插入图片描述
在这里插入图片描述

checkAndSetVolume()调用到computeVolume();
在这里插入图片描述

computeVolume();函数
在这里插入图片描述

Volume.h
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值