相关概念:

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会对这种情况做一些特别处理。