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);


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。