目录
1、设备模块初始化 initialize
2、Client 侧加载 loadHwModule
3、AudioFlinger 调用链
4、DevicesFactory 设备选择
5、HIDL设备打开
6、HAL模块最终加载
7、完整调用链
initialize
frameworks/av/services/audiopolicy/manager/AudioPolicyFactory.cpp
status_t status = apm->initialize();
文件:
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
status_t AudioPolicyManager::initialize() {
onNewAudioModulesAvailableInt();
}
内部调用:
hwModule->setHandle(mpClientInterface->loadHwModule(hwModule->getName()));
向 AudioPolicyClientImpl
请求加载硬件模块。
loadHwModule
文件:
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
int AudioPolicyClientImpl::loadHwModule(const char *name) {
return mAudioFlinger->loadHwModule(name);
}
通过 AudioFlinger 加载实际硬件模块。
int AudioFlinger::loadHwModule(const char *name) {
return loadHwModule_l(name);
}
内部调用 openDevice
:
status_t AudioFlinger::openDevice(const char *name) {
return mDevicesFactory->openDevice(name, &device);
}
文件:
frameworks/av/media/libaudiohal/impl/DevicesFactoryHalHybrid.cpp
status_t DevicesFactoryHalHybrid::openDevice(const char *name, sp *device) {
if (isHIDLType(name)) {
return mHidlFactory->openDevice(name, device);
}
return mLocalFactory->openDevice(name, device);
}
A2DP / HEARING_AID 设备 → 本地路径,其他设备 → HIDL 路径。
文件:
frameworks/av/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
Result retval = Result::NOT_INITIALIZED;
factory->openDevice(hidlId, [&](Result r, const sp& result) {
if (r == Result::OK) {
*device = new DeviceHalHidl(result);
}
});
成功时返回 DeviceHalHidl
封装好的设备对象。
文件:
hardware/interfaces/audio/core/all-versions/default/DevicesFactory.cpp
int DevicesFactory::loadAudioInterface(const char* if_name, audio_hw_device_t** dev) {
rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);
rc = audio_hw_device_open(mod, dev);
}
调用 hw_get_module_by_class
加载具体设备驱动,完成 HAL 层绑定。
AudioPolicyService::onFirstRef()
-> createAudioPolicyManager()
-> AudioPolicyManager::AudioPolicyManager()
-> loadConfig()
-> deserializeAudioPolicyFile()
-> PolicySerializer::deserialize()
└─解析Modules/GlobalConfig/SurroundSound
-> initialize()
-> onNewAudioModulesAvailableInt()
-> hwModule->setHandle(loadHwModule())
loadHwModule()
-> AudioPolicyClientImpl::loadHwModule()
-> AudioFlinger::loadHwModule()
-> openDevice()
-> DevicesFactoryHalHybrid::openDevice()
└─ HIDL: DevicesFactoryHalHidl::openDevice()
└─ hardware/interfaces audio HAL接口
└─ hw_get_module_by_class
└─ audio_hw_device_open