如何重用Oboe的MultiChannelResampler实例并消除起始爆音?
解决Oboe MultiChannelResampler重用时的起始爆音问题
重用resampler::MultiChannelResampler时出现起始爆音,本质是上次使用后残留的内部缓冲数据干扰了新音频的处理。无需新建实例,用以下方法即可解决:
核心方案:调用重采样器的reset()方法
Oboe的Resampler基类(MultiChannelResampler继承自它)提供了reset()虚函数,专门用于清除内部状态:
- 清空延迟缓冲里的残留音频数据
- 重置读写指针、插值计算相关的状态变量
- 让重采样器回到与新实例一致的初始状态
修改代码示例
在每次触发新音符、开始填充新音频数据前,先调用reset():
// 新音符触发时执行重置 resampler->reset(); int outputFramesLeft = numOutputFrames; while (outputFramesLeft > 0) { if(resampler->isWriteNeeded()) { const float *frame = getNextInputFrame(); // 获取当前音符的输入帧 resampler->writeNextFrame(frame); } else { resampler->readNextFrame(outputBuffer); outputBuffer += channelCount; outputFramesLeft--; } }
可选优化:中途停止时排空缓冲(非必须)
如果希望停止旧音符时更平滑,避免残留数据积累,可以在松琴键时,向重采样器填充几帧静音数据,直到内部缓冲排空(通过isWriteNeeded()判断是否还需要输入),之后再调用reset()。不过直接调用reset()已经能解决爆音问题,这个步骤是锦上添花。
内容的提问来源于stack exchange,提问作者Gilian
相关产品推荐
相关产品推荐

