欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[RK3399][Android7.1] 调试笔记 所有音量条统一控制

程序员文章站 2024-03-18 17:19:28
...
平台 内核版本 安卓版本
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分组

[RK3399][Android7.1] 调试笔记 所有音量条统一控制

效果

[RK3399][Android7.1] 调试笔记 所有音量条统一控制

代码分析

Android系统创建AudioTrack时可以指定10stream

目录:frameworks/base/media/java/android/media/AudioSystem.java
[RK3399][Android7.1] 调试笔记 所有音量条统一控制

各种stream的音量也可以单独设置、互不影响。
比如"音乐音量"不应该影响到"来电振铃"、“闹钟”、"通话"的音量。

手机音量控制界面有5种滑动条, 用于设置某种类型的声音音量.
这5种滑动条如何控制10stream?
必须分组!在Android源码中称之为"别名", 即alias

frameworks/base/services/core/java/com/android/server/audio/AudioService.java
[RK3399][Android7.1] 调试笔记 所有音量条统一控制

key-down事件时调整音量,在key-up时播放调节音量的声音
目录:frameworks/base/media/java/android/media/AudioManager.java
[RK3399][Android7.1] 调试笔记 所有音量条统一控制
这里的flagsFLAG_SHOW_UI | FLAG_VIBRATE,会显示进度条,有震动。

[RK3399][Android7.1] 调试笔记 所有音量条统一控制
这里的flagsFLAG_PLAY_SOUND,表示播放音乐

最终会调用到:
frameworks/base/services/core/java/com/android/server/audio/AudioService.java
[RK3399][Android7.1] 调试笔记 所有音量条统一控制
先通过getActiveStreamType获取当前活跃的流类型

[RK3399][Android7.1] 调试笔记 所有音量条统一控制
接着看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消息处理做了什么

[RK3399][Android7.1] 调试笔记 所有音量条统一控制

[RK3399][Android7.1] 调试笔记 所有音量条统一控制