Audio 加载hal (loadHwModule)
近期在整理audio问题过程中不可避免的会涉及到一些流程处理,此前一些流程细节没有详细跟踪过,趁着这次机会,将看到的一些内容整理出来,方便后续查阅:
1. audio.primary.xx.so加载
audio的Hal层有蛮多内容,其中主要是:audio.primary.[ro.hardware].so 这里记录下该库被加载的流程;
1.1 load module调用
AudioFlinger::loadHwModule(const char *name)
AudioFlinger::loadHwModule_1(const char *name)
mDevicesFactoryHal->openDevice(name, &dev) // 这里mDeviceFactoryHal在1.2小结详细跟踪;
mLocalFactory->openDevice(name, device) //本例中调用的是mLocalFactory;
load_audio_interface(name, &dev)
hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod) // 获取到module
audio_hw_device_open(mod, dev) //打开之
module->methods->open();
1.2 Hw device 初始化
这里来跟踪确认mDevicesFactoryHal的创建过程
DevicesFactoryHalInterface::create();// 在audioflinger实例创建的时候创建此device
return DevicesFactoryHalHybrid(); // 根据hal版本选择对应的实例
new DeviceFactoryHalLocal();
new DeviceFactoryHalHidl();//创建了两个实例
即mDevicesFactoryHal->openDevice = mLocalFactory->openDevice
1.3 name解析
-
loadHwModule传入module name是?
-
拼接过程
#define HAL_LIBRARY_PATH1 "/system/lib64/hw" #define HAL_LIBRARY_PATH2 "/vendor/lib64/hw" #define HAL_LIBRARY_PATH3 "/odm/lib64/hw" static const char *variant_keys[] = { "ro.hardware", "ro.product.board", "ro.board.platform", "ro.arch" }; int hw_get_module_by_class(const char *class_id, const char *inst, const struct hw_module_t **module) { int i = 0; ... if (inst)// name: audio.primary snprintf(name, PATH_MAX, "%s.%s", class_id, inst); //prop_nam:ro.hardware.audio.primary snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name); if (property_get(prop_name, prop, NULL) > 0) {//根据这个属性获取到name if (hw_module_exists(path, sizeof(path), name, prop) == 0) { goto found; } } /* Loop through the configuration variants looking for a module */ for (i=0 ; i<HAL_VARIANT_KEYS_COUNT; i++) {//从属性中获取到hardware描述 if (property_get(variant_keys[i], prop, NULL) == 0) //audio.primary.xxx.so continue; if (hw_module_exists(path, sizeof(path), name, prop) == 0) goto found; } if (hw_module_exists(path, sizeof(path), name, "default") == 0) {//上述都没有定义就来default goto found; } return -ENOENT; found: return load(class_id, path, module); }
所以就是去上述几个路径下找到对应的module name;
2. 涉及文件记录
路径 |
---|
/hardware/libhardware/hardware.c |
/hardware/libhardware/include/hardware/audio.h |
/frameworks/av/media/libaudiohal/4.0/DevicesFactoryHalLocal.cpp |
/frameworks/av/media/libaudiohal/4.0/DevicesFactoryHalHybrid.cpp |
/frameworks/av/services/audioflinger/AudioFlinger.cpp |
/frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml |