(L1) AudioService.VolumeStreamState 程式碼走讀與設計思考
阿新 • • 發佈:2019-02-16
前言
VolumeStreamState是AudioService中控制音量調節的內部類
是AudioService中很重要,也很難懂的一個類
很多使用者行為,裝置的連線都會呼叫到該類的方法,對volume大小產生影響。
屬性
原始碼
分類
根據原始碼來看,VolumeStreamState的屬性並不多。
- stream type 相關:mStreamType , mVolumeIndexSettingName ,既可以用數字表示型別,也可以用名字來表示
- index相關:mIndexMax , mIndex (沒有Index Min也可以理解,因為不能有音量為負數,只會是0)
- Clients death:mDeathHandler;
建構函式
原始碼
function : VolumeStreamState
該函式多數行很簡單,對上面的屬性通過複製進行初始化
mIndexMax複製完成後:
- 對native初始化,呼叫 AudioSystem.initStreamVolume,引數為stream type, index min, index max.
- mIndexMax * 10用於提高運算精度
function : readSetting
該函式的有50多行,觀察之後可以發現,每個程式碼塊{} 中,都在執行mIndex.put,可以瞭解到readSetting是對 mIndex 初始化
邏輯大概如下:
- 使用 fixed volume , master volume 的情況,mIndex只存入 default out device ,max index 作為一對device–> index,然後退出 ,程式碼中為第一個 if 塊
-
index*10 提高進度後再通過 getValidIndex 檢查,最後存入 mIndex
function : getSettingNameForDevice
將volume name 同device name 結合生成的key,體現出對應關係。
初始化過程
VolumeStreamState的初始化在AudioService的構造過程中完成。通過函式 createStreamStates() 實現
......
......
}
function : createStreamStates
有些不同的 stream type 的 stream volume alias 是相同的,則不同的 VolumeStreamState 例項,存在相同的 mVolumeIndexSettingName
function: checkAllFixedVolumeDevices
根據函式名理解是檢查全部的固定音量裝置,實際程式碼是呼叫每個 VolumeStreamState.checkFixedVolumeDevice.
function: checkAllAliasStreamVolumes
1.stream 和 對應的alias stream 不同則,用alias stream的VolumeStreamIndex 來初始化該stream的VolumeStreamIndex.
What to do
Android這麼定義到底是要做什麼?
- 適配多個平臺
- 適配多種外設