[RK3399][Android7.1] 调试笔记 所有音量条统一控制
平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
需求
音量条控制时需要将媒体音量,电话铃声等统一控制,即移动一个音量条其他音量条也跟着变化。
修改
frameworks/base/services/core/java/com/android/server/audio/AudioService.java
修改STREAM_VOLUME_ALIAS_DEFAULT
数组改成跟STREAM_VOLUME_ALIAS_TELEVISION
数组内容一样所以音量条都属于music
分组
效果
代码分析
Android
系统创建AudioTrack
时可以指定10
种stream
目录:frameworks/base/media/java/android/media/AudioSystem.java
各种stream
的音量也可以单独设置、互不影响。
比如"音乐音量"不应该影响到"来电振铃"、“闹钟”、"通话"的音量。
手机音量控制界面有5
种滑动条, 用于设置某种类型的声音音量.
这5种滑动条如何控制10
种stream
?
必须分组!在Android
源码中称之为"别名", 即alias
frameworks/base/services/core/java/com/android/server/audio/AudioService.java
在key-down
事件时调整音量,在key-up
时播放调节音量的声音
目录:frameworks/base/media/java/android/media/AudioManager.java
这里的flags
是FLAG_SHOW_UI | FLAG_VIBRATE
,会显示进度条,有震动。
这里的flags
是FLAG_PLAY_SOUND
,表示播放音乐
最终会调用到:frameworks/base/services/core/java/com/android/server/audio/AudioService.java
先通过getActiveStreamType
获取当前活跃的流类型
接着看audioservice
,如何处理音量调节的。
//step1,为streamType查找alias归类,使用流类型别名是为了让有相同别名的流,有相同的行为。
int streamTypeAlias = mStreamVolumeAlias[streamType];
//step2,为streamtypealias寻找匹配的device。
final int device = getDeviceForStream(streamTypeAlias);
//step3,获取对应的aliasindex
int aliasIndex = streamState.getIndex(device);
// step4,调节index,把UI上的加1、减1的步骤,转成流别名上内部单元中的数字
// convert one UI step (+/-1) into a number of internal units on the stream alias
step = rescaleIndex(10, streamType, streamTypeAlias);
//step5,对音量模式的影响
// If either the client forces allowing ringer modes for this adjustment,
// or the stream type is one that is affected by ringer modes
if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
(streamTypeAlias == getUiSoundsStreamType())) {
//step6,将调节音量的事件发给下一个处理者。
sendMsg(mAudioHandler,
MSG_SET_DEVICE_VOLUME,
SENDMSG_QUEUE,
device,
0,
streamState,
0);
接下来看看MSG_SET_DEVICE_VOLUME
消息处理做了什么