frameworks/base/services/core/java/com/android/server/audio/AudioService.java

客户手动调节音量的范围:就是按音量键出来的进度条,就算拉满这个音量也是可以调的

源码是,清晰可见,所以为啥打电话的听筒没办法降到无声,因为最小也是1,而最高也就7,这里面的数字改了,就是影响最大最小的音量

protected static int[] MAX_STREAM_VOLUME = new int[] {7,   // STREAM_VOICE_CALL15,  // STREAM_SYSTEM15,  // STREAM_RING15,  // STREAM_MUSIC15,  // STREAM_ALARM15,  // STREAM_NOTIFICATION15,  // STREAM_BLUETOOTH_SCO15,  // STREAM_SYSTEM_ENFORCED15,  // STREAM_DTMF15,  // STREAM_TTS15   // STREAM_ACCESSIBILITY};/** Minimum volume index values for audio streams */protected static int[] MIN_STREAM_VOLUME = new int[] {1,  // STREAM_VOICE_CALL0,  // STREAM_SYSTEM0,  // STREAM_RING0,  // STREAM_MUSIC1,  // STREAM_ALARM0,  // STREAM_NOTIFICATION0,  // STREAM_BLUETOOTH_SCO0,  // STREAM_SYSTEM_ENFORCED0,  // STREAM_DTMF0,  // STREAM_TTS1   // STREAM_ACCESSIBILITY};

修改默认音量:

./base/media/java/android/media/AudioSystem.java

public static int[] DEFAULT_STREAM_VOLUME = new int[] {4,   // STREAM_VOICE_CALL15,  // STREAM_SYSTEM8,   // STREAM_RING8,   // STREAM_MUSIC8,   // STREAM_ALARM8,   // STREAM_NOTIFICATION7,   // STREAM_BLUETOOTH_SCO15,  // STREAM_SYSTEM_ENFORCED11,  // STREAM_DTMF11,  // STREAM_TTS11,  // STREAM_ACCESSIBILITY};

按音量键或手动调进度条触发流程:

frameworks/base/services/core/java/com/android/server/audio/AudioService.java

按键按下去后走的,这个可以看PhoneWindowManager

adjustSuggestedStreamVolume 到 adjustStreamVolume,如果是手动滑动的话,直接走adjustStreamVolume

调节音量大小级数,每次加减的级数:,这个适用于旋钮音量底层驱动改不动了,音量键还是一次一级跳更好,这样改是和底层驱动配合的,看看驱动调的旋钮效果,再结合实际看看要怎么跳,这样跳的话缺点是幅度较大,那可能扭不了多少就到头了,要么就配合硬件设计,就这能扭这些范围更好

底层驱动节点的范围值/sys/devices/platform/rotary_pwr/rotary_status

~/2TSSD/P2/kernel-4.4/drivers/input/keyboard/mediate/rotary_power.c

修改

check_rotary_status

比如

if(rotary_volume == 0) {rotary_status = 0;} else if ((rotary_volume > 0) && (rotary_volume <= 200)) {rotary_status = 1;} else if((rotary_volume > 200) && (rotary_volume <= 400)) {rotary_status = 2;} else if((rotary_volume > 400) && (rotary_volume <= 600)) {rotary_status = 3;} else if((rotary_volume > 600) && (rotary_volume <= 800)) {rotary_status = 4;} else if((rotary_volume > 800) && (rotary_volume <= 1000)) {rotary_status = 5;} else if((rotary_volume > 1000) && (rotary_volume <= 1200)) {rotary_status = 6;} else if((rotary_volume > 1200) && (rotary_volume <= 1400)) {rotary_status = 7;} else if((rotary_volume > 1400) && (rotary_volume <= 1600)) {rotary_status = 8;} else if((rotary_volume > 1600) && (rotary_volume <= 1800)) {rotary_status = 9;}

就是划分了9级,级数越多,越灵活,旋钮控制幅度范围也大触发ui进度条也多,源码应该是18级,这个1800就是1.8v,看gpio口电压最多多少

设置了多大,比如0-9,那么上层的范围如果要一致的话0-9,肯定声音要变小的,因为原来是15级,那么这时候基带可以换个音频参数,我感觉也不是增大音量,就是增大原来的幅度,让原来给这个节点电压变得更大从而变得更大声

还是这个AudioService.java

在主要的调节音量方法里adjustStreamVolume

源码定义了一个int step;就是每次的加减的级数

源码写好了

else {// convert one UI step (+/-1) into a number of internal units on the stream aliasstep = rescaleIndex(10, streamType, streamTypeAlias);}

rescaleIndex用于将音量值的变化量从源流类型变换到目标流类型下,由于不同的流类型的音量调节范围不同,所以这个转换是必需的,计算按下音量键的音量步进值。这个步进值是10而不是1。在VolumeStreamState中保存的音量值是其实际值的10倍,这是为了在不同流类型之间进行音量转化时能够保证一定精度的一种实现。可以理解为在转化过程中保留了小数点后一位的精度。

同时操作指定多个音量类型:

adjustSuggestedStreamVolume方法中最后源码是

adjustStreamVolume(streamType, direction, flags, callingPackage, caller, uid);

可以增加

adjustStreamVolume(4, direction, flags, callingPackage, caller, uid);

第四个数组下标类型就是STREAM_ALARM

这是默认该有的streamType进行调节,就是按键传进来的第二个参数

AudioManager.USE_DEFAULT_STREAM_TYPE,getAudioService().adjustSuggestedStreamVolume(AudioManager.ADJUST_LOWER,AudioManager.USE_DEFAULT_STREAM_TYPE, flags, pkgName, TAG);

通过底层节点来调节音量大小:

base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {

方法下关于音量键的处理全都注释掉

源码是直接

case KeyEvent.KEYCODE_VOLUME_DOWN:case KeyEvent.KEYCODE_VOLUME_UP:case KeyEvent.KEYCODE_VOLUME_MUTE: {

三个键一起处理的,把下面所有的逻辑注释掉,我们用节点的数值来设置当前的音量

加入:

isWakeKey = true;  //这个是这个项目需要音量键唤醒,所以加这句,不加的话失效int rotary_status = Integer.parseInt( readFile("/sys/devices/platform/rotary_pwr/rotary_status") );Log.d("tyd", "rotary_status:"+rotary_status);AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);                    am.setStreamVolume(1,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(2,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(3,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(4,rotary_status,AudioManager.FLAG_SHOW_UI);//result &= ~ACTION_PASS_TO_USER;break;

AudioManager的setStreamVolume方法第一个参数就是数组里面第几个音量的类型,1234就是常用的类型 ,就是一次按键把这四个音量类型全部控制

// STREAM_SYSTEM

// STREAM_RING

// STREAM_MUSIC

// STREAM_ALARM

第二个是把底层的值写入上册赋音量值,上层是十五级,已知底层是六级,那还需要计算转换才能设置

一下是一种算法

if (rotary_status == 0 ) {am.setStreamVolume(1,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(2,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(3,rotary_status,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(4,rotary_status,AudioManager.FLAG_SHOW_UI);} else if (rotary_status == 1) {am.setStreamVolume(1,(1+rotary_status)*2-1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(2,(1+rotary_status)*2-1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(3,(1+rotary_status)*2-1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(4,(1+rotary_status)*2-1,AudioManager.FLAG_SHOW_UI);} else if (rotary_status == 6) {am.setStreamVolume(1,(1+rotary_status)*2+1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(2,(1+rotary_status)*2+1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(3,(1+rotary_status)*2+1,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(4,(1+rotary_status)*2+1,AudioManager.FLAG_SHOW_UI);} else {am.setStreamVolume(1,(1+rotary_status)*2,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(2,(1+rotary_status)*2,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(3,(1+rotary_status)*2,AudioManager.FLAG_SHOW_UI);am.setStreamVolume(4,(1+rotary_status)*2,AudioManager.FLAG_SHOW_UI);}

这个readFile方法

private  String readFile(String filePath) {StringBuilder infos = new StringBuilder();File file = new File(filePath);InputStream inputStream = null;BufferedReader buffer = null;InputStreamReader in = null;try {inputStream = new FileInputStream(file);in = new InputStreamReader(inputStream, "GBK");buffer = new BufferedReader(in);// read line by line.String line = null;while ((line = buffer.readLine()) != null) {if (!TextUtils.isEmpty(line)) {infos.append(line);//.append("\n");}}} catch (FileNotFoundException e) {Log.e("songshuangwen", "readFile() ====: " + e);} catch (UnsupportedEncodingException e) {Log.e("songshuangwen", "readFile() ====: " + e);} catch (IOException e) {Log.e("songshuangwen", "readFile() ====: " + e);} finally {try {if (buffer != null) {buffer.close();}if (inputStream != null) {inputStream.close();}if (in != null) {in.close();}} catch (IOException e) {// ignore}}return infos.toString();}

导包:

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.io.DataOutputStream;import java.io.FileOutputStream;import android.text.TextUtils;

然后改一下音量控制的对话框UI:

vendor/mediatek/proprietary/packages/apps/SystemUI/ src/com/android/systemui/volume/VolumeDialogImpl.java

private void initDialog() {

方法中

if (mRows.isEmpty()) {

判断中注释掉所有源码,加入

if (!AudioSystem.isSingleVolume(mContext)) {addRow(AudioManager.STREAM_RING,R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);addRow(AudioManager.STREAM_BLUETOOTH_SCO,R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false, false);addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system,R.drawable.ic_volume_system_mute, false, false);}

实际上关键就留一句

addRow(AudioManager.STREAM_RING,R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);

就是只出现铃声类型音量的ui进度框

开机音量修改:

frameworks/av/services/audioflinger/Threads.cpp

#if defined(MTK_BOOT_ANIMATION_SOUND_SUPPORT)// Do not change the volume, when boot sound openif (track->mFlags & IAudioFlinger::TRACK_BOOT) {/*/tyd.yantao 20221107 turn down the boot volumevlf = 0.25f;vrf = 0.25f;*/vlf = 0.05f;vrf = 0.05f;//*/}#endif // MTK_BOOT_ANIMATION_SOUND_SUPPORT

这个值的范围是float vlf, vrf, vaf;   // in [0.0, 1.0] float format

客户手动调节音量的范围,修改默认音量各类型音量,按音量键或手动调进度条触发流程,调节音量大小级数每次加减的级数,同时操作指定多个音量类型,更改开机音量,通过底层节点来调节音量大小,音量控制的对话框UI相关推荐

  1. sql语句中获取当前时间+当前日期加减相应的天数操作笔记

    1.sql中获取当前的时间:date_format(now(),'%Y-%m-%d'); select NOW(); select date_format(now(),'%Y-%m-%d'); 2.对 ...

  2. 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  3. Mac如何删除在磁盘空间中的可清除空间以及Mac开机时进度条卡100%的解决办法

    Mac如何删除在磁盘空间中的可清除空间以及Mac开机时进度条卡100%的解决办法 1.Mac如何删除在磁盘空间中的可清除空间 对于mac来说磁盘的空间是十分宝贵的,小编会定期的查看一下自己电脑的磁盘使 ...

  4. 揭秘FMX进度条样式修改

    Delphi跨平台开发中的FMX样式处理给了我们UI设计的很多便捷.在很多年前使用Delphi开发VCL应用时,我们都期盼各种各样的皮肤控件,他能给我们带来新颖.夺目.优雅的程序外观.在现今的FMX应 ...

  5. 服务器进入系统进度条蓝屏,电脑开机读完进度条之后就蓝屏

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:电脑开机读完进度条之后就蓝屏,用模式和最后一次正回答:重装系统. 参考回答:怀疑是系统有问题造成的,建议你用360系统急救箱来处理. ...

  6. 基于Android Q 修改默认音量等级

    在之前的一些android版本中,修改默认音量是修改: path:frameworks\base\media\java\android\media\AudioService.java /// M: m ...

  7. android调节系统音量之修改默认音量、最大音量和最小音量

    Android系统拥有多种声音属性,包括有多媒体.通话.通知等声音属性,这些声音属性分别含有自己默认音量.最大音量和最小音量属性.下面我将介绍一下这些声音属性的音量定义和它们的修改方式. 默认音量 系 ...

  8. Android源码修改默认音量大小的方法

    目前网上有一些关于修改系统默认音量大小的方法,比如修改AudioSystem.java的DEFAULT_STREAM_VOLUME: public static int[] DEFAULT_STREA ...

  9. python系统字体_Python matplotlib修改默认字体的操作

    matplotlib库作为Python常用的数据可视化库,默认字体居然不支持中文字体,必须得吐槽一下~ 闲言少叙,开始正文 方法1:在plot中指定prop参数 使用matplotlib.font_m ...

最新文章

  1. LVS的工作原理和相关算法
  2. 高等数学下-赵立军-北京大学出版社-题解-练习10.1
  3. 邻接表2 -试在邻接表存储结构上实现图的基本操作 del_vertex-数据结构-图-icoding
  4. 6.Hibernate多对多关系建立
  5. 电视剧《赘婿》宁毅与乌家的岁布战没怎么看懂,可以细致分析一下吗?
  6. 【面向工业界】京东NLP算法工程师培养计划
  7. 线程池ThreadPoolExecutor使用
  8. 神器 git clean
  9. python求三角形斜边-python 已知三条边求三角形的角度案例
  10. warning: array subscript is above array bounds
  11. 大数据学习路线详解,零基础学大数据学习路线
  12. unity打开设置虚拟键的界面
  13. 「镁客·请讲」周全:想做世界上没有的、比较酷的东西
  14. vi编辑器基础命令合集与yim初级使用
  15. DEDE织梦常用的调用方法
  16. 深度CTR之AFM:基于Attention网络的FM模型
  17. 深入浅出的分析 TreeMap
  18. 6.oop-类和对象
  19. Vue中将Element表格导出为excel
  20. 前端技能树,面试复习第 52 天—— 手写代码:Javascript 基础考核

热门文章

  1. CLion工具(cmake) 快速开始
  2. 使用Clion刷LeetCode
  3. 最强旅游攻略 | 用Python分析国庆中秋最佳旅游景点 (文末福利)
  4. 深度学习加载预训练权重好处
  5. ODBC 常见数据源配置整理
  6. MaxCompute Tunnel命令
  7. 诛神java,《诛神online》先锋团评测报告
  8. 【软件测试】老板:你测试,我放心。测试人的成功就是不做测试?
  9. 人生有多少时间浪费在眼泪,与狭窄之间
  10. spring data rest 不隐藏主键id