Android2.2、Android2.3 、Android4.0 audio hardware模块分析

2024-02-15 23:58

本文主要是介绍Android2.2、Android2.3 、Android4.0 audio hardware模块分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Android2.2、Android2.3 、Android4.0 audio hardware模块分析

 

      从事Linux开发的工程技术人员都知道,ALSA是Advanced Linux Sound Architecture的简写,它现在很流行,起初使用在台式电脑上,随着嵌入式的发展,它有把触角伸入了新的园地,并且在这个新舞台上越来越受欢迎。ALSA很强大,功能很丰富,当然本身就比较庞大了一些。事情都是这样的,使用起来简单,就必然有个环节要付出艰辛, ALSA就干了这样一件事。在android2.2上,Google将其视为掌上明珠、座上宾,将其加入了maintree,因此在android2.2上,在hardware层,大多公司选择了ALSA作为跟driver打交道的帮手,当然也有高通这些公司,一直坚持自己私有的一套东西。当然android还是蛮开放的,允许你自己来选择、实现!在2.2上编译出来的共享库为alsa.XXX.so,xxx可以为产品名称,也可以使用default,随即就是alsa.default.so。

   到了android2.3,变化了,ALSA被干掉了!!!可悲啊!Google居然写了自己的一套迷你接口!开源的ALSA虽然有很多东西你用不上,但是自己写一套迷你这样的接口也变成私有的了,不利于以后的发展,有一种忧虑是Google自己写的这一套东西能不能跟ALSA的release同步更新,能不能跟上这个脚本,这并非没有道理。如果使用Google写的迷你接口,就会出现driver还是使用ALSA的,user space使用Google的,感觉就是核是别人的,壳是自己的,这样工作是能工作,搭不搭啊?driver里出错了的情况下,Google的接口怎么办?没看见how to process,只是give up audio data。2.3里面对audio的操作,打开设备、关闭设备,非常频繁,不觉得很好。

   笔者通过比较2.3的audiofliger跟2.2的audiofliger后,分析后认为,2.3可以把2.2使用ALSA的hardware layer的code完全merge到2.3来工作,因为在audiofliger中,调用hal layer的接口没有发生变化,也算Google留了一手吧!

   到了最新的android4.0,Google整出来了一个tinyalsa,还稍微公道一点,还是沾上了alsa这几个字,只不过是tiny的。但是笔者分析了4.0的audiofliger后发现,audiofliger调用hal layer的接口发生了翻天覆地的变化,猛啊!4.0把play跟capture分得更开放了,自己管自己的,audiofliger都从原来3k来行,扩张到了5k多行,大动干戈啊!苦了的还是coder啊!从接口上来看,开放性更高了!当然hal layer需要大变样了!不过还是可以使用ALSA接口来实现。不管是ALSA,还是tinyalsa,归根结底是跟driver打交道的最后一关,跟hal layer的控制逻辑什么的关系不大,看到Samsung的参考代码就是使用了自己的一套实现。

    下面笔者就来分析下android4.0的audiofliger如何调用hal layer功能代码的:

调用关系解析:

AudioFliger.cpp

 

static int load_audio_interface(const char *if_name, const hw_module_t **mod,
audio_hw_device_t **dev)
{
int rc;
/*decide audio.primary.XXX.so, XXX 为product名称,得到hw_module_t对象;
hw_get_module_by_class 来之于libhardware.so*/
rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, mod);
if (rc)
goto out;
/*Open hw device,这样就会call到上一步对象中的hw_module_methods_t中注册的open函数,这样就进一步细化注册了众多audio的hardware接口;
audio_hw_device_open 是inline函数,会call回mod的open*/
rc = audio_hw_device_open(*mod, dev);
LOGE_IF(rc, "couldn't open audio hw device in %s.%s (%s)",
AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
if (rc)
goto out;
return 0;
out:
*mod = NULL;
*dev = NULL;
return rc;
}


  分析清楚了这种关系,我们只要去完善hal layer的代码即可,选哪种方式实现,是你的自由!就以后代码的移植性、兼容性来说,我还是觉得ALSA更好一些,学习的资料也更多,碰到了一些问题,还能Google出来帮忙,用私有的,能实现,麻烦还是会有的!

  一家之言,仅供参考!

 

这篇关于Android2.2、Android2.3 、Android4.0 audio hardware模块分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712917

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java