1. AudioFlinger混音机制概述
在Android系统中,音频子系统负责处理所有音频相关的任务,而AudioFlinger作为其核心组件,承担着音频混音和路由的重任。想象一下,当你在手机上同时播放音乐、接收通知音效和进行语音通话时,这些不同的音频流是如何和谐共处的?这就是AudioFlinger混音机制的魔力所在。
AudioFlinger的混音机制可以类比为一个高效的交通调度系统:多个音频流(Track)就像不同方向驶来的车辆,而混音器(Mixer)则是那个精准指挥的交通枢纽,确保每路音频都能按时、按需到达目的地(音频硬件)。这个过程中涉及复杂的线程调度、数据同步和信号处理,是Android音频系统中最精妙的部分。
提示:本文基于Android 15 AOSP源码分析,关键代码路径包括frameworks/av/services/audioflinger/Threads.cpp、Tracks.cpp、FastMixer.cpp和AudioMixer.cpp。
2. PlaybackThread的四种类型
2.1 MixerThread:通用混音线程
MixerThread是AudioFlinger中最常用的线程类型,负责处理大多数音频混音场景。它的核心工作原理可以概括为:
- 接收多个不同采样率、格式的音频流(Track)
- 通过重采样统一为相同采样率
- 使用AudioMixer进行多路PCM数据混合
- 将混合后的数据写入音频硬件(HAL)
MixerThread内部维护着一个活跃Track列表,每个音频周期(通常10-20ms)都会执行以下操作:
cpp复制// 伪代码展示MixerThread的核心循环
void MixerThread::threadLoop() {
while (!exitPending()) {
// 1. 收集所有活跃Track的音频数据
for (auto& track : mActiveTracks) {
track->getNextBuffer(&buffer);
mAudioMixer->addBuffer(track->id(), buffer);
}
// 2. 执行混音操作
mAudioMixer->process();
// 3. 写入音频硬件
mOutput->write(mMixBuffer, mFrameCount);
// 4. 更新Track状态
updateTrackStates();
}
}
MixerTh
