基本思想:android原生的思想,設(shè)置音量的時(shí)候,只會(huì)設(shè)置一個(gè)設(shè)備的音量下去,比如現(xiàn)在有speaker,hdmi,spdif三個(gè)輸出音頻設(shè)備,同時(shí)輸出的時(shí)候,按鍵只調(diào)整了speaker的音量值下去。修改方法就是把所有的設(shè)備都同步更新音量值,在AudioService.java中修改如下:

這里的mIndexMap.put會(huì)把各設(shè)備的音量值(index)保存在一個(gè)稀疏矩陣?yán)铩?/p>
在audioservice.java中,通過(guò)函數(shù)AudioSystem.setStreamVolumeIndex往jni下面調(diào)用的有好幾處,分別是:

而applyDeviceVolume_syncVSS也有好幾處調(diào)用它,分別是checkFixedVolumeDevices()和setDeviceVolume()。

由加log發(fā)現(xiàn)插拔hdmi變到最大音量,audiopolicymanager的接口函數(shù)拿到的是最大的音量值,所以上面?zhèn)鬟f下來(lái)的就是最大音量值,即上面截圖的index。通過(guò)加log發(fā)現(xiàn)插拔hdmi是checkFixedVolumeDevices()函數(shù)調(diào)用了AudioSystem.setStreamVolumeIndex();

而在這里有賦最大值的地方??隙ㄓ质莔FixedVolumeDevices搞得鬼,找到插拔函數(shù)里把hdmi設(shè)備給與上了,導(dǎo)致每次插拔HDMI音量都會(huì)變最大值。

