Android音頻曲線調用從ui介面往下設定,根據stream音頻有不同的UI,分為7步,15步,對應到實際的100步。這個轉換過程可以參考AudioPolicyManagerBase.cpp中的volIndexToAmpl函數。 4.1上調用流程與之前的有所不同,原理還是一樣的。之前的版本我看是直線型的,新的是3段折線的。為什麼是直線,人耳對聲音大小的感知程度並不是線性,而是呈對數關係。這個可以和android原理對應起來 以10為底的對數。 下面是分貝公式的推導過程 音頻當中db用加減表示調整音量大小。 目前採用3段折線,我覺得可以更方便的調整聲音在不同地區的變化大小。最低聲音和最高聲音應該需要從更底層驅動來調整。 volIndexToAmpl這個函數實現了上面的轉換關係。 該函數是通過響應音量鍵效益開始執行下面調用過程,完成音量大小調節的。 下面是音量鍵按下後的調用過程 Audiomanager.java handleKeyDown adjustSuggestStreamVolume service. adjustSuggestStreamVolume AudioService.java adjustSuggestStreamVolume adjustStreamVolum sendMSG(mAudioHandler,MSG_SET_DEVICE_VOLUME,SND_QUEUE,device,0,streamstate,0); 訊息機制 AudioService.java AudioHandler handleMessage setDeviceVolume StreamState.applyDeviceVolume audioSystem.setStreamVolumeIndex JNI機制 Android_media_AudioSystem.cpp AudioPolicyManagerBase.cpp setStreamVolumeIndex checkAndSetVolume computeVolume volIndexToAmpl