文章开始,我们需要明白AudioPolicyService在audio中扮演者什么角色?
顾名思义,AudioPolicyService是音频策略的制定者,如获取音频配置信息、决定打开音频设备时机、不同音频类型对应的播放设备、不同音频类型的音量调节等等,一方面是获取底层音频设备配置信息,另一方面驱使AudioFlinger执行策略功能,充当HAL和AudioFlinger的桥梁。
frameworks\av\services\audioflinger\AudioPolicyService.cpp
先介绍大致的启动过程:
启动AudioPolicyService 服务–audio_policy_module模块(HAL层注册)–打开audio_policy_device设备(会和AudioFlinger建立联系)–创建audio_policy
启动服务就不用说了,创建AudioPolicyService 单例对象,执行构造函数
然后构造函数就有了以下内容:
在frameworks\av\media\mediaserver\main_mediaserver.cpp
中的main函数中启动了 AudioPolicyService 服务:
AudioPolicyService::instantiate();
导致下面一系列事件的发生:
AudioPolicyService::AudioPolicyService():
...
const struct hw_module_t *module;//定义module,获取hal层信息
....
rc = hw_get_module(AUDIO_POLICY_HARDWARE_MODULE_ID, &module);
if (rc)
return;
rc = audio_policy_dev_open(module, &mpAudioPolicyDev); //打开audio_policy_dev设备
rc = mpAudioPolicyDev->create_audio_policy(mpAudioPolicyDev, &aps_ops, this, //创建audio policy
&mpAudioPolicy);
//
static inline int audio_policy_dev_open(const hw_module_t* module,
struct audio_policy_device** device)
{
return module->methods->open(module, AUDIO_POLICY_INTERFACE, //使用获取的module的open方法打开dev
(hw_device_t**)device);
}
methods->open定义在如下文件: HAL层
hardware\libhardware_legacy\audio\ audio_policy_hal.cpp
static struct hw_module_methods_t legacy_ap_module_methods = {
open: legacy_ap_dev_open //定义open函数
};
struct legacy_ap_module HAL_MODULE_INFO_SYM = {
module: {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: AUDIO_POLICY_HARDWARE_MODULE_ID,
name: "LEGACY Audio Policy HAL",
author: "The Android Open Source Project",
methods: &legacy_ap_module_methods, //初始化methods,
dso : NULL,
reserved : {
0},
},
},
};
static int legacy_ap_dev_open(const hw_module_t* module, const char* name,
hw_device_t*<