码迷,mamicode.com
首页 > 移动开发 > 详细

Android音量设置流程干货版

时间:2015-04-03 22:33:54      阅读:424      评论:0      收藏:0      [点我收藏+]

标签: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);


Android音量设置流程干货版

标签:android   算法   数学   音频   

原文地址:http://blog.csdn.net/ffmpeg4976/article/details/44860615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!