一、Audio系统综述
Audio系统主要分成如下几个层次:
(1)media库提供的Audio系统的上层接口;
(2)AudioFlinger作为Audio系统的中间层;
(3)Audio的硬件抽象层提供底层支持;
(4)Audio接口通过JNI和Java框架提供给上层。
Audio系统的各个层次接口主要提供了两方面功能:放音(Track)和录音(Recorder)。
在Android的Audio系统中,无论上层还是下层,都使用一个管理类和输出输入两个类来表示整个Audio
系统,输出输入两个类负责数据通道。
二、Audio框架分析
1、Audio的Java部分
代码路径:frameworks/base/media/java/android/media
与Audio相关的Java包是android.media,主要包含AudioManager和Audio系统的几个类。
2、Audio的JNI部分
代码路径:frameworks/base/core/jni
生成库libandroid_runtime.so,Audio的JNI是其中的一个部分。
3、Audio的框架部分
头文件路径:frameworks/base/include/media/
源代码路径:frameworks/base/media/libmedia/
Audio本地框架是media库的一部分,本部分内容被编译成库libmedia.so,
提供Audio部分的接口(包括基于Binder的IPC机制)。
Audio系统的核心框架在media库中提供,对上面主要实现AudioSystem、AudioTrack和
AudioRecorder三个类。提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和
IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和 AudioRecorder分别通
过调用IAudioTrack和IAudioRecorder来实现。
Audio系统的头文件在frameworks/base/include/media/目录中,主要的头文件如下:
AudioSystem.h:media库的Audio部分对上层的总管接口;
IAudioFlinger.h:需要下层实现的总管接口;
AudioTrack.h:放音部分对上接口;
IAudioTrack.h:放音部分需要下层实现的接口;
AudioRecorder.h:录音部分对上接口;
IAudioRecorder.h:录音部分需要下层实现的接口。
IaudioFlinger.h、 IAudioTrack.h和IAudioRecorder.h这三个接口通过下层的继承来实现
(即AudioFlinger)。AudioFlinger.h、AudioTrack.h和AudioRecorder.h是对上层提供的
接口,它们既供本地程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接
口。
4、Audio Flinger
代码路径:frameworks/base/libs/audioflinger
这部分内容被编译成库libaudioflinger.so,它是Audio系统的本地服务部分。
AudioFlinger是Audio系统的中间层,在系统中起到服务作用,它主要作为libmedia提供的
Audio部分接口的实现。AudioFlinger的核心文件是AudioFlinger.h和AudioFlinger.cpp,提
供了类AudioFlinger,这个类是一个IAudioFlinger的实现。AudioFlinger主要提供
createTrack()创建音频的输出设备IAudioTrack,openRecord()创建音频的输入设备
IAudioRecord。另外包含的就是一个get/set接口,用于控制。
从工作的角度看,AudioFlinger在初始化之后,首先获得放音设备,然后为混音器(Mixer)建立
线程,接着建立放音设备线程,在线程中获得放音设备。
5、Audio的硬件抽象层接口
头文件路径:hardware/libhardware_legacy/include/hardware/
其中主要的文件为:AudioHardwareBase.h和AudioHardwareInterface.h。
Audio硬件抽象层的实现在各个系统中可能是不同的,需要使用代码去继承相应的类并实现它们,作
为Android系统本地框架层和驱动程序接口。Audio的硬件抽象层是AudioFlinger和Audio硬件的
接口,在各个系统的移植过程中可以有不同的实现方式。Audio硬件抽象层可以基于Linux标准的
ALSA或OSS音频驱动实现,也可以基于私有的Audio驱动接口来实现。
在AudioHardwareInterface.h中定义了类:AudioStreamOut、AudioStreamIn和
AudioHardwareInterface。
在这个AudioHardwareInterface接口中,使用openOutputStream()和openInputStream()函
数分别获取AudioStreamOut和AudioStreamIn两个类,它们作为音频输入/输出设备来使用。此
外,AudioHardwareInterface.h定义了C语言的接口来获取一个AudioHardware Interface类
型的指针。
extern "C" AudioHardwareInterface* createAudioHardware(void);
如果实现一个 Android的硬件抽象层,则需要实现AudioHardwareInterface、
AudioStream Out和AudioStreamIn三个类,将代码编译成动态库libauido.so。
AudioFlinger会连接这个动态库,并调用其中的createAudioHardware() 函数来获取接口。