Audio的系统结构

时间:2021-07-14 15:10:56

 摘要:Audio系统负责Android中的PCM数据的录制输入流和播放输出流的传输和控制,以及音频设备的管理和设置。这里主要介绍播放和录制环节在各个层次的内容,整个结构层次分明,包括了java接口层,JNI层,本地框架层,audio服务层,硬件抽象层等5层。它的结构图如下
Audio的系统结构                                                       图1-1 Audio系统结构

  一、java接口层

    AudioManager:音频管理对外的接口,提供了音量和ringtone模式的管理,由getSystemService(Context.AUDIO_SERVICE)返回。
    Audioservice:是一个非常重要的java层的系统服务,所有的用户发起的调用都是由它往底层转发的。
    AudioSystem:提供管理native接口,只时提供在media包的AudioService内部使用,不对用户直接提供接口。
    AudioTrack:提供用户从java层直接输出pcm数据的接口write函数,以及部分播放控制函数。
    AudioRecord:提供用户在java层直接从外部获取pcm数据的接口read函数。
    下面贴一段边录边播放的例子代码说明这些函数的使用

Audio的系统结构View Code

    这些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系统的系统结构和源码分布有一个清楚的理解。