相关概念:
1.Audio interfaces
安卓手机上目前支持三类音频播放设备,这个主要是根据声音播放端和CPU的通信关系来划分的
static const char * const audio_interfaces[] = {
AUDIO_HARDWARE_MODULE_ID_PRIMARY, //手机板载的主设备
AUDIO_HARDWARE_MODULE_ID_A2DP, //蓝牙音频
AUDIO_HARDWARE_MODULE_ID_USB, //USB音频
};
2.Audio Devices
是指具体的音频播放设备,比Audio interfaces的粒度要细一些。
3. StreamType
PCM的生成类型,是播放电影产生的,还是通话产生的。
4.AudioStrategy
在之前的版本中,AudioStream对应AudioStrategy,AudioStrategy选择音频输出设备;
在现在的新版本中,AudioStream仅用来标识音频的音量,使用音频属性AudioAttributes和AudioStream共同决定AudioStrategy。
路径:
framework\av\services\audiopolicy
相关类:
AudioPolicyManager
AudioPolicyManager是AudioPolicyService服务进程下的一个独立功能模块,该模块可以由厂家自行实现(但必须遵循aosp的接口定义),最后提供libaudiopolicymanager.so库,由AudioPolicyService服务load进来调用即可。
audio_policy_configuration.xml 配置文件
原始路径:
frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml
解析路径:
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
deserializeAudioPolicyXmlConfig 下进行解析
查看当前系统配置文件路径:
adb shell dumpsys media.audio_policy | grep --color -i -e "Config source"
module names:
“primary”, “A2DP”, “remote_submix”, “USB”
属性:
devicePorts:所有通过本模块可访问的输入和输出设备的设备描述符列表,它包含永久连接的设备和可移动设备。
mixPorts:列出音频HAL公开的所有输出和输入流
routes:输入输出设备或流与设备之间可能的连接列表
——sink和sources
——SINK是发射,Source是接收
attachedDevices:永久性连接设备
audio_policy_volumes.xml 规定了音频流、输出设备和音量曲线的关系
default_volume_tables.xml 规定了具体音频曲线的值
AudioPolicyService
(1)loadHwModule 方法
(2)loadConfig 方法
//加载音频配置文件
(3)initialize 方法
//初始化module,device信息,进行加载module、打开设备等操作,整个操作贯通到HAL、Kernel层
(4)openDevice 方法
Engine
AudioPolicy 启动流程:
AudioPolicy 时序图:
音频配置文件:
audio_policy_configuration.xml
音量调整:
adjustStreamVolume和setStreamVolume:
adjustStreamVolume传入音量调节的方向,setStreamVolume直接传入音量值。
原理:
调节过程中首先根据音频流类型找到输出设备,再根据音频流类型和输出设备找到音频曲线并计算出音量的db值,最后将音量值设置到对应的混音线程PlayBackThread中,实现音量调节。
需要注意的是当音调至0时称为muteAdjust,Android会对这种情况做一些特别处理。