由于人耳对声音的听感具指数曲线,也就是对小音量比较敏感,随着声音的加大其听感随之变的不敏感,其变化近似指数函数曲线的形式。为了使听感变的近似直线的变化,人们在实践中就采用了音量变化近似对数式曲线型的电位器来实现这个目的。对比法产生音量控制曲线与最终扬声器输出的声压有关,当然您也可以根据扬声器的输出功率来进行比对,但功率终究不如电压来的方便。音量调节框的UI滑动条的刻度是线性的,这样就给我们生成音量控制曲线打下了很好的对比基础。
我们按音量调节键使得media音量逐级增加到最大。STREAM_MUSIC流的音量分为15级,调用堆栈如下:
AudioManger/handleKeyDown
adjustSuggestedStreamVolume
AudioService/adjustSuggestedStreamVolume
adjustStreamVolume
MSG_SET_SYSTEM_VOLUME
setSystemVolume
AudioSystem/setStreamVolumeIndex
jni调用native的AudioSystem
AudioPolicymanagerService
AudiopolicyManagerBase/setStreamVolumeIndex
checkAndSetVolume
computeVolume
volIndexToAmpl真正计算音量的地方