本章节,大体介绍一下AudioPolicyService
手机的Audio输入源很多,例如放电影,放音乐,通话,铃声,提示音等
输出也很多,例如蓝牙,耳机,喇叭,听筒等
那么什么声音输出到什么地方呢?
这就是AudioPolicyService干的事情了。
首先明确几个概念:
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的生成类型。是播放电影产生的?还是通话产生的?
enum stream_type {
DEFAULT =-1,
VOICE_CALL = 0,
SYSTEM = 1,
RING = 2,
MUSIC = 3,
ALARM = 4,
NOTIFICATION = 5,
BLUETOOTH_SCO = 6,
ENFORCED_AUDIBLE = 7,
DTMF = 8,
TTS = 9,
NUM_STREAM_TYPES
};
4,
STRATEGY, 是指针对某一中stream,该采用的策略。在策略里面,会根据其他信息来具体选定某一个具体的Audio Devices
enum routing_strategy {
STRATEGY_MEDIA,
STRATEGY_PHONE,
STRATEGY_SONIFICATION,
STRATEGY_SONIFICATION_RESPECTFUL,
STRATEGY_DTMF,
STRATEGY_ENFORCED_AUDIBLE,
NUM_STRATEGIES
};
所以,APS干的事情,实际上就是根据这一路AudioTrack的StreamType,找到他要遵循的STRATEGY,根据这个STRATEGY,在目前设备上可以获得的Audio Devices里面查找到最优的Audio Devices,
然后使用这个Audio Device来播放声音 。
下面我们来分析一下APS的启动过程
在AF章节中,我们介绍过,mediaserver进程启动时,会启动APS进程,
然后APS的构造函数被被调用到
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService() , mpAudioPolicyDev(NULL) , mpAudioPolicy(NULL)
{
rc = hw_get_module(AUDIO_POLICY_HARDWARE_MODULE_ID, &module); //获得HAL层的so lib
rc = audio_policy_dev_open(module, &mpAudioPolicyDev); //打开上面获得的policy 设备
rc = mpAudioPolicyDev->create_audio_policy(mpAudioPolicyDev, &aps_ops, this,&mpAudioPolicy); //创建一个策略
rc = mpAudioPolicy->init_check(mpAudioPolicy); //初始化检测
}
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService() , mpAudioPolicyDev(NULL) , mpAudioPolicy(NULL)
{
rc = hw_get_module(AUDIO_POLICY_HARDWARE_MODULE_ID, &module); //获得HAL层的so lib
rc = audio_policy_dev_open(