Audio 加载hal (loadHwModule)

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解析

  1. loadHwModule传入module name是? image-20210914225542159

  2. 拼接过程

    #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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值