#include "audio_effect_limiter.h" void AudioEffectLimiterInstance::process(const AudioFrame *p_src_frames,AudioFrame *p_dst_frames,int p_frame_count) { float thresh = Math::db2linear(base->treshold); float threshdb = base->treshold; float ceiling = Math::db2linear(base->ceiling); float ceildb = base->ceiling; float makeup = Math::db2linear(ceildb - threshdb); float makeupdb = ceildb - threshdb; float sc = -base->soft_clip; float scv = Math::db2linear(sc); float sccomp = Math::db2linear(-sc); float peakdb = ceildb + 25; float peaklvl = Math::db2linear(peakdb); float scratio = base->soft_clip_ratio; float scmult = Math::abs((ceildb - sc) / (peakdb - sc)); for(int i=0;i scv) { spl0 = sign0 * (scv + Math::db2linear(overdb0 * scmult)); } if (abs1 > scv) { spl1 = sign1 * (scv + Math::db2linear(overdb1 * scmult)); } spl0 = MIN(ceiling, Math::abs(spl0)) * (spl0 < 0.0 ? -1.0 : 1.0); spl1 = MIN(ceiling, Math::abs(spl1)) * (spl1 < 0.0 ? -1.0 : 1.0); p_dst_frames[i].l = spl0; p_dst_frames[i].r = spl1; } } Ref AudioEffectLimiter::instance() { Ref ins; ins.instance(); ins->base=Ref(this); return ins; } void AudioEffectLimiter::set_treshold_db(float p_treshold) { treshold=p_treshold; } float AudioEffectLimiter::get_treshold_db() const{ return treshold; } void AudioEffectLimiter::set_ceiling_db(float p_ceiling){ ceiling=p_ceiling; } float AudioEffectLimiter::get_ceiling_db() const{ return ceiling; } void AudioEffectLimiter::set_soft_clip_db(float p_soft_clip){ soft_clip=p_soft_clip; } float AudioEffectLimiter::get_soft_clip_db() const{ return soft_clip; } void AudioEffectLimiter::set_soft_clip_ratio(float p_soft_clip){ soft_clip_ratio=p_soft_clip; } float AudioEffectLimiter::get_soft_clip_ratio() const{ return soft_clip; } void AudioEffectLimiter::_bind_methods() { ClassDB::bind_method(D_METHOD("set_ceiling_db","ceiling"),&AudioEffectLimiter::set_ceiling_db); ClassDB::bind_method(D_METHOD("get_ceiling_db"),&AudioEffectLimiter::get_ceiling_db); ClassDB::bind_method(D_METHOD("set_treshold_db","treshold"),&AudioEffectLimiter::set_treshold_db); ClassDB::bind_method(D_METHOD("get_treshold_db"),&AudioEffectLimiter::get_treshold_db); ClassDB::bind_method(D_METHOD("set_soft_clip_db","soft_clip"),&AudioEffectLimiter::set_soft_clip_db); ClassDB::bind_method(D_METHOD("get_soft_clip_db"),&AudioEffectLimiter::get_soft_clip_db); ClassDB::bind_method(D_METHOD("set_soft_clip_ratio","soft_clip"),&AudioEffectLimiter::set_soft_clip_ratio); ClassDB::bind_method(D_METHOD("get_soft_clip_ratio"),&AudioEffectLimiter::get_soft_clip_ratio); ADD_PROPERTY(PropertyInfo(Variant::REAL,"ceiling_db",PROPERTY_HINT_RANGE,"-20,-0.1,0.1"),"set_ceiling_db","get_ceiling_db"); ADD_PROPERTY(PropertyInfo(Variant::REAL,"treshold_db",PROPERTY_HINT_RANGE,"-30,0,0.1"),"set_treshold_db","get_treshold_db"); ADD_PROPERTY(PropertyInfo(Variant::REAL,"soft_clip_db",PROPERTY_HINT_RANGE,"0,6,0.1"),"set_soft_clip_db","get_soft_clip_db"); ADD_PROPERTY(PropertyInfo(Variant::REAL,"soft_clip_ratio",PROPERTY_HINT_RANGE,"3,20,0.1"),"set_soft_clip_ratio","get_soft_clip_ratio"); } AudioEffectLimiter::AudioEffectLimiter() { treshold=0; ceiling=-0.1; soft_clip=2; soft_clip_ratio=10; }