转载自http://blog..net/xiashaohua/article/details/53842337

只简单描述调用过程,需对照代码看,不画图了,也不贴代码)

1.在key Event处理部分,Phonewindow会捕获到音量按键事件,

Phonewindow.onkeydown--MediaSessionLegacyHelper.getHelper(getContext()).sendAdjustVolumeBy

2.调节音量的时候要处理3件事情,界面显示、播放提示音、调节音量,

MediaSessionManager. dispatchAdjustVolume--mService.dispatchAdjustVolume/binder-- MediaSessionService. dispatchAdjustVolume—dispatchAdjustVolumeLocked--mAudioService.adjustSuggestedStreamVolume

(如使用AudioManager,则AudioManager 的handleKeyDown、handleKeyUp也可来设置音量。

handleKeyDown--adjustSuggestedStreamVolume--MediaSessionLegacyHelper.sendAdjustVolumeBy—

)

3.在Audio模块,

mAudioService.adjustSuggestedStreamVolume(direction,suggestedStream,

flags, packageName, TAG);/binder– AudioService.adjustSuggestedStreamVolume—adjustStreamVolume/这里做了些场景处理和判断,将APS的工作提前做了,之后,

a)调音量,走            --sendMsg(mAudioHandler,

MSG_SET_DEVICE_VOLUME,

SENDMSG_QUEUE,

device,

0,

streamState,

0);-- setDeviceVolume--mStreamStates[streamType].applyDeviceVolume_syncVSS(streamDevice)-- AudioSystem.setStreamVolumeIndex/jni-- AudioSystem.setStreamVolumeIndex--

aps->setStreamVolumeIndex(stream, index, device)/binder-- AudioPolicyInterfaceImpl.cppsetStreamVolumeIndex-- mAudioPolicyManager->setStreamVolumeIndex—checkAndSetVolume—

调一般的音量调用outputDesc->setVolume,待后面打开output

调节音量使用,调正在播放的铃声音量不在这个地方。

调通话中音量走mpClientInterface->setVoiceVolume-- AudioPolicyService::AudioPolicyClient::setVoiceVolume-- mAudioPolicyService->setVoiceVolume -- AudioPolicyService::setVoiceVolume -- mAudioCommandThread->voiceVolumeCommand/SET_VOICE_VOLUME

-- AudioSystem::setVoiceVolume -- af->setVoiceVolume -- dev->set_voice_volume--audio_hw.c adev_set_voice_volume-- voice_set_volume-- …

这个调音量的流程也是够够的了,从jni下来后,AS—APS—APM—APS—AS—AF—HAL这样走了一大圈。

b)调界面,走 —sendVolumeUpdate-- mVolumeController.postVolumeChanged(streamType,flags);-- mController.volumeChanged/binder--

VolumeDialogController. volumeChanged-- mWorker.obtainMessage(W.VOLUME_CHANGED, streamType,flags).sendToTarget();--onVolumeChangedW--…

4.对于通过outPut设置音量的部分,如果是deepbuffer播放就不会调用下来,如果是offload播放,在audio_hw.c里面

static intout_set_volume(struct audio_stream_out *stream, float left,

float right)

out->stream.set_volume = out_set_volume;

在audioflinger里面就调整了

Threads.cpp(frameworks\av\services\audioflinger):           if (mOutput->stream->set_volume) {

Threads.cpp (frameworks\av\services\audioflinger):               mOutput->stream->set_volume(mOutput->stream, left, right);

5.在audio_hw.c里面,流程如下,

out_set_volume--passthru.caudio_extn_passthru_set_volume--platform.c platform_set_device_params

0

android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程相关推荐

  1. android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述

    音量控制键控制的音频流(setVolumeControlStream)描述 2021-01-03 16:18Android教程网 Android 当开发多媒体应用或者游戏应用的时候,需要使用音量控制键 ...

  2. android 耳机 音量调节 id,Android音频相关(一)插入耳机后调节音量(安全音量)...

    一.安全音量提醒框的开启 二.修改安全音量提醒框显示 三.重启后还会显示安全音量提醒框 四.一些关于安全音量的初始值 一.安全音量提醒框的开启 安卓系统是有耳机音量保护机制的,对于一些出口欧盟的手机来 ...

  3. android充电状态广播,Android 获取电池是否充电状态、充电器类型

    0. demo 下载 https://github.com/sufadi/BatteryInfo 1. 电池广播获取充电状态 // 电池状态 import static android.os.Batt ...

  4. android返回键方法,Android按返回键(后退键)Back键事件捕获的两种方法

    package zhangphil.back; import android.support.v7.app.ActionBarActivity; import android.util.Log; im ...

  5. android 程序退出广播,android 利用广播实现程序的强制退出

    利用广播机制,实现程序的强制退出. 前面有篇博文,写到了一键退出,这里利用到了那里的ActivityCollector的集合和BaseActivity 功能:打开程序后,先登录,登录成功后,进入主页面 ...

  6. Android usb 权限广播,[Android]USB开发

    第一:请求权限和请求权限回调(通过广播回调) 注册一个广播接收器用于接收USB权限被同意或拒绝后发出的广播 //注册USB设备权限管理广播 IntentFilter filter = new Inte ...

  7. android 电池电量广播,Android查看电池电量的方法(基于BroadcastReceiver)

    本文实例讲述了Android查看电池电量的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.app.Dialo ...

  8. android 接收闹钟广播,android 设置闹钟及通知示例

    简单说一下这次demo内容,首先做一个设置一次性闹钟,先得到alarmManager,打开一个时间对话框,在里面设置闹钟的时间,时间一到发送广播,然后广播接受者接到跳转到新的activity播放音乐. ...

  9. android 蓝牙相关广播,Android 蓝牙相关的广播

    Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...

最新文章

  1. mysql范式与反范式_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”...
  2. 理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)
  3. Asp.net 服务器端控件
  4. 使用组策略中的首选项更改域中计算机注册表
  5. CentOS下IPTABLES配置详解
  6. 计算机网络(二十五)-IP数据报格式
  7. 我想站在巨人的肩上——记成都之行
  8. java中菜单不显示_菜单不显示
  9. L1-043 阅览室-PAT团体程序设计天梯赛GPLT
  10. 在Ubuntu下安装ros
  11. js 图片上传时加水印
  12. JS高级程序设计精简版(第十章:函数)附思维导图
  13. 最新织梦DEDE仿爱手赚网手赚导航网站源码手赚App下载导航站+手机版
  14. HTML汇率转换代码,利用JS实现汇率转换工具
  15. Ubuntu 更改默认浏览器
  16. 【verilog】【Modelsim仿真】“XXX“already declared in this scope
  17. Hadoop,Spark错误:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  18. 安卓应用移植鸿蒙(五):发布鸿蒙自定义组件(har包)到MavenCenter全过程,采坑无数
  19. 吕文翰 php,自己动手打造基于 WKWebView 的混合开发框架(二)——js 向 Native 一句话传值并反射出 Swift 对象执行指定函数...
  20. 【live2d】博客看板娘live2d!

热门文章

  1. 泄漏:Oracle WebLogic Server 12g
  2. 查看 Linux 系统版本(发行版本)信息的相关命令语句
  3. Linux 查看数据库MySQL安装文件和安装目录的命令
  4. mysql注入漏洞语句,web安全之sql注入漏洞
  5. html关于超链接的问题,关于超链接的一些问题
  6. indesign如何画弧线_彩铅画入门教程,如何给独角兽设计一款好发型
  7. java 设计模式_Java设计模式的常见应用场景
  8. 10 张程序员喜爱的壁纸,需要自取~
  9. Python3不用str自带lower转换位小写字母
  10. 学计算机编程200字感想,计算机学习心得体会