Andriod音频系统适配《java逻辑控制层》
Android系统针对不同设备,不同Stream类型的音频设备的适配还是比较完善的。
按照高级音响设备的格局,Android定义了UseMasterVolume 和StreamVolume,但是在实际使用中我们用的还是按照StreamVolume的方式分别设置。很少使用直接的MasterVolume来控制所有设备的输出的音量。
在介绍整个音量控制逻辑之前,先看一张图引用别人的(https://blog.****.net/yangwen123/article/details/39502689):
也就是说通过AudioManager.java所调用的接口的最终实现是在AudioSystem.java里面,由此走向Native层。
按照经验而言,java层实现控制逻辑,Native层实现功能接口的推论,目前我们只看音量控制的逻辑层,即java层。
1.首先来看看setMaterVolume的整个调用过程
AudioManager
SetMasterVolume
AudioService
SetMasterVolume
AudioSystem
简单明了,长驱直入,不需要逻辑解释。
2.研究StreamVolume的逻辑控制
看图:
上图所示,所有的StreamType,经历了 分——〉合——〉分 的过程。
现在如图所示的StreamType层,各个stream是分开的,然后选择不同的Alias抱团,紧接着同一个Alias团的成员分别作相同的事情:调用AudioSystem来设置自己的音量。
看完图来看代码,看最关键的代码:
AudioManager.java提供的接口
中间省略......................
会调用到
AudioService.java
StreamState.java
既然出现了,第一次的分和最后一次的分,那么中间的合在哪里?