android音量控制曲線和呼叫過程
http://blog.csdn.net/newtonnl/article/details/8455136
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
4.0之前版本可以參考