Android音频系统之音频框架
1.1 音频框架
Android的音频系统在很长一段时间内都是外界诟病的焦点。的确,早期的Android系统在音频处理上相比于IOS有一定的差距,这也是很多专业的音乐播放软件开发商没有推出Android平台产品的一个重要原因。但这并不代表它的音频框架一无是处,相反,基于Linux系统的Android平台有很多值得我们学习的地方。
1.1.1 Linux下的音频框架
用于声卡与外放设备,如扬声器、耳机的连接,又被称为“jacks”
声卡的主要实现体,它负责信号的放大、混音、以及模拟数字转换等操作
我们可以通过“cat/proc/asound/cards”命令来查看计算机中安装的声卡设备,如下例子所示:
目前市面上声卡的种类众多,既有复杂的高性能的,也有低端的简易的,那么对于一个操作系统来说,它如何管理这些音频设备,并向上层应用提供统一的接口呢?
Android严格来讲只是一个Linux系统,它依赖于内核提供的各种驱动支持,包括音频驱动。因此我们有必要先花点时间来学习下Linux平台下的两种主要的音频驱动架构:
设备节点 |
说明 |
/dev/dsp |
向此文件写数据à输出到外放Speaker 向此文件读数据à从Microphone进行录音 |
/dev/mixer |
混音器,用于对音频设备进行相关设置,比如音量调节 |
/dev/midi00 |
第一个MIDI端口,还有midi01,midi02等等 |
/dev/sequencer |
用于访问合成器(synthesizer),常用于游戏等效果的产生 |
更多详情,可以参考OSS的官方说明:http://www.opensound.com/
· ALSA(Advanced Linux Sound Architecture)
Ø 高效支持大多数类型的audio interface(不论是消费型或者是专业型的多声道声卡)
Ø 与OSS API保持兼容,这样子可以保证老的OSS程序在系统中正确运行
Element |
Description |
alsa-driver |
内核驱动包 |
alsa-lib |
用户空间的函数库 |
alsa-utils |
包含了很多实用的小程序,比如 alsactl:用于保存设备设置 amixer:是一个命令行程序,用于声量和其它声音控制 alsamixer:amixer的ncurses版 acconnect和aseqview:制作MIDI连接,以及检查已连接的端口列表 aplay和arecord:两个命令行程序,分别用于播放和录制多种格式的音频 |
alsa-tools |
包含一系列工具程序 |
alsa-firmware |
音频固件支持包 |
alsa-plugins |
插件包,比如jack,pulse,maemo |
alsa-oss |
用于兼容OSS的模拟包 |
pyalsa |
用于编译Python版本的alsa lib |
- Information Interface (/proc/asound)
- Control Interface (/dev/snd/controlCX)
- Mixer Interface (/dev/snd/mixerCXDX)
- PCM Interface (/dev/snd/pcmCXDX)
- Raw MIDI Interface (/dev/snd/midiCXDX)
- Sequencer Interface (/dev/snd/seq)
- Timer Interface (/dev/snd/timer)
关于ALSA的更多知识,建议大家可以自行参阅相关文档,这对于后面理解整个Audio系统是不无裨益的。
1.1.2 TinyAlsa
一看“Tiny”这个词,大家应该能猜到这是一个ALSA的缩减版本。实际上在Android系统的其它地方也可以看到类似的做法——既想用开源项目,又嫌工程太大太繁琐,怎么办?那就只能瘦身了,于是很多Tiny-XXX就出现了。
在早期版本中,Android系统的音频架构主要是基于ALSA的,其上层实现可以看做是ALSA的一种“应用”。后来可能是由于ALSA所存在的一些不足,Android后期版本开始不再依赖于ALSA提供的用户空间层的实现,因而我们在它的库文件夹中已经找不到alsa相关的lib了,如下图所示:
图 13‑7 Android4.1与早期版本在音频库上的区别
而取代它的是tinyalsa相关的库文件,如下图所示:
同时我们可以看到externl目录下多了一个“tinyalsa”文件夹,其中包含了为数不多的几个源码文件,如下所示:
表格 13‑3 Tiny-alsa工程文件
Source File |
Description |
Android.mk |
makefile |
mixer.c |
Mixer Interface实现 |
pcm.c |
PCM Interface实现 |
tinycap.c |
Caputer工具 |
tinymix.c |
Mixer工具 |
tinyplay.c |
Play工具 |
include/tinyalsa/asoundlib.h |
头文件 |
可见TinyAlsa与原版Alsa的差异还是相当大的,它只是部分支持了其中的两种Interface,而像Raw MIDI、Sequencer、Timer等Interface则没有涉及到——当然这对于一般的嵌入式设备还是足够了。
TinyAlsa作为Alsa-lib的一个替代品,自面世已来得到的公众评价有褒有贬,不能一概而论——对于每个厂商来说,合适自己的就是最好的。而且各厂商也可以在此基础上扩展自己的功能,真正的把ALSA利用到极致。
1.1.3 Android系统上的音频框架
一个好的系统架构,需要尽可能地降低上层与具体硬件的耦合,这既是操作系统的设计目的,对于音频系统也是如此。音频系统的雏形框架可以简单的用下图来表示:
细化的根据自然还是Android的几个层次结构,包括应用层、framework层、库层以及HAL层,如下图所示:
我们可以结合目前已有的知识,想一下每一个层次都会包含哪些模块(先不考虑蓝牙音频部分)?
这是整个音频体系的最上层,因而并不是Android系统实现的重点。比如厂商根据特定需求自己写的一个音乐播放器,游戏中使用到声音,或者调节音频的一类软件等等。
除此以外,Android系统还为我们控制音频系统提供了AudioManager、AudioService及AudioSystem类。这些都是framework为便利上层应用开发所设计的。
这一部分代码集中放置在工程的frameworks/av/media/libmedia中,多数是C++语言编写的。
音频体系中另一个重要的系统服务是MediaPlayerService,它的位置在frameworks/av/media/libmediaplayerservice。
因为涉及到的库和相关类是非常多的,建议大家在理解的时候分为两条线索。
在分析源码的过程中,一定要紧抓这两条线索,才不至于觉得混乱。
音频方面的硬件抽象层主要分为两部分,即AudioFlinger和AudioPolicyService。实际上后者并不是一个真实的设备,只是采用虚拟设备的方式来让厂商可以方便地定制出自己的策略。
基于上面的分析,我们给出一个完整的Android音频系统框架来给大家参考(没有列出Linux层的实现,比如ALSADriver等等),如下所示:
Android音频系统之音频框架相关推荐
- Android音频系统之一音频基础
对于一部嵌入式设备来说,除了若干基础功能外(比如手机通话.短信),最重要的可能就是多媒体了,那么问题来了,什么是多媒体呢? 多媒体是各种形式的媒体(比如文本.音频.视频.图片.动画等等)的组合.可以说 ...
- 安卓音频系统之一音频基础
音视基础 声波 音频的录制.存储与回放 音频采样 Nyquist-Shannon采样定律 声道与立体声道 声音定级-WeberFechner law 音频文件格式 声波 从物理学的角度来讲,声音是机械 ...
- Android音频系统之四AudioPolicy
4.1 AudioPolicy的诞生 AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加 ...
- Android ALSA音频系统架构分析(1)----从Loopback了解Audio
/*********************************** * Author:刘江明 * Environment:MTK Android 6.0 * Date:2017年05月25日 * ...
- Android音频系统之AudioPolicyService
地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...
- Android 音频系统:从 AudioTrack 到 AudioFlinger(全)
Android 音频框架概述 Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出.音频流的控制.音频设备的管理.音量调节等,主要包括如下部分: Audio App ...
- 08.音频系统:第002节_Android音频系统框架简述
该小节我们来讲解Android音频系统框架,了解了框架之后,我们才能更加容易的去查看以及分析源码,有了框架才不会遗失方向. 下面是一个大框图,该小节我们将围绕下面的图示进行讲解: 以前总提到,写应用程 ...
- android音频系统之AudioTrack的使用
今天,简单讲讲 AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...
- android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探
昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...
- android 音频配置文件,Android音频系统
1 分析思路 Thread如何创建? AudioPolicyService是策略的制定者,AudioFlinger是策略的执行者, 所以: AudioPolicyService根据配置文件使唤Audi ...
最新文章
- 蚂蚁金服付志嵩:数据膨胀?关系复杂?如何升级图数据库?
- Jenkins中的邮件设置
- java访问控制符_java中访问控制符的作用
- 关于window对象
- websocket的加密和解密
- java编程思想第四版第十四章 类型信息习题
- swag您的装置不支持_一件充满意境的中国风水墨粒子、电子屏风交互装置
- ajax上传变量,通过ajax传递post变量
- SDUT-保留整数 -
- 让php来搞定一切!,ubuntu安装和配置php5
- 2018自然语言处理与机器学习论文发表统计
- VC 实现程序只运行一个实例,并激活已运行的程序
- 电脑故障维修:笔记本没有声音,右下角音量有红叉,“英特尔(R)智音技术OED“出现黄色叹号。
- 关于 chrome 上支付宝安全控件无法使用,以及检测不到数字证书的问题
- Flink操作——状态与容错
- BZOJ3083遥远的国度
- 【.Net实用方法总结】 整理并总结System.IO中FileInfo类及其方法介绍
- BS EN 438-4装饰用薄板材压实层压制件的分类和规范
- 量化交易 米筐 策略回测总结
- 控制工程专硕现在属于电子信息类_清华考研辅导班-2020清华大学822控制工程基础考研真题经验参考书...