这章主要记录Android Audio系统的框架。
参考:https://source.android.google.cn/devices/audio
一、Audio Framework模块结构图
1、Application层
音频相关的应用:音乐播放器,电话,声音设置, 播放器,录音器等。
2、Frameworks Java层
Extractors:做数据分离,将audio数据分解成以frame分单位,送给decoder解码。
Codec:用于video | audio数据的解码。
AudioRecord:提供给应用,用于录音的接口。
AudioTrack:提供给应用,用于播放audio的接口。
MediaPlayer:提供给应用,用于播放音视频的接口。和AudioTrack的区别在于:AudioTrack只能播放PCM流音频。MediaPlayer关于音频方面的具体实现还是AudioTrack。
AudioService:系统服务,提供应用所需的除了播放的相关的audio业务,与之对应的Client端是AudioManager,AudioManager运行在应用进程。两者之间通过binder进行通信。
AudioManager、AudioService及AudioSystem等类提供声音控制、通道选择、音效设置等功能。
TIF:TvInputFramework的缩写,提供应用所需的TV相关业务。
3、JNI层
Java平台无关性的设计。与 android.media 关联的 JNI 代码可调用较低级别的原生代码,以访问音频硬件。
JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。
4、Frameworks native C++层
Client:
MediaCodec/AudioRecord/AudioTrack/MediaPlayer/AudioSystem, 与Frameworks Java层的相关类一一对应。
Service:
AudioFlinger和AudioPolicyService是核心系统服务,运行在AudioServer系统进程。
AudioPolicyService:Audio策略的制定者。规划各类音频流的输出路径,指定硬件设备(听筒喇叭,耳机,蓝牙等)。同时它是AudioFlinger的client端,会调用到AudioFlinger。
AudioFlinger:Audio策略的执行者。向上为上层提供访问和管理音频的接口,向下通过Hal来管理Audio硬件设备,具体涉及怎么和设备通信,如何处理等。
5、Hal层
Hardware abstract layer,与audio相关的有audio primary hal,a2dp hal和USB hal。它的存在就是将与硬件相关的接口抽象出来代上层应用,是AudioFlinger向下访问的对象,这一部分一般由厂商自己实现。桥接硬件驱动层和上层框架。
6、Driver层
AndroidO目前使用TinyAlsa音频架构。
二、Audio Framework各层代码结构图
1、应用框架
应用框架包含应用代码,该代码可使用 android.media API 与音频硬件进行互动。在内部,此代码会调用相应的 JNI 粘合类,以访问与音频硬件互动的原生代码。
2、JNI
与 android.media 关联的 JNI 代码可调用较低级别的原生代码,以访问音频硬件。JNI 位于 frameworks/base/core/jni/ 和 frameworks/base/media/jni 中。
3、native框架
native框架可提供相当于 android.media 软件包的原生软件包,从而调用 Binder IPC 代理以访问媒体服务器的特定于音频的服务。原生框架代码位于 frameworks/av/media/libmedia 中。
4、Binder IPC
Binder IPC 代理用于促进跨越进程边界的通信。代理位于 frameworks/av/media/libmedia 中,并以字母“I”开头。
5、媒体服务器
媒体服务器包含音频服务,这些音频服务是与您的 HAL 实现进行互动的实际代码。媒体服务器位于 frameworks/av/services/audioflinger 中。
6、HAL
HAL 定义了由音频服务调用且您必须实现以确保音频硬件功能正常运行的标准接口。音频 HAL 接口位于 hardware/libhardware/include/hardware 中。参阅 audio.h。
7、内核驱动程序。
音频驱动程序可与您的硬件和 HAL 实现进行互动。您可以使用高级 Linux 声音体系 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。
注意:如果您使用 ALSA,我们建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。
三、总结。
记录这章之后,对Audio Frameworks的框架更为的熟悉了。