一,客制化需求
客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。
二,音量曲线调试流程
Android根据不同的音频流类型定义不同的曲线,曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volume_tables.xml
对于安卓原生的音量曲线的调整,原生SDK里也默认提供了对应的安卓音量曲线配置文件提供用户进行定制化修改与应用验证。
安卓原生音量曲线配置文件路径:
(示例) /android/device/softwinner/ceres(具体项目方案)/common/media/audio/audio_policy_volumes_drc.xml
xref: /frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
............................................................................
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
............................................................................
</audioPolicyConfiguration>
在audio_policy_configuration.xml文件里面通过include包含了audio_policy_volumes.xml和default_volume_tables.xml
xref: /frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE"
ref="DEFAULT_DEVICE_CATEGORY_EARPIECE_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"
ref="DEFAULT_DEVICE_CATEGORY_EXT_MEDIA_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEARING_AID"
ref="DEFAULT_HEARING_AID_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET"
ref="DEFAULT_MEDIA_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER"
ref="DEFAULT_DEVICE_CATEGORY_SPEAKER_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE"
ref="DEFAULT_MEDIA_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"
ref="DEFAULT_MEDIA_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEARING_AID"
ref="DEFAULT_HEARING_AID_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET"
ref="DEFAULT_NON_MUTABLE_HEADSET_VOLUME_CURVE"/>
<volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER">
<point>0,-2970</point>
<point>33,-2010</point>
<point>66,-1020</point>
<point>100,0</point>
</volume>
在audio_policy_volumes.xml中,规定了音频流类型(stream)、输出设备(deviceCategory)和音量曲线(ref)的关系,在default_volume_tables.xml中规定了具体的音量曲线的值
xref: /frameworks/av/services/audiopolicy/config/default_volume_tables.xml
<reference name="DEFAULT_DEVICE_CATEGORY_EARPIECE_VOLUME_CURVE">
<!--Default Volume Curve -->
<point>1,-4950</point>
<point>33,-3350</point>
<point>66,-1700</point>
<point>100,0</point>
</reference>
例如DEFAULT_DEVICE_CATEGORY_EARPIECE_VOLUME_CURVE曲线上的(index、db)值。定义的index范围是1到100, 而db的范围为-4950 到0。音量等级分成4段为100、66、33、1就是音量百分比;0,-1700,-3350,-4950就是对应百分比时衰减的音量,代表衰减-17db,-33.50db,-49.50db。
下面要看music音频流类型耳机所引用的xml。
audio_policy_volumes.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的值
三,开发实例
3.1 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。
3.2 解决办法
对于安卓原生的音量曲线的调整,原生SDK里也默认提供了对应的安卓音量曲线配置文件提供用户进行定制化修改与应用验证。
安卓原生音量曲线配置文件路径:
(示例) /android/device/softwinner/ceres(具体项目方案)/common/media/audio/audio_policy_volumes_drc.xml
配置介绍:
示例配置如下图所示:
其中:
stream: AUDIO_STREAM_MUSIC/…
表示配置对象为MUSIC类型的音频流,常规音乐播放应用的都是MUSIC流,其他通知铃声等类型亦有对应类型stream;
deviceCategory: HEADSET/SPEAKER/…
表示配置对象为HEADSET带麦耳机或者是SPEAKER喇叭等输出设备,常规音乐播放应用的都是SPEAKER,表喇叭输出;
ref: DEFAULT_MEDIA_VOLUME_CURVE(默认)/自定义
表示对于上述MUSIC类型且输出设备为SPEAKER喇叭输出的音频流,需要配置的音频曲线是默认曲线参数,还是自定义参数曲线。
DEFAULT_MEDIA_VOLUME_CURVE:默认曲线参数:具体参数如下图所示:
其中,对于上述中的自定义音量曲线参数介绍如下:
上图中自定义音量曲线表示意义为,音量曲线变化划分为了四个区域点,三段变化线,从音量范围值1变化到音量范围值100,对应音量幅度变化从-3200单位对应变化到0单位,即音量值从最小衰减32dB,到最大时0dB不做任何幅度衰减。
具体变化趋势曲线如下图所示:
图示说明:
音量挡位范围(横轴,第一列配置值):0 ~ 100,范围值,范围从0 ~ 100,默认0为静音mute;
音量衰减量(纵轴,第二列配置值):-3200 ~ 0;输出衰减量,表示最小从-32dB,到最大0dB无衰减;
配置分析:音量挡位一般分为了三段区域变化,不同挡位区域由于其变化幅度不同,对应其音量衰减幅度不同,故音量响度变化程度就不同。
第一段. 1 ~ 33:在此挡位调节区域幅度变化为从-3200 ~ -2000,变化差值为1200;
第二段. 33 ~ 66:在此挡位调节区域幅度变化为从-2000 ~ -1200,变化差值为800;
第三段. 66 ~ 100:在此挡位调节区域幅度变化为从-1200 ~ 0,变化差值为1200;
横轴、纵轴值、段数在范围允许内皆可自行定义,但横轴越短、纵轴越长,斜率越大,则音量幅度变化则越明显,反之则同理。
故客户方可以根据上述描述理解,并按照对应格式自行定制需要的音量曲线变化。
3.3 小机验证方法:
在小机端以下路径存放了对应的配置文件,开机启动时会去加载读取该配置文件进行配置,客户方在调试时可以直接修改该小机端源文件后重启audio服务或直接机器重启即可生效验证。
/vendor/etc/audio_policy_volumes_drc.xml