音量调节堆栈
由于人耳对声音的听感具指数曲线,也就是对小音量比较敏感,随着声音的加大其听感随之变的不敏感,其变化近似指数函数曲线的形式。为了使听感变的近似直线的变化,人们在实践中就采用了音量变化近似对数式曲线型的电位器来实现这个目的。对比法产生音量控制曲线与最终扬声器输出的声压有关,当然您也可以根据扬声器的输出功率来进行比对,但功率终究不如电压来的方便。音量调节框的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真正计算音量的地方
音量调节从CarAudioManager到tinyalsa
1、从CarAudioManager到AudioSystem
CarAudioManager:setGroupVolume(int groupId, int index, int flags) mUseDynamicRouting控制软音量调节和硬音量调节 音量组:例如音乐多媒体,蓝牙音乐,收音机等属于多媒体音量组。 |
2、从audiopolicy到audioflinger
frameworks/av/media/libaudioclient/AudioSystem.cpp //音频流管理模块 AudioPolicyService主要通过AudioPolicyManager对外提供服务,而AudioFlinger并没有类似AudioFlingerManager这样的类,因为AudioFlinger主要向AudioPolicyService提供服务并不需要再向其他提供服务,所以两者进行了深度绑定 |
3、从audioflinger到audiohal
DeviceHalInterface有两种实现方式:DeviceHalHIDL和DeviceHalLocal,增加兼容导致架构更复杂了。audiohal层之后就是根据各个ROM厂商根据自身硬件进行适配,audiohal会根据每个厂商自行实现,但对上层接口保持一致。 |