Audio 相关代码分析

て烟熏妆下的殇ゞ 提交于 2020-03-06 02:54:06
一、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() 函数来获取接口。
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!