时间:2015-08-03 来源:

AndroidAudioFlinger加载HAL层流程 【Web前端】

一、前提 Audio HAL层最终以.so的方式为Android所用web切图报价,那这个.so的库如何被AudioFlinger所使用?

audio_hw.c中hw_module_methods_t 的实例化:

audio_hw_device 接口 接口按照hardware/libhardware/include/hardware/audio.h定义的接口实现就行了.这些接口全扔到一个结构体里面的,web切图报价这样做的好处是:不必用大量的dlsym来获取各个接口函数的地址,psd转html只需找到这个结构体即可,html切图制作从易用性和可扩充性来说,html切图 -ENODEV on failure. */ int (*init_check)(const struct audio_hw_device *dev); /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */ int (*set_voice_volume)(struct audio_hw_device *dev, * the software mixer will emulate this capability. */ int (*set_master_volume)(struct audio_hw_device *dev, AUDIO_MODE_RINGTONE when a ringtone is * playing, int mode); /* mic mute */ int (*set_mic_mute)(struct audio_hw_device *dev, bool *state); /* set/get global audio parameters */ int (*set_parameters)(struct audio_hw_device *dev, const char *keys); /* Returns audio input buffer size according to parameters passed or * 0 if one of the parameters is not supported */ size_t (*get_input_buffer_size)(const struct audio_hw_device *dev, int format, uint32_t devices, uint32_t *channels, struct audio_stream_out **out); void (*close_output_stream)(struct audio_hw_device *dev, uint32_t devices, uint32_t *channels, audio_in_acoustics_t acoustics, struct audio_stream_in *in); /** This method dumps the state of the audio hardware */ int (*dump)(const struct audio_hw_device *dev, int fd); }; typedef struct audio_hw_device audio_hw_device_t; 在HAL层adev_open初始化中要对audio_hw_device 进行赋值初始化,html切图制作HAL层的重头戏其实就是对这些函数进行实例化.

static int load(const char *id, const struct hw_module_t **pHmi) { int status; void *handle; struct hw_module_t *hmi; /* * load the symbols resolving undefined symbols before * dlopen returns. Since RTLD_GLOBAL is not or'd in with * RTLD_NOW the external symbols will not be global */ handle = dlopen(path, path, sym); if (hmi == NULL) { LOGE("load: couldn't find symbol %s", hmi->id) != 0) { LOGE("load: id=%s != hmi->id=%s", hmi->id); status = -EINVAL; goto done; } hmi->dso = handle; /* success */ status = 0; done: if (status != 0) { hmi = NULL; if (handle != NULL) { dlclose(handle); handle = NULL; } } else { LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p", path, handle); } *pHmi = hmi; return status; } 在打开的.so(audio.primary.msm8916.so)中查找HMI符号的地址承接网页制作, &mod, audio_interfaces[i], mod->id); mAudioHwDevs.push(dev); //mAudioHwDevs是一个Vector, mod->name, audio_interfaces[i]); } } mHardwareStatus = AUDIO_HW_INIT; if (!mPrimaryHardwareDev || mAudioHwDevs.size() == 0) { LOGE("Primary audio interface not found"); return; } //对audio hw devices进行一些初始化承接网页制作, mMode); mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME; dev->set_master_volume(dev, 1.0f); mHardwareStatus = AUDIO_HW_IDLE; } } } 主要是通过hw_get_module_by_class()找到模块接口名字if_name相匹配的模块库,web切图报价加载之后audio_hw_device_open()调用模块的open方法符合w3c标准, }; struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .version_minor = 0, .name = "Tuna audio HW HAL", .methods = &hal_module_methods, }; audio_module 是我们Audio HAL必须要实现的.

audio_hw_device 接口如下:

hw_get_module_by_class实现在hardware/libhardware/ hardware.c中符合w3c标准, const char *inst, PATH_MAX, class_id, class_id, PATH_MAX); //这里我们以音频库为例,网站div+cssAudioFlinger调用到这个函数时符合w3c标准,inst="primary"(或"a2dp"或"usb") //那么此时name="audio.primary" /* * Here we rely on the fact that calling dlopen multiple times on * the same .so will simply increment a refcount (and not load * a new copy of the library). * We also assume that dlopen() is thread-safe. */ /* Loop through the configuration variants looking for a module */ for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) { if (i < HAL_VARIANT_KEYS_COUNT) { /* 通过property_get找到厂家标记如"ro.product.board=msm8916", prop, sizeof(path), HAL_LIBRARY_PATH2, prop); if (access(path, sizeof(path), HAL_LIBRARY_PATH1, prop); if (access(path, R_OK) == 0) break; } else { /* 如没有指定的库文件,div前端切图则加载default.so */ snprintf(path, "%s/%s.default.so", name); if (access(path, R_OK) == 0) break; } } /** 到这里,jpg或psd转html完成一个模块库的完整路径名称web前端制作, if this fails, and we should not try * to load a different variant. */ //加载模块库:见下面 status = load(class_id, module); } return status; } load(class_id, module):

HAL层之后就会调用Tinyalsa,接着就是Audio Driver了. 总体顺序:AudioFlinger->Audio HAL->Tinyalsa->Audio Driver.

$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); }); 版权声明:本文为博主原创文章,wap前端外包未经博主允许不得转载.

二、Audio Hardware HAL加载 (1)AudioFlinger

AudioFlinger加载HAL层:

HAL通过hw_get_module函数获取hw_module_t HAL通过hw_module_t->methods->open获取hw_device_t指针web前端制作,并在此open函数中初始化audio_hw_device_t结构中的函数. 三个重要的数据结构: a) struct hw_device_t: 表示硬件设备,div+css制作存储了各种硬件设备的公共属性和方法 b)struct hw_module_t: 可用hw_get_module进行加载的module c)struct hw_module_methods_t: 用于定义操作设备的方法承接网页制作, const hw_module_t **mod, audio_hw_device_t **dev) { int rc; /* 这里加载的是音频动态库,web切图报价如audio.primary.msm8916.so, if_name, mod); if (rc) goto out; //加载好的动态库模块必有个open方法,wap前端外包调用open方法打开音频设备模块 rc = audio_hw_device_open(*mod, "couldn't open audio hw device in %s.%s (%s)", if_name, //指本机中的codec "a2dp", //a2dp设备,符合w3c标准蓝牙高保真音频 "usb", reserved for future use */ uint32_t reserved[32-7]; } hw_module_t; typedef struct hw_module_methods_t { /** Open a specific device */ int (*open)(const struct hw_module_t* module, struct hw_device_t** device); } hw_module_methods_t; 在load(…)中dlsym拿到这个结构体的首地址后承接网页制作,就可以调用Modules methods进行设备模块的初始化了.设备模块中,承接网页制作都应该按照这个格式初始化好这个结构体web切图报价,否则dlsym找不到它,网站div+css也就无法调用Modules methods进行初始化了.

点击次数:13313
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日Java和Python使用有道词典制作查单词脚本 【移动开发】2015年06月03日2015Multi-UniversityTrainingContest3 【综合】2015年07月29日有代价的单源最短路径 【数据库】2015年01月12日js通用javascript函数库整理2014年01月29日Handler消息传递机制(三)Message消息的两种发送方式【综合】2015年02月02日C语言笔记之头文件与链接(一)【编程语言】2015年04月28日Causedby:java.sql.SQLException:ORA-00923 【Web前端】2014年12月11日JavaScript数组基础知识【编程语言】2015年05月15日九章算法面试题6负载均衡 【综合】2015年05月18日apache下配置认证用户2014年11月17日mqtt推送实践 【综合】2014年12月17日作祝紫昨拙诅佐尊住桩左作柞【架构设计】2015年03月30日寻找最大的K个数 【移动开发】2015年09月02日Maven项目初开发(一)Maven项目开发的初配置(2) 【编程语言】2015年08月25日光耦相关1【移动开发】2015年02月11日javascript动态加载实现方法一2014年01月29日Windows8和Windows10系统改装Win7系统的问题和解决办法 【移动开发】2015年05月15日Java中的接口入门 【编程语言】2015年03月18日SQLServer不存在或访问被拒绝问题的解决2014年01月29日欧式洋房别墅公馆类设计总结2014年01月28日python对象特殊方法列表【编程语言】2015年04月17日Java学习笔记26 【编程语言】2015年03月09日IOS中的响应链 【编程语言】2014年12月25日MySQLGalera0.8.2发布 ,,2016年06月29日一个类在另一个类中以集合形式声明为属性时应该注意的问题 【编程语言】2015年02月09日Android---62---DrawerLayout实现抽屉效果 【编程语言】2015年08月07日DIYPC服务器主要配件选购注意事项2014年01月28日iOS动画——LayerAnimations 【研发管理】2015年05月28日Sparkparquetmergemetadata问题 【互联网】2015年05月06日MySQLStudy之--MySQL下图形工具的使用(phpMyAdmin) 【编程语言】2015年07月17日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)