3.3 KiB
3.3 KiB
AudioMixer
命名空间: XCEngine::Audio
类型: class
头文件: XCEngine/Audio/AudioMixer.h
描述: 表示一个基础 mixer 容器,公开了总音量、静音、效果链、输出 mixer 和 3D 参数等混音控制接口。
角色概述
从 API 形状看,AudioMixer 明显是为更完整的音频路由系统预留的核心类型。它的设计方向和 Unity AudioMixer 概念相似:
- 可以挂效果器
- 可以连接到另一个 output mixer
- 可以保存 3D 参数和每声道音量
但按当前实现,它还处在比较早期的基础阶段。
当前实现行为
1. 真实生效的部分很少
ProcessAudio(float* buffer, uint32 sampleCount, uint32 channels) 当前实际做的事情只有:
- 如果静音,则等效音量为
0 - 如果总音量接近 0,则直接返回
- 否则对整个 buffer 乘以一个全局音量系数
也就是说,当前 mixer 的实际生效能力基本只有:
- 总音量
- 总静音
2. 效果链目前只存,不处理
AddEffect() / RemoveEffect() / ClearEffects() 会维护 m_effects 容器,但 ProcessAudio() 当前并不会遍历效果器并调用它们的 ProcessAudio()。
这意味着效果链 API 已经有了,但主处理逻辑还没接上。
3. 其他配置当前主要是存值
以下状态当前也只是被保存下来:
m_outputMixerm_3DParamsm_channelVolumes
按当前源码,没有看到它们在 ProcessAudio() 里被真正使用。
所有权语义
AudioMixer不拥有IAudioEffect*AddEffect()只保存裸指针ClearEffects()只清空容器,不负责销毁 effect 实例
因此,效果器实例的生命周期需要由外部系统管理。
设计理解
这类设计在商用引擎里通常是合理的:先把 mixer、route、effect slot 的抽象搭起来,再逐步接线具体 DSP 逻辑。当前版本的问题不在于接口方向,而在于“多数字段已经存在,但还没被处理路径消费”。
线程语义
- 当前实现没有内部加锁。
- 效果链和参数更新默认应按主线程配置路径使用。
当前实现限制
- 效果器链当前不会被执行。
outputMixer当前不会形成真正的级联混音图。Audio3DParams当前不会直接影响 mixer 输出。- 每声道音量只被存储,没有应用到样本处理。
ChannelVolume结构里的mute字段当前既无 public setter,也无处理路径消费。- 没有发现该类型的直接单元测试。
相关方法
- Constructor
- Destructor
- SetVolume
- GetVolume
- SetMute
- IsMute
- AddEffect
- RemoveEffect
- ClearEffects
- ProcessAudio
- SetOutputMixer
- GetOutputMixer
- Set3DParams
- Get3DParams
- SetChannelVolume
- GetChannelVolume