音效插件详解 (effect-plugins)
XSTAR 音频框架内建 11 个音效插件,全部位于 xstar/kernel/audio/effect-*.c。本文按"格式转换 → 信号处理 → 特效"三大类逐一介绍其用途、JSON 配置与算法要点。
速查总表
| 类别 | 名称 | JSON 关键参数 | 默认值 | 是否带状态 |
|---|---|---|---|---|
| 格式 | resample | rate (int) | 48000 | 是(fraction 累加器) |
| 格式 | reshape | channel (int) | 1 | 否 |
| 格式 | mono | — | — | 否 |
| 格式 | panning | weight (array) | 单位矩阵 | 否 |
| 工具 | duplicate | — | — | 否(仅 memcpy) |
| 信号 | volume | factor 或 decibel (double) | 1.0 / 0dB | 否 |
| 信号 | compressor | threshold (dBFS) / ratio / attack (ms) / release (ms) / knee (dB) / makeup (dB) | -20 / 4 / 5 / 100 / 6 / 0 | 是(包络) |
| 信号 | limiter | threshold (dBFS) / release (ms) | -1.0 / 50 | 是(瞬时增益) |
| 信号 | iir | type / frequency / quality / gain | lowpass/1000/0.707/6.0 | 是 |
| 特效 | tremolo | frequency / depth (double) | 5.0 / 0.5 | 是(相位) |
| 特效 | crystalizer | intensity (double) / clip (bool) | 2.0 / true | 是(前一样本) |
一、格式转换 / 帧处理类
1. resample — 采样率转换
用途:将输入采样率转换为目标采样率。常用于把不同来源的音频统一到硬件支持的速率。
JSON 配置:
{
"resample": {
"rate": 48000
}
}
算法要点:使用基于 fraction 累加器的简单线性间隔重采样(最邻近插值)。每输入一帧 fraction 递增 1,超过 1 时输出一帧并扣除步长 step = input_rate / target_rate。
源码位置:xstar/kernel/audio/effect-resample.c:104
💡 该实现追求轻量与零延迟,没有抗混叠滤波器。若需要更高保真度,可在 resample 之前串接
iir低通滤波。
2. reshape — 声道数量变换
用途:改变音频帧的声道数。多声道转少声道时取前 N 个;少声道转多声道时把剩余声道复制最后一个已写入声道的样本值。
JSON 配置:
{
"reshape": {
"channel": 2
}
}
源码位置:xstar/kernel/audio/effect-reshape.c
3. mono — 下混为单声道
用途:将所有声道平均叠加输出单声道,比 reshape 更适合保留全部声道信息。
JSON 配置:
{
"mono": {}
}
算法:out[n] = (in[n*ch + 0] + in[n*ch + 1] + ... + in[n*ch + ch-1]) / ch
源码位置:xstar/kernel/audio/effect-mono.c
4. duplicate — 复制音频帧(隔离原地修改)
用途:把输入 audio_frame_t 的样本数据 memcpy 到本节点的私有 buffer,再以新帧返回。格式与样本值完全不变(rate/channel/frames 全部相同)。
JSON 配置:
{
"duplicate": {}
}
为什么需要它:framework 中的各个 effect 对输入帧的处理方式并不统一——
- 有些 effect 原地修改 input->samples(如
volume、tremolo、crystalizer) - 有些 effect 不修改 input,而是把结果写入自己的私有 buffer 后返回(如
resample、reshape、mono、duplicate自己)
当上游希望保留原始帧数据给其它路径使用时,可在链路前部插入 duplicate,使后续会原地修改的 effect 改写的是副本而不是原始数据。
示例场景:同一份 source 既要送扬声器(经 volume 衰减),又要送频谱分析(需要原始电平)——
source ──> duplicate ──> volume ──> sink-playback
│
└─────> 另一处用 audio_filter_process 走频谱通路(不受 volume 影响)
源码位置:xstar/kernel/audio/effect-duplicate.c:72
5. panning — 声道矩阵重映射
用途:用 N×N 权重矩阵对声道进行线性组合,可实现声像调整、立体声转单声道、多声道 downmix 等。
JSON 配置(2×2 立体声直通示例):
{
"panning": {
"weight": [
1.0, 0.0,
0.0, 1.0
]
}
}
立体声转单声道(两声道各取一半):
{
"panning": {
"weight": [ 0.5, 0.5 ]
}
}
立体声左右声道对换(L↔R):
{
"panning": {
"weight": [
0.0, 1.0,
1.0, 0.0
]
}
}
算法:out[v] = Σ weight[u][v] * in[u],最多支持 32 声道。
源码位置:xstar/kernel/audio/effect-panning.c
二、信号处理类
6. volume — 音量/分贝调节
用途:按系数或分贝值整体缩放幅度。
JSON 配置(两种二选一):
{
"volume": { "factor": 0.5 }
}
{
"volume": { "decibel": -6.0 }
}
换算:factor = 10^(decibel/20),即 -6dB ≈ 0.501。
源码位置:xstar/kernel/audio/effect-volume.c:89