AudioPolicyManager initialize过程

目录

1、设备模块初始化 initialize

2、Client 侧加载 loadHwModule

3、AudioFlinger 调用链

4、DevicesFactory 设备选择

5、HIDL设备打开

6、HAL模块最终加载

7、完整调用链


1、设备模块初始化 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 请求加载硬件模块。

2、Client 侧加载 loadHwModule

文件
frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp

int AudioPolicyClientImpl::loadHwModule(const char *name) {
    return mAudioFlinger->loadHwModule(name);
}

通过 AudioFlinger 加载实际硬件模块。

3、AudioFlinger 调用链

int AudioFlinger::loadHwModule(const char *name) {
    return loadHwModule_l(name);
}

内部调用 openDevice

status_t AudioFlinger::openDevice(const char *name) {
    return mDevicesFactory->openDevice(name, &device);
}

4、DevicesFactory 设备选择

文件
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 路径。

5、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 封装好的设备对象。

6、HAL模块最终加载

文件
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 层绑定。

7、完整调用链

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

AudioPolicyManager initialize过程_第1张图片

你可能感兴趣的:(Android,audio,android)