android 之 AudioMixerBase
·
一、AudioMixerBase 类概述
AudioMixerBase 是 Android 音频混音器的基类,继承自 AudioMixerOps 接口。它负责管理多路音频流的混音参数、格式转换及数据处理流程,是 AudioMixer 的直接父类。其核心职责包括:
- 音轨管理:支持多路音频输入(Track)的注册与状态维护。
- 参数配置:动态设置声道、采样率、音量等混音参数。
- 数据处理:执行混音、重采样、格式转换等操作。
- 资源分配:管理音频缓冲区和内存资源。
二、核心函数详解
1. create() - 创建音轨
status_t AudioMixerBase::create(int name, audio_channel_mask_t channelMask,
audio_format_t format, int sessionId)
- 功能:注册新音轨并初始化参数。
- 参数:
name:音轨唯一标识(由getTrackName()分配)。channelMask:声道掩码(如AUDIO_CHANNEL_OUT_STEREO)。format:音频格式(如AUDIO_FORMAT_PCM_16_BIT)。sessionId:音频会话 ID(用于音效绑定)。
- 关键逻辑:
- 校验声道掩码有效性(
isValidChannelMask())和格式(isValidFormat())。 - 初始化
Track结构体:t->channelCount = audio_channel_count_from_out_mask(channelMask); t->mFormat = format; // 原始音频格式 t->mMixerFormat = AUDIO_FORMAT_PCM_16_BIT; // 混音器内部格式 t->sampleRate = mSampleRate; // 目标采样率(通常为 48kHz) t->hook = NULL; // 数据处理函数指针(后续动态设置) - 计算帧大小:
t->mInputFrameSize = audio_bytes_per_frame(t->channelCount, t->mFormat)。
- 校验声道掩码有效性(
2. setParameter() - 动态配置音轨参数
void AudioMixerBase::setParameter(int name, int target, int param, void *value)
- 功能:修改音轨属性(声道、格式、音量等)。
- 参数:
target:操作目标(TRACK、VOLUME、RESAMPLE)。param:具体参数类型(如CHANNEL_MASK、FORMAT)。value:参数值指针。
- 常见场景:
- 声道修改(
CHANNEL_MASK):setChannelMasks(name, newChannelMask, mixerChannelMask); // 更新声道配置 invalidate(); // 标记状态失效,触发重初始化 - 格式修改(
FORMAT):if (track->mFormat != newFormat) { track->mFormat = newFormat; track->prepareForReformat(); // 准备格式转换缓冲区 } - 音量设置(
VOLUME0/VOLUME1):track->volume[0] = leftVolume; // 左声道增益 track->volume[1] = rightVolume; // 右声道增益 track->prevVolume[0] = leftVolume << 16; // 用于渐变计算
- 声道修改(
3. process() - 执行混音处理
void AudioMixerBase::process()
- 功能:混合所有启用(enabled)音轨的数据到输出缓冲区。
- 处理流程:
- 状态校验:检查音轨是否需要重初始化(如参数变更后)。
- 选择处理函数:根据音轨属性动态设置
hook函数指针:
- 无需重采样 →
track__nop()(直接复制)。 - 需重采样 →
track__genericResample()(调用AudioResampler)。
- 混音循环:
for (auto &track : mActiveTracks) { if (track.enabled) { (this->*track.hook)(&track, outBuffer, frameCount); // 应用音量增益并混合到输出缓冲区 } }- 格式转换:若输出格式与内部格式(
mMixerFormat)不一致,执行格式转换。
4. enable() - 启用/禁用音轨
void AudioMixerBase::enable(int name)
- 功能:激活音轨参与混音。
- 逻辑:
track.enabled = true; invalidateState(1 << name); // 标记状态变更 - 禁用音轨(
disable())逻辑类似,但会跳过数据处理。
5. 重采样与格式转换
- 重采样触发:当音轨采样率(
trackSampleRate)≠ 设备采样率(devSampleRate,通常为 48kHz)时:mResampler = createResampler(trackSampleRate, devSampleRate); track.hook = &track__genericResample; // 绑定重采样函数 - 格式转换:在
process()中调用reformatBuffer()将音轨数据统一转为mMixerFormat(如 16-bit PCM)。
三、关键数据结构
Track 结构体(简化版)
struct Track {
bool enabled; // 是否启用
audio_format_t mFormat; // 原始数据格式
audio_format_t mMixerFormat;// 混音器内部格式
int channelCount; // 声道数
int32_t volume[2]; // 左右声道增益(Q4.27 定点数)
void* mainBuffer; // 原始数据缓冲区
hook_t hook; // 数据处理函数指针
// 重采样相关
AudioResampler* resampler;
int sampleRate; // 原始采样率
};
四、设计特点与性能优化
- 动态 Hook 机制
根据音轨状态(是否需要重采样/格式转换)动态绑定处理函数,避免分支判断开销。 - 批量处理
单次处理一帧数据(mNormalFrameCount,通常 160~1024 帧),减少函数调用次数。 - 内存复用
格式转换和重采样使用预分配缓冲区,避免运行时动态内存申请。 - 低精度优化
默认使用 16-bit 整型处理(mMixerFormat),平衡精度与 CPU 开销。
五、注意
- 线程安全
所有函数需在AudioFlinger::MixerThread的线程上下文中调用(非线程安全)。 - 参数生效时机
setParameter()后需调用invalidate()或等待下次process()生效。 - 资源释放
销毁音轨时需手动释放resampler和缓冲区。
源码路径:
- 基类定义:
frameworks/av/media/libaudioprocessing/AudioMixerBase.h- 核心实现:
frameworks/av/media/libaudioprocessing/AudioMixerBase.cpp
此设计通过灵活的配置接口和高效的数据通路,支撑了 Android 多场景音频混合需求,从低延迟游戏音效到高保真音乐播放均可覆盖。
更多推荐


所有评论(0)