870920 Menu

AudioSource之ReverbAudioSource

ReverbAudioSource可对另一个AudioSource所产生的音频流进行Reverb混响处理,其工作原理与结果与IIRFilterAudioSource基本一致。即:修改另一个AudioSource所产生的数据,修改后的数据由本类直接输出。所不同的,ReverbAudioSource可设置或返回混响参数,并可直接控制混响处理是否直通。

ReverbAudioSource的成员函数
 ReverbAudioSource (音频来源,1参是否由本类托管) 构造函数
 setParameters (Reverb::Parameters对象) 设置混响参数
 getParameters () 返回当前所设置的混响参数
 setBypassed (bool值) 设置是否直通
 isBypassed () 如果当前处于直通模式,则返回true
 prepareToPlay () 准备产生混响处理后的音频流
 releaseResources () 停止混响处理,不再生成任何音频流
 getNextAudioBlock () 开始生成混响处理后的音频流

除了getNextAudioBlock()函数外,ReverbAudioSource的另一个核心函数为setParameters()设置混响参数,该函数的实参为Reverb::Parameters结构体对象。该结构体构造函数无参,无成员函数,只有6个float数据成员,均为public类型的。这6个float值代表了混响处理的参数值:
 roomSize 房间大小, 0到1.0, 1.0为最大, 0为最小。默认值为0.5f
 damping 阻尼(衰减速率), 0到1.0, 0为无阻尼, 1.0为最大阻尼。默认值为0.5f
 wetLevel 湿声增益比例(振幅), 0到1.0。默认值为0.33f
 dryLevel 干声增益比例(振幅), 0到1.0,默认值为0.4f
 width 混响宽度, 0到1.0, 1.0为最宽。默认值为1.0f
 freezeMode 混响量。大于0.5则将混响置于连续不断的回路中。默认值为0

ReverbAudioSource的getNextAudioBlock()函数中,对来源进行混响处理的语句为:

ReverbAudioSource的核心函数getNextAudioBlock()中,混响处理使用了Reverb类来完成。Reverb的作用与用法类似IIRFilterAudioSource,但有本质的不同:Reverb是一个独立的类,不属于AudioSource类系,它的两个核心函数可对调用方传来的数组(采样数组)进行逐元素计算,计算的结果即为混响处理后的采样。

Reverb是一个简单的立体声混响器,基于FreeVerb技术。其使用流程:
 无参构造函数创建对象
 调用setSampleRate()设置正确的采样率
 调用processStereo()或processMono()对音频数据进行混响处理

Reverb的成员函数:
 Reverb () 默认构造函数,使用默认的Reverb::Parameters对象,采样率44100.0
 setParameters () 设置混响参数
 getParameters () 返回当前所设置的混响参数
 setSampleRate () 设置采样率,处理之前必须先调用此函数
 reset () 清除缓冲数据,重置混响处理
 processStereo (左通道数组,右通道数组,元素个数) 立体声混响处理
 processMono (单通道数组,元素个数) 单通道混响处理

总结一下IIRFilterAudioSource进行滤波处理与ReverbAudioSource进行混响处理的异同:
 两者都是处理另一个AudioSource所产生的音频流,改变来源所产生的数据后直接输出。
 两者进行效果处理,都依赖于另外的辅助类。
 IIRFilterAudioSource直接使用IIRFiler类的对象完成滤波处理。
 ReverbAudioSource间接使用Reverb类完成滤波处理。
 ReverbAudioSource直接使用的是Reverb::Parameters结构体对象,该对象内部传递给Reverb。也就是说,滤波处理只用IIRFilter类即可。而混响处理,则需两个类:Reverb和Reverb::Parameters。