一、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)音轨的数据到输出缓冲区。
  • 处理流程:
    1. 状态校验:检查音轨是否需要重初始化(如参数变更后)。
    2. 选择处理函数:根据音轨属性动态设置 hook 函数指针:
    • 无需重采样 → track__nop()(直接复制)。
    • 需重采样 → track__genericResample()(调用 AudioResampler)。
    1. 混音循环:
    for (auto &track : mActiveTracks) {
        if (track.enabled) {
            (this->*track.hook)(&track, outBuffer, frameCount); 
            // 应用音量增益并混合到输出缓冲区
        }
    }
    
    1. 格式转换:若输出格式与内部格式(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;             // 原始采样率
};

四、设计特点与性能优化

  1. 动态 Hook 机制
    根据音轨状态(是否需要重采样/格式转换)动态绑定处理函数,避免分支判断开销。
  2. 批量处理
    单次处理一帧数据(mNormalFrameCount,通常 160~1024 帧),减少函数调用次数。
  3. 内存复用
    格式转换和重采样使用预分配缓冲区,避免运行时动态内存申请。
  4. 低精度优化
    默认使用 16-bit 整型处理(mMixerFormat),平衡精度与 CPU 开销。

五、注意

  1. 线程安全
    所有函数需在 AudioFlinger::MixerThread 的线程上下文中调用(非线程安全)。
  2. 参数生效时机
    setParameter() 后需调用 invalidate() 或等待下次 process() 生效。
  3. 资源释放
    销毁音轨时需手动释放 resampler 和缓冲区。

源码路径:

  • 基类定义:frameworks/av/media/libaudioprocessing/AudioMixerBase.h
  • 核心实现:frameworks/av/media/libaudioprocessing/AudioMixerBase.cpp

此设计通过灵活的配置接口和高效的数据通路,支撑了 Android 多场景音频混合需求,从低延迟游戏音效到高保真音乐播放均可覆盖。

更多推荐