Android音量控制流程

779 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情 

沉淀、分享、成长,让自己和他人都能有所收获!😄

📢本篇讲解Android音量控制流程

一、安卓音量控制流程简介


  • Android音频系统,分为数据流和策略两部分。 数据流描述了音频数据从数据源流向目的地的流程,包括AudioTrackAudioFlinger等; 策略管理及控制数据流的路径与呈现方式,包括AudioPolicyServiceAudioService等。
  • 音量的调节与控制属于策略范畴,其主要逻辑集中在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中。