Andriod音訊系統適配《java邏輯控制層》
Android系統針對不同裝置,不同Stream型別的音訊裝置的適配還是比較完善的。
按照高階音響裝置的格局,Android定義了UseMasterVolume 和StreamVolume,但是在實際使用中我們用的還是按照StreamVolume的方式分別設定。很少使用直接的MasterVolume來控制所有裝置的輸出的音量。
在介紹整個音量控制邏輯之前,先看一張圖引用別人的(https://blog.csdn.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
既然出現了,第一次的分和最後一次的分,那麼中間的合在哪裡?