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

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值