音:Android音频系统之音频框架
Android音频系统之音频框架
2013年04月13日 11:58:12 林学森 阅读数:36305更多
https://blog.csdn.net/xuesen_lin/article/details/8796492#commentsedit
个人分类: Android专栏
所属专栏: Thinking In Android
1.1 音频框架
转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492
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 ALSA音频系统架构分析(1)----从Loopback了解Audio
/*********************************** * Author:刘江明 * Environment:MTK Android 6.0 * Date:2017年05月25日 * ...
- Android音频系统之四AudioPolicy
4.1 AudioPolicy的诞生 AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加 ...
- Android音频系统之AudioPolicyService
地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...
- Android 音频系统:从 AudioTrack 到 AudioFlinger(全)
Android 音频框架概述 Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出.音频流的控制.音频设备的管理.音量调节等,主要包括如下部分: Audio App ...
- android音频系统之AudioTrack的使用
今天,简单讲讲 AudioTrack的使用. 1.Android AudioTrack简介 在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是 ...
- android 音频配置文件,Android音频系统
1 分析思路 Thread如何创建? AudioPolicyService是策略的制定者,AudioFlinger是策略的执行者, 所以: AudioPolicyService根据配置文件使唤Audi ...
- android音频系统(4):AudioService之音量管理
前言:AudioService这个系统服务包含或者使用了几乎所有与音频有关的内容,AudioService是音频系统在java层的大本营: android音频系统,分为两个部分:数据流和策略: 数据流 ...
- 08.音频系统:第002节_Android音频系统框架简述
该小节我们来讲解Android音频系统框架,了解了框架之后,我们才能更加容易的去查看以及分析源码,有了框架才不会遗失方向. 下面是一个大框图,该小节我们将围绕下面的图示进行讲解: 以前总提到,写应用程 ...
最新文章
- exe编辑器_windows下的EXE文件大揭密
- easyui radio 取值和赋值
- js时间戳转成日期格式
- Git 别名(分布式版本控制系统)
- python打开摄像头cmd_Python调用shell cmd方法代码示例解析
- jaeger client java_Uber工程团队的开源分布式追踪系统Jaeger(java实现)
- oracle存储一个数字格式,Oracle根本数据类型存储格式研究(二)—数字类型
- 手把手带你深入解析静态分派 动态分派原理 | 原力计划
- Bootstarp4 按钮
- c语言连续生成不同随机数_【转】关于C语言生成不重复的随机数
- Python 脚本查询 ip纯真数据库
- 通信接口——RS-232与RS-422及RS-485三者之间的特性与区别
- 易读文库下载器1.2版发布
- 深度点击率预估模型的One-Epoch过拟合现象剖析
- 基于Boost.Asio的异步编程
- steam饥荒服务器为什么显示未响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...
- Windows 10用户档案无法加载的解决方法
- 方舟手游非官方服务器修改器,方舟非官方服务器作弊码 | 手游网游页游攻略大全...
- python中rest是什么意思,Python中的REST调用
- 控制器模式_前控制器模式简介,第1部分
热门文章
- Binutils - c++filt工具
- 微信公众号迁移及公证书快速办理流程
- 数据流-移动超平面(HyperPlane)构造
- python选择题总结
- 计算机网络中属于资源子网的是,属于计算机网络的资源子网
- 计算机专业建设会议纪要,智能控制教研室会议纪要6号
- 搭建kettle 源码工程报[ui/spoon.xul]找不到错误的解决方案
- 手机游戏后台服务整体架构
- 苹果无线网服务器改什么速度快,iPhone网速慢怎么办?苹果手机如何配置DNS?
- php 伪静态是什么意思,php伪静态的写法是什么