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
上一篇: 网络爬虫---scrapy项目中Request()的meta参数详解
下一篇: HashMap的遍历