Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出、音频流的控制、音频设备的管理、音量调节等,主要包括如下部分:

  • Audio Application Framework:音频应用框架
    AudioTrack:负责回放数据的输出,属 Android 应用框架 API 类
    AudioRecord:负责录音数据的采集,属 Android 应用框架 API 类
    AudioSystem: 负责音频事务的综合管理,属 Android 应用框架 API 类
  • Audio Native Framework:音频本地框架
    AudioTrack:负责回放数据的输出,属 Android 本地框架 API 类
    AudioRecord:负责录音数据的采集,属 Android 本地框架 API 类
    AudioSystem: 负责音频事务的综合管理,属 Android 本地框架 API 类
  • Audio Services:音频服务
    AudioPolicyService:音频策略的制定者,负责音频设备切换的策略抉择、音量调节策略等
    AudioFlinger:音频策略的执行者,负责输入输出流设备的管理及音频流数据的处理传输
  • Audio HAL:音频硬件抽象层,负责与音频硬件设备的交互,由 AudioFlinger 直接调用

与 Audio 强相关的有 MultiMedia,MultiMedia 负责音视频的编解码,MultiMedia 将解码后的数据通过 AudioTrack 输出,而 AudioRecord 采集的录音数据交由 MultiMedia 进行编码

AudioTrack API 概述

播放声音可以使用 MediaPlayer 和 AudioTrack,两者都提供 Java API 给应用开发者使用。两者的差别在于:MediaPlayer 可以播放多种格式的音源,如 mp3、flac、wma、ogg、wav 等,而 AudioTrack 只能播放解码后的 PCM 数据流。从上面 Android 音频系统架构图来看:MediaPlayer 在 Native 层会创建对应的音频解码器和一个 AudioTrack,解码后的数据交由 AudioTrack 输出。所以 MediaPlayer 的应用场景更广,一般情况下使用它也更方便;只有一些对声音时延要求非常苛刻的应用场景才需要用到 AudioTrack

AudioFlinger 概述

AudioPolicyService 与 AudioFlinger 是 Android 音频系统的两大基本服务。前者是音频系统策略的制定者,负责音频设备切换的策略抉择、音量调节策略等;后者是音频系统策略的执行者,负责音频流设备的管理及音频流数据的处理传输,所以 AudioFlinger 也被认为是 Android 音频系统的引擎。

  • AudioFlinger 服务启动

从 Android 7.0 开始,AudioFlinger 在系统启动时由 audioserver 加载(之前版本由 mediaserver 加载),详见 frameworks/av/media/audioserver/main_audioserver.cpp:

Application 层
对应着具体的 app 软件,其主要是使用 Framwork 层提供的接口来实现具体的auido 实现。
后面,我们会单独写一章来描述如何写一个音乐播放器 apk 《理解 Audio 音频系统六 之 Audio音乐播放器编写》。

Framework 层 / Libraries 库文件
在Framework层中,
主要 AudioTrack、AudioRecord、MediaRecorder、MediaPlayer 这四分别是可以对 Audio 进行播放 或者 采集。
AudioSystem 、AudioManager 主要是对音点策略的管理

Hal 层
主要包含 AudioFlinger,AudioPolicyService 。
AudioPolicyService是策略的制定者及设定相关的参数,AudioFlinger 负责根据 AudioPolicy设定的策略进行执行。
所以,我们先来学习的就是 AudioPolicyService ,后续会更新文章:《理解 Audio 音频系统二 之 AudioPolicyService》
既然AudioFliner 是执行者,在懂了 AudioPolicy 后再学,可以后相对好理解一些:《理解 Audio 音频系统三 之 AudioFlinger》

Tinyalsa 层
在Tinyalsa 中主要是包含了一些可执行程序,如 tinymix,tinyplay,tinycap