android audio 架构分析(2) AudioPolicyService 的结构
来源:互联网 发布:苏州哪里有mac专柜 编辑:程序博客网 时间:2024/06/06 02:06
AudioPolicyService简介
AudioPolicyService是android audio system中两大服务之一,另外一个是AudioFlinger。
主要的功能:
1. 检测和设置输入输出设备的连接状态
2. 音频系统的切换策略抉择
3. 音量和音频系统参数的设置
4. 音效的设置
AudioPolicyService的相关代码
frameworks/av/services/audioflinger/AudioPolicyService.cpphardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp
hardware/libhardware_legacy/audio/audio_policy_hal.cpp
hardware/libhardware_legacy/audio/AudioPolicyCompatClient.cpp
AudioPolicyService启动
AudioPolicyService是个Service,其启动是在mediaserver中启动的frameworks/av/media/mediaserver/main_mediaserver.cpp
AudioPolicyService::instantiate();
AudioPolicyService和AudioPolicyManager结构关系
AudioPolicyService中的具体实现实际都是AudioPolicyManager完成的AudioPolicyService连接AudioPolicyManager
AudioPolicyService中:
struct audio_policy *mpAudioPolicy; 对应的是struct audio_policy policy;(audio_policy_hal.cpp)
audio_policy_hal.cpp中:
audio_policy中所有的Methods最后调用AudioPolicyManager中的方法
AudioPolicyManager连接AudioPolicyService
AudioPolicyManager中:
其并没有直接与AudioPolicyService连接,而是通过AudioPolicyCompatClient连接的
AudioPolicyClientInterface *mpClientInterface; 对应的就是AudioPolicyCompatClient
AudioPolicyCompatClient中:
struct audio_policy_service_ops* mServiceOps; 对应的是AudioPolicyService的Methods
void* mService; 对应的是AudioPolicyService
因此AudioPolicyManager通过AudioPolicyCompatClient调用AudioPolicyService开放的接口
audio_policy_service_ops的结构定义在hardware/libhardware/include/hardware/audio_policy.h
AudioPolicyService的架构实现(如何连上AudioPolicyManager)
AudioPolicyService.cpp
AudioPolicyService::AudioPolicyService(): BnAudioPolicyService() , mpAudioPolicyDev(NULL) , mpAudioPolicy(NULL)
{
//命令接收线程:
// START_TONE STOP_TONE SET_VOLUME SET_PARAMETERS SET_VOICE_VOLUME SET_FM_VOLUME
mAudioCommandThread = new AudioCommandThread(String8("ApmCommand"));
//得到AudioPolicyHardwareModule
rc = hw_get_module(AUDIO_POLICY_HARDWARE_MODULE_ID, &module);
rc = audio_policy_dev_open(module, &mpAudioPolicyDev);
//创建对应的AudioPolicyManager
rc = mpAudioPolicyDev->create_audio_policy(mpAudioPolicyDev, &aps_ops, this,
&mpAudioPolicy);
}
//创建mpAudioPolicyDev
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,
(hw_device_t**)device);
}
audio_policy_hal.cpp
//注册AUDIO_POLICY_HARDWARE_MODULE_ID module
static struct hw_module_methods_t qcom_ap_module_methods = {
open: qcom_ap_dev_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,
dso : NULL,
reserved : {0},
},
},
};
//注册 struct audio_policy_device *mpAudioPolicyDev;
static int qcom_ap_dev_open(const hw_module_t* module, const char* name,
hw_device_t** device)
{
dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.version = 0;
dev->device.common.module = const_cast<hw_module_t*>(module);
dev->device.common.close = qcom_ap_dev_close;
dev->device.create_audio_policy = create_qcom_ap;
dev->device.destroy_audio_policy = destroy_qcom_ap;
*device = &dev->device.common;
}
//创建AudioPolicyManager
static int create_qcom_ap(const struct audio_policy_device *device,
struct audio_policy_service_ops *aps_ops,
void *service,
struct audio_policy **ap)
{
qap = (struct qcom_audio_policy *)calloc(1, sizeof(*qap));
//注册函数
qap->policy.set_device_connection_state = ap_set_device_connection_state;
qap->policy.get_device_connection_state = ap_get_device_connection_state;
.......
qap->service = service;
qap->aps_ops = aps_ops;
//创建AudioPolicyCompatClient,并且注册service和aps_ops
qap->service_client =
new AudioPolicyCompatClient(aps_ops, service);
//创建AudioPolicyManager
qap->apm = createAudioPolicyManager(qap->service_client);
//将qap->policy返回给AudioPolicyService
*ap = &qap->policy;
}
AudioPolicyManager的架构实现(如何连上AudioPolicyService)
AudioPolicyManagerAlsa.cpp
//创建AudioPolicyManager,并传入参数clientInterface
extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
{
return new AudioPolicyManager(clientInterface);
}
AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
{
mpClientInterface = clientInterface;
}
从上面的分析,mpClientInterface是与AudioPolicyService的接口。
而且其是AudioPolicyCompatClient
qap->service_client =
new AudioPolicyCompatClient(aps_ops, service);
AudioPolicyCompatClient.cpp
例如AudioPolicyManager调用AudioPolicyService的setParameters
void AudioPolicyCompatClient::setParameters(audio_io_handle_t ioHandle,
const String8& keyValuePairs,
int delayMs)
{
mServiceOps->set_parameters(mService, ioHandle, keyValuePairs.string(),
delayMs);
}
- android audio 架构分析(2) AudioPolicyService 的结构
- Android Audio Framework 之AudioPolicyService
- Android Audio 架构分析
- Android 7.0 Audio: AudioPolicyService和他的码农APM
- 【Android 7.0 Audio】: AudioPolicyService和他的码农APM
- AudioFlinger,AudioPolicyService and Audio track分析
- AudioFlinger,AudioPolicyService and Audio track分析
- Android Audio 02 - AudioTrack/AudioFlinger/AudioPolicyService 构架
- android audio整体架构分析
- AudioPolicyService 的分析之一
- 【Android Audio】Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- python显示当前系统时间
- 开发小技巧:jQuery处理自适应内容高度的iframe
- 尚观Linux最佳入门高清视频教程033/133/253
- 关于反向域名解析(Reverse DNS)
- android的OptionsMenu
- android audio 架构分析(2) AudioPolicyService 的结构
- SSH连接Debian出现延迟的解决方法
- mount/umount详解
- BM模式匹配算法-原理(图解) 比较清楚的一篇
- 实现类非静态成员函数做窗口过程函数
- 安装mysql5.5时,到了start service没反应解决方案
- Generate profile using VS ultimate 2010
- POJ 1177: Picture
- 分享Android进行远程登录下配置的方法