1. 程式人生 > >(L1) AudioService.VolumeStreamState 程式碼走讀與設計思考

(L1) AudioService.VolumeStreamState 程式碼走讀與設計思考

前言

VolumeStreamState是AudioService中控制音量調節的內部類

是AudioService中很重要,也很難懂的一個類

很多使用者行為,裝置的連線都會呼叫到該類的方法,對volume大小產生影響。

屬性

原始碼

分類

根據原始碼來看,VolumeStreamState的屬性並不多。

  • stream type 相關:mStreamType , mVolumeIndexSettingName ,既可以用數字表示型別,也可以用名字來表示
  • index相關:mIndexMax , mIndex (沒有Index Min也可以理解,因為不能有音量為負數,只會是0)
  • Clients death:mDeathHandler;

建構函式

原始碼

function :  VolumeStreamState

該函式多數行很簡單,對上面的屬性通過複製進行初始化

mIndexMax複製完成後:

  1. 對native初始化,呼叫 AudioSystem.initStreamVolume,引數為stream type, index min, index max.
  2. mIndexMax * 10用於提高運算精度

function : readSetting

該函式的有50多行,觀察之後可以發現,每個程式碼塊{} 中,都在執行mIndex.put,可以瞭解到readSetting是對 mIndex 初始化

邏輯大概如下:

  1. 使用 fixed volume , master volume 的情況,mIndex只存入 default out device ,max index 作為一對device–> index,然後退出 ,程式碼中為第一個 if 塊
  2. 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這麼定義到底是要做什麼?

  1. 適配多個平臺
  2. 適配多種外設