音频框架总览 (overview)
XSTAR 音频框架是一套轻量、模块化、JSON 驱动的嵌 入式音频处理子系统,位于 xstar/kernel/audio/。它以经典的 Source → Filter → Sink 管道模型为核心,配合插件化的效果引擎与混音器,可支撑从文件播放、麦克风采集、混音、频谱分析到 AFSK 调制解调等多种音频应用。
框架定位
| 维度 | 说明 |
|---|---|
| 数据格式 | 内部统一使用 float 交错采样 (audio_frame_t) |
| 配置方式 | JSON 字符串驱动效果链构建 |
| 扩展模式 | 插件化注册 (register_audio_effect()),自动 initcall 加载 |
| 抽象层级 | kernel/audio 提供处理与编排,driver/audio 提供硬件 PCM 收发 |
| 代码体量 | 共约 6400 行(含 11 个 effect、11 种 source、6 种 sink、1 个 mixer) |
架构总览
┌─────────────────────────────────────────────┐
│ kernel/audio │
│ │
┌────────┐ │ ┌────────┐ ┌─────────┐ ┌────────┐ │ ┌──────────┐
│ files │──>│──>│ Source │──>│ Filter │──>│ Sink │──>│──>│ playback │
│ mic │ │ │ (read) │ │ Chain │ │ (write)│ │ │ device │
│ memory │ │ └────────┘ │ │ └────────┘ │ └──────────┘
│ tone │ │ ▲ │ effect1 │ │ │
│ ... │ │ │ │ effect2 │ ▼ │
└────────┘ │ ┌────┴────┐ │ ... │ ┌─────────┐ │
│ │ Mixer │ └─────────┘ │ analyze │ │
│ │ (mix N) │ │ vad/fft │ │
│ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────┘
│
▼
audio_frame_t (float interleaved samples)
核心思想:一切都是带 filter 的 source 或 sink;多个 source 经过 mixer 合并后,又可作为新的 source 继续接入管道。
分层模型
| 层级 | 文件 | 职责 |
|---|---|---|
| 1. 数据载体 | driver/audio/audio.h | 定义 audio_frame_t,提供音量/分贝换算 |
| 2. 效果引擎 | effect.h / effect.c | 效果插件注册、JSON 解析、滤波器链管理 |
| 3. 源 / 汇 | source.h / sink.h | 统一的输入输出抽象,内嵌 filter 自动处理 |
| 4. 混音器 | mixer.h / mixer.c | 多源汇聚、自动归一化、可作为 source 嵌套 |
核心数据流
所有组件之间通过 struct audio_frame_t 传递数据:
struct audio_frame_t {
int rate; /* 采样率 (Hz),如 48000 */
int channel; /* 声道数,1=mono, 2=stereo */
int frames; /* 帧数,通常约 5ms 数据 */
float * samples; /* 交错样本数据 [L,R,L,R,...] */
};
典型读取流程:
audio_source_read(s)
│
├──> s->read(s) ← 由具体 source 实现产出原始 frame
│
└──> audio_filter_process(s->filter) ← 自动应用挂载的效果链
│
└──> effect[0].process()
effect[1].process()
...
return final frame
audio_sink_write() 反向同理:写入前先经过 sink 自带的 filter 处理。
六大设计亮点
1. 统一 float 内部格式
所有 source 在数据出口处转为 float 交错样本;所有 sink 在硬件写入前再转为目标格式。这样 effect 算法只需面对单一数据类型,大幅简化实现。