Android音量设置流程干货版
1. 音量级数定义
在AudioService.java中定义了最大音量MAX_STREAM_VOLUME,手机的设置property可以覆盖它。
2. 音量初始化
initStreamVolume传入AudioPolicyManagerBase里的StreamDescriptor mStreams[AudioSystem::NUM_STREAM_TYPES];
3. 设置主音量
主音量怎么起作用?
最终音量=主音量*流音量
4. 设置流音量
setStreamVolumeIndex函数,在AudioPolicy中,通过volIndexToAmpl把Index整数转为float型的振幅比,也就是“振幅/参考振幅”。
具体做法是:通过输入的index查表找到对应的声压值db,然后通过下面的公式算出amplifier,这个值就是振幅比。
函数volIndexToAmpl中有一行代码
float amplification = exp( decibels * 0.115129f);
就是这个公式。
通过这个值乘以音源的振幅,就得到了调节后的音量。这也是数字增益调节的原理。
拿到这个值后,存入AudioFlinger的全局变量mStreamTypes,即:mStreamTypes[stream].volume =value。
在Thread试图播放声音时,在prepareTracks_l中是这么做的:
int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; const int32_t vlInc =t->volumeInc[0]; const int32_t vrInc =t->volumeInc[1]; do { *out++ += (vl >> 16) *(int32_t) *in++; *out++ += (vr >> 16) *(int32_t) *in++; vl += vlInc; vr += vrInc; } while (--frameCount);
在系统静音时,只是很简单的设置下列参数为0:
vl = vr = 0;vlf = vrf = vaf = 0.
设置AudioMixer的参数
mAudioMixer->setParameter(name, param,AudioMixer::VOLUME0, &vlf);
mAudioMixer->setParameter(name, param,AudioMixer::VOLUME1, &vrf);
所以最后还是通过AudioMixer真正去乘以VOLUME0和VOLUME1来设置音量。
如track__16BitsStereo中
int32_t vl = t->prevVolume[0]; int32_t vr = t->prevVolume[1]; const int32_t vlInc =t->volumeInc[0]; const int32_t vrInc =t->volumeInc[1]; do { *out++ += (vl >> 16) *(int32_t) *in++; *out++ += (vr >> 16) *(int32_t) *in++; vl += vlInc; vr += vrInc; } while (--frameCount);
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。