• Audio 相关代码分析


    一、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() 函数来获取接口。
     
  • 相关阅读:
    webpack初识
    Vue+ElementUi项目实现表格-单行拖拽
    promise/async与await 的执行顺序梳理
    MDN社区
    angularjs中的异步操作
    javascript中的字符串和数组的互转
    angularjs的练习题
    angularjs基础知识
    开发的两种方式
    ASP.NET中的HttpClient发送请求
  • 原文地址:https://www.cnblogs.com/simonshi/p/1967388.html
Copyright © 2020-2023  润新知