audiopolicy完整流程如下:

1 AudioFlinger和AudioPolicyService属于binder服务。他们启动都是在同一个进程中,交互表面上是binder IPC交互,其实底层也是指针相互调用。
instantiate方法是发布自身服务到ServiceManager
| //framework/av/media/audioserver/main_audioserver.cpp int main(int argc __unused, char **argv) { ..... AudioFlinger::instantiate(); AudioPolicyService::instantiate(); |
2 AudioPolicyManager是AudioPolicyService服务进程下的一个独立功能模块,该模块可以由厂家自行实现(但必须遵循aosp的接口定义),最后提供libaudiopolicymanager.so库,由AudioPolicyService服务load进来调用即可。音频配置文件audio_policy_configuration.xml配置了音频的设备、流以及路由关系,AudioPolicyManager负责解析存储这些信息。
AudioPolicyService和AudioPolicyManager之间,相互保存对方的对象指针引用。

| void AudioPolicyService::onFirstRef() { { Mutex::Autolock _l(mLock); ...... /** 将自身封装为一个客户端传递个Manager,好处是可以隐藏Service自身内部的逻辑, * 只暴露给Manager需要的接口即可,同时也降低耦合 * */ mAudioPolicyClient = new AudioPolicyClient(this); //createAudioPolicyManager方法创建Manager mAudioPolicyManager =createAudioPolicyManager(mAudioPolicyClient); } ...... } AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface, bool /*forTesting*/) : ........ mpClientInterface(clientInterface), //参数是AudioPolicyService的this指针 ........ { loadConfig(); //加载音频配置文件 initialize(); //初始化音频设备信息 } |
3 AudioPolicyService上可以与应用层交互,通过它中转去查询、选择音频设备信息,也就是AudioPolicyManager模块,选择完成后最终决定使用哪个设备时,又转给AudioFlinger去与下层HAL交互。
4 AudioFlinger上可以与应用层交互,下可以和HAL层交互。

5 AudioFlinger与HAL建立连接
| AudioFlinger::AudioFlinger() : BnAudioFlinger(), .... { ...... //创建hal层音频访问hal引用 mDevicesFactoryHal = DevicesFactoryHalInterface::create(); //创建hal层音效访问hal层引用 mEffectsFactoryHal = EffectsFactoryHalInterface::create(); ...... } // static sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() { //IDevicesFactory是hal层的HIDL接口,这里先查询hal层支持的版本号,在针对性创建hidl的客户端 if (hardware::audio::V5_0::IDevicesFactory::getService() != nullptr) { return V5_0::createDevicesFactoryHal(); } if (hardware::audio::V4_0::IDevicesFactory::getService() != nullptr) { return V4_0::createDevicesFactoryHal(); } if (hardware::audio::V2_0::IDevicesFactory::getService() != nullptr) { return V2_0::createDevicesFactoryHal(); } return nullptr; } sp<DevicesFactoryHalInterface> createDevicesFactoryHal() { return new DevicesFactoryHalHybrid(); } DevicesFactoryHalHybrid::DevicesFactoryHalHybrid() : mLocalFactory(new DevicesFactoryHalLocal()), //关注以下成员 mHidlFactory(new DevicesFactoryHalHidl()) { } |
