Android中的音频硬件抽象层(HAL)连接android.media中高层的,特定音频框架API到底层的音频驱动和硬件
下列图表描述了音频功能是如何实现的,以及相关实现的相关源代码。
应用框架(Application framework)
在应用框架层的是App代码,它利用android.media的API来和audio硬件交互,内部该代码调用相应的JNI胶水类来访问本地代码,以与音频硬件进行交互。
JNI(Java Native Interface)
与android.media相关的JNI代码在frameworks/base/core/jni和frameworks/base/media/jni目录中,该代码调用底层的本地代码以获得对音频硬件的访问。
本地框架(Native framework)
本地框架定义在frameworks/av/media/libmedia,提供一个等效于android.media包的本地代码。本地框架调用Binder IPC代理以获取对媒体服务器中特定音频服务的访问。
Binder IPC
The Binder IPC代理完成进程之间的通信,该代码定义在frameworks/av/media/libmedia目录中,其由字母“I”开头
媒体服务器(Media Server)
媒体服务器中的audio service,定义在frameworks/av/services/audioflinger,该代码才是真正与HAL实现交互的代码。
硬件抽象层(HAL)
HAL定义了audio services调用的标准接口,但同时必须正确地实现音频硬件功能,音频硬件抽象层接口定义在hardware/libhardware/include/hardware。更多细节参考audio.h
内核驱动(Kernel Driver)
音频驱动与硬件和HAL实现进行交互,可以选择使用ALSA,OSS或定义你自己的驱动。HAL是不知道底层驱动实现细节的。
注:若选择了ALSA,推荐使用external/tinyalsa作为驱动的用户部分。
参看audio部分剩下的部分用于实现,以改善性能。
http://source.android.com/devices/audio.html