硬件音量的设置我们就先不分析了,我们看软件音量上又是怎么走的,去到:
void AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value){Mutex::Autolock _l(mLock);mStreamTypes[stream].volume = value;broadcast_l();}
其实这里跟前面的中做了重复工作,多赋值一次,前面中的赋值应该是可以去掉的(从机制上我觉得是可以的),言归正传,似乎路再一次的堵死了,这里面通过广播告诉有事情要处理,我们需要到里面去看看,以为例,我们关注下它的,“三把斧”的第一把就告诉了我们答案:
AudioFlinger::MixerThread::prepareTracks_l@Threads.cpp{...float typeVolume = mStreamTypes[track->streamType()].volume;float v = masterVolume * typeVolume; }
这里的 就是前面赋值的音量值,下面一句话告诉了我们软音量的总值为 与设置index计算出来的音量之积,所以,在实际问题的处理中,如果音量调节全程都很小,请注意是否是 太小导致的,也是通过上层java接口来设置的 。计算了总音量之后,后续就会去mixer中进行混音了,软音量的设置也完成了 。
至此,音量设置的分析基本就完成了,回顾一下,音量设置首先是java层计算,存储index值,更新UI等操作,然后将流类型和index传入层,层通过进行计算之后,转交由去设置,而原生中是通过处理track数据来达到音量调节的目的 。
三、总结:
原生音量调节略微复杂,这里做了一张图来比较完成的概括一下(原图较大,可自行下载保存):
1.不同的厂商按键响应策略不一样,但最终都会调入到中;
2.在音量值计算的过程中承载的工作比较大,首先是通过服务调用去计算音量值,然后是通过自己创建的去接收audio音量调节的指令;
3.如何设置到略微有点绕,因为中间有一个自己创建的线程;
4.中原生场景会去设置软件音量,不同的厂商硬件音量的策略不同,所以红色虚线圈起来的为硬件音量设置,需视平台而定,但是一定要区分软件音量与硬件音量的区别;
5.软件音量是通过改变track中数据实现的音量调节,硬件音量是通过修改寄存器值实现的调节;
6.原生中所说的二级音量设置就是中的*,因为软件总音量是二者之积,所以,音量值太小时请确认软件总音量值;
- android 自定义音量调节,Android之自定义音量控制控件
- 1 Android音视频开发,android驱动开发权威指南pdf
- android x86 跑分
- 2021大厂Android面试经历,含小米、腾讯、阿里
- 吊打面试官-Android中高级面试题,分享PDF高清版
- Android-APK瘦身实践:二次瘦身如何再减少大小?
- 小白看完都学会了!五年Android开发者小米、阿里面经,大厂面经合集
- Android 12 还没用上,Android 13 已经来了
- android与ios返回按钮,Android与ios的系统交互模式差异
- Android 自定义Behavior