摘要:Audio系统负责Android中的PCM数据的录制输入流和播放输出流的传输和控制,以及音频设备的管理和设置。这里主要介绍播放和录制环节在各个层次的内容,整个结构层次分明,包括了java接口层,JNI层,本地框架层,audio服务层,硬件抽象层等5层。它的结构图如下 图1-1 Audio系统结构
一、java接口层
AudioManager:音频管理对外的接口,提供了音量和ringtone模式的管理,由getSystemService(Context.AUDIO_SERVICE)返回。
Audioservice:是一个非常重要的java层的系统服务,所有的用户发起的调用都是由它往底层转发的。
AudioSystem:提供管理native接口,只时提供在media包的AudioService内部使用,不对用户直接提供接口。
AudioTrack:提供用户从java层直接输出pcm数据的接口write函数,以及部分播放控制函数。
AudioRecord:提供用户在java层直接从外部获取pcm数据的接口read函数。
下面贴一段边录边播放的例子代码说明这些函数的使用

这些java class接口类在android.media包中,源码目录:frameworks/base/media/java/android/media。这些接口为使用media包的用户提供了音量和路由设置,播放和录制的pcm数据的接口。
二、JNI层
(android_media_AudioSystem, android_audio_AudioTrack, android_audio_AudioRecord),在libandroid_runtime.so包中
三、本地框架层
AudioSystem:media库提供给上层的audio管理的接口,它的实现主要在audiopolicymanger和audioflinger中
AudioTrack:放音部分对上层的接口,stagefright部分也是调用该接口创建和控制playback track
AudioRecord:录音部分对上层的接口,stagefright部分也是调用该接口创建一路record track
IAudioTrack, IAudioRecord, IAudioFlinger:这三个是声明需要底层audioflinger实现的接口函数
这些c接口类在libmedia.so库中,源码目录:frameworks/av/media/libmedia
四、audio服务层
AudioFlinger:这一层主要实现了track的创建,Android层共享内存的分配,多路混音等
五、硬件抽象层
AudioHardwareInterface:这一层需要根据不同的硬件由厂商自己实现,如Primary,Usb,spdif,a2dp等,每一种硬件设备需要继承audioHardwareInterface,实现一个控制硬件so库。主要的类有AudioStreamOut和AudioStreamIn分别是audio输出环节和输入环节,负责write数据流到硬件和从硬件read数据流。
六、总结
通过对各层一个概括性的介绍,对Audio系统的系统结构和源码分布有一个清楚的理解。