携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
沉淀、分享、成长,让自己和他人都能有所收获!😄
📢本篇讲解Android音量控制流程
一、安卓音量控制流程简介
Android音频系统,分为数据流和策略两部分。 数据流描述了音频数据从数据源流向目的地的流程,包括AudioTrack、AudioFlinger等; 策略管理及控制数据流的路径与呈现方式,包括AudioPolicyService和AudioService等。- 音量的调节与控制属于策略范畴,其主要逻辑集中在
AudioService中。
二、AudioService介绍
- AudioService包含了音频系统的主要控制流程,是JAVA层音频管理的中枢。
- AudioManager拥有AudioService的Bp端,是AudioService在客户端的一个代理,AudioManager像各类应用暴露接口,而几乎所有客户端对AudioManager进行的请求,最终都会交由AudioService实现。
- AudioService的功能实现依赖于AudioSystem类,AudioSystem无法实例化,它是java层到native层的代理,AudioService通过它与AudioPolicyService以及AudioFlinger进行通信。
音量控制是AudioService最重要的功能之一。先总结一下:
- AudioService音量管理的核心是VolumeStreamState。它保存了一个流类型所有的音量信息。
- VolumeStreamState保存了运行时的音量信息,而音量的生效则是在底层AudioFlinger完成的。所以进行音量设置需要做两件事情:更新VolumeStreamState存储的音量值,设置音量到Audio底层系统。
- VolumeDeathHandler是VolumeStreamState的一个内部类。它的实例对应在一个流类型上执行静音操作的一个客户端,是实现静音功能的核心对象。
三、AudioFlinger和AudioPolicyService
Android音频系统的两大服务:一是AudioFlinger,二是AudioPolicyService。
- AudioPolicyService:是策略的制定者,负责输入输出设备的连接状态、音量策略调度即音频设备的切换策略、音量/音频参数的设置等等。
- AudioFlinger:是策略的执行者,负责向下访问AudioHardwareInterface,实现音频PCM数据的混音/输入/输出,实现音量调节。
四、AudioPolicyManager
AudioPolicyManager:AudioPolicyService的很大一部分管理工作都是在AudioPolicyManager中完成的。包括音量管理,音频策略(strategy)管理,输入输出设备管理。
AudioPolicyManager提供了一下几个与音量相关的函数:
initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax)
setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
getStreamVolumeIndex(AudioSystem::stream_type stream)
AudioService.Java中定义了每一种音频流的最大音量级别,java的代码通过jni,最后调用AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样AudioPolicyManager也就记住了每一个音频流的音量级别。
AudioService可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。