当前位置: 首页 > news >正文

【Audio开发二】Android原生音量曲线调整说明

一,客制化需求
客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。

二,音量曲线调试流程

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

http://www.dtcms.com/a/108607.html

相关文章:

  • LInux基础指令(二)
  • 【VS+Qt】vs2022打开 vs2015项目
  • FastAPI中Pydantic异步分布式唯一性校验
  • 机器视觉调试——现场链接相机(解决各种相机链接问题)
  • 自然语言处理(22:(第六章2.)​seq2seq模型的实现​)
  • 图片懒加载、无限滚动加载、监听元素进入视口加载数据。「IntersectionObserver」
  • scala编程语言
  • 服务器数据恢复—Raid6阵列硬盘故障掉线,上层虚拟机数据如何恢复?
  • linux-firewalld防火墙允许端口
  • 【SLAM经典算法详解】Ubuntu 20.04部署LeGO-LOAM:从环境配置到KITTI适配,解决常见编译错误
  • 从零开发美颜SDK:美颜滤镜API的核心技术与实现
  • 多视图几何--立体校正--Fusiello方法
  • CMake学习--如何在CMake中编译静态库、动态库并在主程序中调用
  • rag精细化测试
  • 论坛系统的测试
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目1
  • Docker in Docker(Dind)
  • 深入解析 Git Submodule:从基础到高级操作指南
  • 电子电气架构 --- 控制器级架构
  • 基于HTML5的拖拽排序功能实现详解
  • Dify接口api对接,流式接收流式返回(.net)
  • Java迭代器【设计模式之迭代器模式】
  • C++ 中的类型处理与类型别名(二十六)
  • 车辆选择解决方案
  • 5.模型训练-毕设篇3
  • 字节跳动 UI-TARS 汇总整理报告
  • 核桃派2B:opencv python的 Canny findContours得到两个非常接近的轮廓,角点有几个像素的差距,如何处理?
  • 使用 Flutter 制作地图应用
  • 封装一套通用echats
  • 电子电气架构 --- 域控制器和EE架构关系