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

Android系统HMDI音量无法梯度调节,只能0或者max

程序员文章站 2022-03-03 07:58:17
...

Android系统在行业应用中的使用越来越广泛,一般的机器都会带有hdmi的功能;但是调节hdmi音量的时候会出现无法调节的情况,要么没有声音,要么声音直接最大,无法呈现梯度变化。原因是hdmi设备的音量被固定住了,可以看如下代码:

        public void checkFixedVolumeDevices() {
            synchronized (VolumeStreamState.class) {
                // ignore settings for fixed volume devices: volume should always be at max or 0
                if (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_MUSIC) {
                    for (int i = 0; i < mIndexMap.size(); i++) {                                                                                  
                        int device = mIndexMap.keyAt(i);   
                        int index = mIndexMap.valueAt(i);  
                        if (((device & mFullVolumeDevices) != 0)   
                                || (((device & mFixedVolumeDevices) != 0) && index != 0)) {
                            mIndexMap.put(device, mIndexMax);
                        }
                        applyDeviceVolume_syncVSS(device);
                    }
                }
            }
        }

这个函数的作用是检查设备是否需要音量固定,这里面比较关键的变量是mFixedVolumeDevices,它的初始化如下:

    int mFixedVolumeDevices = AudioSystem.DEVICE_OUT_HDMI |                                                                                       
            AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET |
            AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET |
            AudioSystem.DEVICE_OUT_HDMI_ARC |  
            AudioSystem.DEVICE_OUT_SPDIF | 
            AudioSystem.DEVICE_OUT_AUX_LINE; 

其中DEVICE_OUT_HDMI对应的就是hdmi设备,可见google在设计音频策略的时候默认是将hdmi的音量给固定住了,因此我们无法通过音量键去调节hdmi设备的音量。

通过以上代码的分析可以知道,要想恢复hmdi音量的调节,必须将DEVICE_OUT_HDMI从mFixedVolumeDevices去掉

mFixedVolumeDevices &= ~AudioSystem.DEVICE_OUT_HDMI

在AudioService的构造函数中或者根据具体需求在对应的地方加上这一行代码,可以解决hdmi音量调节问题。

代码位置 ./services/core/java/com/android/server/audio/AudioService.java