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