1. 程式人生 > >Andriod音訊系統適配《java邏輯控制層》

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

既然出現了,第一次的分和最後一次的分,那麼中間的合在哪裡?