Android音频系列(10)-AudioFlinger代码解析

目录

[1. 简述](#1. 简述)

[2. 初始化](#2. 初始化)

3.对外接口

[4. 内部核心类](#4. 内部核心类)

[4.1 AudioFlinger 类](#4.1 AudioFlinger 类)

[4.2 Thread 类体系](#4.2 Thread 类体系)

[4.3 Track 类体系](#4.3 Track 类体系)

[5. 核心流程分析](#5. 核心流程分析)

[5.1 创建 Track (createTrack)](#5.1 创建 Track (createTrack))

[5.2 回放线程循环 (MixerThread::threadLoop)](#5.2 回放线程循环 (MixerThread::threadLoop))

[5.3 序列图 (UML)](#5.3 序列图 (UML))

[6. 总结](#6. 总结)


1. 简述

AudioFlinger,简称AF,它 是 Android 音频系统的核心服务,承载着音频混(Mixing)、 音频路由(Routing)以及管理音频输出输入流(Stream)等关键职责,是承上启下的关键角色。它位于 Native 层,作为 AudioSystem 的一部分,向上接收来自 Application/ Framework (如 AudioTrack, AudioRecord) 的请求,向下通过 Audio HAL (Hardware Abstraction Layer) 驱动硬件,如图1所示:

  • 向上:为应用层(如 AudioTrack/AudioRecord)提供统一的音频数据读写接口;
  • 向下:通过 HAL 层(Audio HAL)与底层硬件(声卡、DSP、Codec)交互;
  • 横向:与 AudioPolicyService(APS) 协同完成路由决策、设备切换、音量策略等。

图1 AudioFlinger在音频系统中位置

2. 初始化

AudioFlinger与AudioPolicyService同在main_audioserver.cpp被初始化,是audioserver进程的一部分,下面是初始化代码:

cpp 复制代码
int main(int argc __unused, char argv)
{
      ......
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();
    AudioPolicyService::instantiate();
       ......
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

3.对外接口

AudioFlinger 属于 Server 端,对外的client和HAL有:

Client: AudioTrack, AudioRecord, AudioSystem, AudioPolicyService

Server: AudioFlinger (Binder Service)

HAL: StreamHalInterface, AudioHwDevice

AF对上层提供Binder服务,从 Android 12/13 开始,为了将Binder服务与具体业务实现分离,通过 Delegate 接口定义核心功能契约,所以AudioFlinger继承于IAudioFlinger 接口,而不是直接继承于BnAudioFlingerService,如图2所示:

图2 AudioFlinger中增加Delegate代理

4. 内部核心类

AudioFlinger 内部主要由几种核心组件构成:

  • Binder Interface: IAudioFlinger 接口实现,处理 IPC 调用。
  • Threads: 管理不同输出/输入流的线程 (PlayBackThread, RecordThread)。
  • Tracks: 代表一个音频流的数据源 (Track, RecordTrack)。
  • Effects: 音频效果管理。
  • PatchPanel: 处理音频补丁(Audio Patch),实现复杂的路由功能。

AudioFlinger 的代码结构主要围绕 AudioFlinger, Thread, Track 三个层级展开。

4.1 AudioFlinger 类

AudioFlinger 是整个服务的入口,继承自 BnAudioFlinger,实现了 IAudioFlinger 接口。

负责创建和管理 PlaybackThread 和 RecordThread。

负责响应 createTrack、openOutput 等系统调用。

图3

4.2 Thread 类体系

如图3所示,ThreadBase 是所有音频工作线程的基类。

PlaybackThread: 负责音频播放。

MixerThread: 最常用的回放线程,负责将多个 Track 的音频数据混合(Mix)后写入 HAL。支持 FastMixer 以实现低延迟播放。

DirectOutputThread: 直接输出线程,不经过软件混音,通常用于 HDMI 透传或高保真音乐播放。

OffloadThread: 卸载线程,将解码和混音工作交给 DSP/硬件处理。

MmapThread: 配合 AAudio 使用,实现 mmap 方式的低延迟数据传输。

RecordThread: 负责音频录制,从 HAL 读取数据并分发给 RecordTrack。

4.3 Track 类体系

TrackBase 是音频流数据的抽象基类。

Track: 对应 AudioTrack,存在于 PlaybackThread 中。它管理着共享内存(SharedBuffer),Client 端往里写数据,Thread 从里读数据。

RecordTrack: 对应 AudioRecord,存在于 RecordThread 中。

图4 AudioTrack与AudioFlinger里的track

图5 AudioRecord与AudioFlinger里的Track

5. 核心流程分析

5.1 创建 Track (createTrack)

这是播放流程的起点。

  1. 客户端 AudioTrack 调用 AudioSystem::getOutputForAttr。

  2. AudioPolicyService 根据策略(路由、采样率等)返回一个 Output Handle(对应 AudioFlinger 中的一个 Thread ID)。

  3. 客户端调用 AudioFlinger::createTrack,传入 Output Handle。

  4. AudioFlinger 根据 Handle 找到对应的 PlaybackThread。

  5. 调用 PlaybackThread::createTrack_l 创建服务端 Track 对象。

  6. 返回 IAudioTrack 句柄给客户端。

5.2 回放线程循环 (MixerThread::threadLoop)

MixerThread 运行一个死循环 threadLoop:

  1. processConfigEvents: 处理配置变更(如采样率变化、路由变化)。

  2. prepareTracks_l: 遍历所有 Track。

检查 Track 状态(Active/Stopped/Paused)。

获取 Track 的 Buffer 数据。

判断是否需要混音。

  1. threadLoop_mix: 使用 AudioMixer 将所有 Active Track 的数据混合到一个临时的 Sink Buffer 中。

  2. threadLoop_write: 将混合后的数据写入 AudioStreamOut (HAL)。

对于低延迟场景,MixerThread 会创建 FastMixer 线程。普通 Track 由 MixerThread 处理,设置了 FAST 标志的 Track 会被 FastMixer 抢占式调度处理,直接写入 HAL 或通过 Pipe 写入。

5.3 序列图 (UML)

以下展示了 createTrack 和 write (播放) 的简要时序。

图6 createtrack时序

6. 总结

AudioFlinger 是 Android 音频架构中承上启下的枢纽。通过多线程模型(Mixer, Direct, Record等),它高效地管理着系统中的并发音频流。通过共享内存机制,它实现了 Client 与 Server 间的高效数据传输。理解 AudioFlinger 的关键在于掌握 ThreadLoop 的调度机制以及 Track 的生命周期管理。

相关推荐
Minilinux20181 天前
Android音频系列(09)-AudioPolicyManager代码解析
android·音视频·apm·audiopolicy·音频策略
Everbrilliant893 个月前
FFmpeg解码音频数据AudioTrack/OpenSL播放
ffmpeg·音视频·audiotrack·opensl·ffmpeg音频解码播放·decodethread·opensl播放与解码同步
瘦瘦的追梦洋10 个月前
AudioFlinger与AudioPoliceManager初始化流程
android·apm·audioflinger
Windra62 年前
RK3588 Android12音频驱动分析全网最全
pcm·kernel·alsa·audiotrack·audiorecord·audioflinger
Kbattery2 年前
Android 11 AudioPolicyService 启动流程
android·音频·audio·audiopolicy