概述
Audio音频子系统 是Android Framework 的一个重要的子系统之一,也是最复杂的子系统之一,其在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。一个完整的Android音频系统架构如下图所示:
audio 框架分层
application层
应用层,调用音频服务的app或设置,如:音视频播放器、拨打电话、录音/录视频、音量设置等。
Framework层
Framework层包含java与c++,通过jni机制进行相互调用,主要分为以下三层:
Framework java
Framework java层提供APP调用的java接口,该层代码位置**【frameworks/base/media/java/android/media】**,主要包含:
- MediaPlayer.java:提供给播放APP调用的接口,支持audio各种格式的音频文件;
- MediaRecorder.java:提供给音频录音APP调用的接口;
- AudioTrack.java: 提供给音频播放APP调用的接口,这个只能用来播放wav格式的音频文件;
- AudioRecorder.java:负责录音数据的采集,属 Android 应用框架API类;
- AudioManager.java: 提供声音控制;
- AudioService.java: 通道选择;
- AudioSystem: 音效设置;
其中MediaPlayer、MediaRecorder对比AudioTrack、AudioRecorder功能类似,功能强大且易于使用,但是高度封装,不适合深入开发。
jni
Audio JNI层是音频应用框架和本地框架的桥梁,通过JNI层才能调用到C++层代码,其相当于一座桥梁使得 java函数接口与c++函数接口一一对应,其对应的目录为**【framewoks/base/core/jni 与 frameworks/base/core/jni】**
- android_media_MediaPlayer.cpp
- android_media_AudioRecord.cpp
- android_media_AudioTrack.cpp
- android_media_AudioSystem.cpp
Native Framework
Native Framework由C++语言编写,通过jni转换供Framework java层调用,其分为客户端与服务端部分,分别对应Framework java层中播放、录音接口与声音控制、设置等java接口。
客户端:【frameworks/av/media/libaudioclient】
- AudioRecord.cpp:负责录音数据的采集,属 Android 本地框架API类
- AudioTrack.cpp:负责回放数据的输出,属 Android 本地框架API类;
- AudioSystem.cpp:负责音频事务的综合管理,属 Android 本地框架API类
服务端:【frameworks/av/services/audioflinger】编译后成为libaudioflinger库,运行在AudioServer系统进程
- AudioFlinger.cpp
- AudioHwDevice.cpp
- AudioStreamOut.cpp
HAL层
HAL层是AudioFlinger向下访问的对象,厂商会在这一层实现自己的接口层,桥接硬件驱动和上层框架,形成的文件会编译成audio.primary.,audio.a2dp.等so库文件供音频模块加载。
- HAL接口层:【hardware/interfaces/audio】
- HAL实现层:【hardware/libhardware/modules/audio】