From 6b4bbcccbd4f0d687a3f3df1b89113e99be38726 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 15 May 2024 18:54:39 -0700 Subject: [PATCH] Handle AL effect properties with a variant --- al/auxeffectslot.cpp | 6 +- al/effect.cpp | 106 ++++++++++++++++------------------ al/effect.h | 7 +++ al/effects/autowah.cpp | 16 +++--- al/effects/chorus.cpp | 44 +++++++------- al/effects/compressor.cpp | 21 +++---- al/effects/convolution.cpp | 16 +++--- al/effects/dedicated.cpp | 38 +++++++------ al/effects/distortion.cpp | 16 +++--- al/effects/echo.cpp | 16 +++--- al/effects/effects.h | 139 +++++++++++++++++++++------------------------ al/effects/equalizer.cpp | 16 +++--- al/effects/fshifter.cpp | 16 +++--- al/effects/modulator.cpp | 16 +++--- al/effects/null.cpp | 16 +++--- al/effects/pshifter.cpp | 16 +++--- al/effects/reverb.cpp | 54 +++++++----------- al/effects/vmorpher.cpp | 16 +++--- alc/effects/base.h | 4 +- alc/effects/chorus.cpp | 61 +++++--------------- alc/effects/dedicated.cpp | 86 +++++++++++----------------- core/effects/base.h | 21 ++----- 22 files changed, 328 insertions(+), 419 deletions(-) rewrite al/effects/effects.h (62%) diff --git a/al/auxeffectslot.cpp b/al/auxeffectslot.cpp index 0d657ff0..4f21278d 100644 --- a/al/auxeffectslot.cpp +++ b/al/auxeffectslot.cpp @@ -87,13 +87,13 @@ EffectStateFactory *getFactoryByType(EffectSlotType type) case EffectSlotType::Distortion: return DistortionStateFactory_getFactory(); case EffectSlotType::Echo: return EchoStateFactory_getFactory(); case EffectSlotType::Equalizer: return EqualizerStateFactory_getFactory(); - case EffectSlotType::Flanger: return FlangerStateFactory_getFactory(); + case EffectSlotType::Flanger: return ChorusStateFactory_getFactory(); case EffectSlotType::FrequencyShifter: return FshifterStateFactory_getFactory(); case EffectSlotType::RingModulator: return ModulatorStateFactory_getFactory(); case EffectSlotType::PitchShifter: return PshifterStateFactory_getFactory(); case EffectSlotType::VocalMorpher: return VmorpherStateFactory_getFactory(); - case EffectSlotType::DedicatedDialog: return DedicatedDialogStateFactory_getFactory(); - case EffectSlotType::DedicatedLFE: return DedicatedLfeStateFactory_getFactory(); + case EffectSlotType::DedicatedDialog: return DedicatedStateFactory_getFactory(); + case EffectSlotType::DedicatedLFE: return DedicatedStateFactory_getFactory(); case EffectSlotType::Convolution: return ConvolutionStateFactory_getFactory(); } return nullptr; diff --git a/al/effect.cpp b/al/effect.cpp index 54c8e0c3..6509d755 100644 --- a/al/effect.cpp +++ b/al/effect.cpp @@ -109,6 +109,32 @@ constexpr auto GetDefaultProps(ALenum type) noexcept -> const EffectProps& void InitEffectParams(ALeffect *effect, ALenum type) noexcept { + switch(type) + { + case AL_EFFECT_NULL: effect->PropsVariant.emplace(); break; + case AL_EFFECT_EAXREVERB: effect->PropsVariant.emplace(); break; + case AL_EFFECT_REVERB: effect->PropsVariant.emplace(); break; + case AL_EFFECT_AUTOWAH: effect->PropsVariant.emplace(); break; + case AL_EFFECT_CHORUS: effect->PropsVariant.emplace(); break; + case AL_EFFECT_COMPRESSOR: effect->PropsVariant.emplace(); break; + case AL_EFFECT_DISTORTION: effect->PropsVariant.emplace(); break; + case AL_EFFECT_ECHO: effect->PropsVariant.emplace(); break; + case AL_EFFECT_EQUALIZER: effect->PropsVariant.emplace(); break; + case AL_EFFECT_FLANGER: effect->PropsVariant.emplace(); break; + case AL_EFFECT_FREQUENCY_SHIFTER: effect->PropsVariant.emplace(); break; + case AL_EFFECT_RING_MODULATOR: effect->PropsVariant.emplace(); break; + case AL_EFFECT_PITCH_SHIFTER: effect->PropsVariant.emplace(); break; + case AL_EFFECT_VOCAL_MORPHER: effect->PropsVariant.emplace(); break; + case AL_EFFECT_DEDICATED_DIALOGUE: + effect->PropsVariant.emplace(); + break; + case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT: + effect->PropsVariant.emplace(); + break; + case AL_EFFECT_CONVOLUTION_SOFT: + effect->PropsVariant.emplace(); + break; + } effect->Props = GetDefaultProps(type); effect->type = type; } @@ -278,13 +304,9 @@ try { std::visit([aleffect,param,value](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbSetParami(arg, param, value); - } - return EffectHandler::SetParami(arg, param, value); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.SetParami(std::get(aleffect->Props), param, value); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -312,13 +334,9 @@ try { std::visit([aleffect,param,values](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbSetParamiv(arg, param, values); - } - return EffectHandler::SetParamiv(arg, param, values); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.SetParamiv(std::get(aleffect->Props), param, values); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -339,13 +357,9 @@ try { std::visit([aleffect,param,value](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbSetParamf(arg, param, value); - } - return EffectHandler::SetParamf(arg, param, value); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.SetParamf(std::get(aleffect->Props), param, value); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -366,13 +380,9 @@ try { std::visit([aleffect,param,values](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbSetParamfv(arg, param, values); - } - return EffectHandler::SetParamfv(arg, param, values); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.SetParamfv(std::get(aleffect->Props), param, values); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -400,13 +410,9 @@ try { std::visit([aleffect,param,value](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbGetParami(arg, param, value); - } - return EffectHandler::GetParami(arg, param, value); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.GetParami(std::get(aleffect->Props), param, value); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -434,13 +440,9 @@ try { std::visit([aleffect,param,values](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbGetParamiv(arg, param, values); - } - return EffectHandler::GetParamiv(arg, param, values); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.GetParamiv(std::get(aleffect->Props), param, values); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -461,13 +463,9 @@ try { std::visit([aleffect,param,value](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbGetParamf(arg, param, value); - } - return EffectHandler::GetParamf(arg, param, value); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.GetParamf(std::get(aleffect->Props), param, value); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); @@ -488,13 +486,9 @@ try { std::visit([aleffect,param,values](auto &arg) { using Type = std::remove_cv_t>; - if constexpr(std::is_same_v) - { - if(aleffect->type == AL_EFFECT_REVERB) - return EffectHandler::StdReverbGetParamfv(arg, param, values); - } - return EffectHandler::GetParamfv(arg, param, values); - }, aleffect->Props); + using PropType = typename Type::prop_type; + return arg.GetParamfv(std::get(aleffect->Props), param, values); + }, aleffect->PropsVariant); } catch(al::context_error& e) { context->setError(e.errorCode(), "%s", e.what()); diff --git a/al/effect.h b/al/effect.h index 6e396721..84256657 100644 --- a/al/effect.h +++ b/al/effect.h @@ -14,6 +14,7 @@ #include "almalloc.h" #include "alnumeric.h" #include "core/effects/base.h" +#include "effects/effects.h" enum { @@ -44,11 +45,17 @@ struct EffectList { }; extern const std::array gEffectList; +using EffectHandlerVariant = std::variant; struct ALeffect { // Effect type (AL_EFFECT_NULL, ...) ALenum type{AL_EFFECT_NULL}; + EffectHandlerVariant PropsVariant; EffectProps Props{}; /* Self ID */ diff --git a/al/effects/autowah.cpp b/al/effects/autowah.cpp index c8b92450..fe52b8be 100644 --- a/al/effects/autowah.cpp +++ b/al/effects/autowah.cpp @@ -35,15 +35,15 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps AutowahEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(AutowahProps&, ALenum param, int) +void AutowahEffectHandler::SetParami(AutowahProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(AutowahProps&, ALenum param, const int*) +void AutowahEffectHandler::SetParamiv(AutowahProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param}; } -void EffectHandler::SetParamf(AutowahProps &props, ALenum param, float val) +void AutowahEffectHandler::SetParamf(AutowahProps &props, ALenum param, float val) { switch(param) { @@ -75,18 +75,18 @@ void EffectHandler::SetParamf(AutowahProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(AutowahProps &props, ALenum param, const float *vals) +void AutowahEffectHandler::SetParamfv(AutowahProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const AutowahProps&, ALenum param, int*) +void AutowahEffectHandler::GetParami(const AutowahProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const AutowahProps&, ALenum param, int*) +void AutowahEffectHandler::GetParamiv(const AutowahProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const AutowahProps &props, ALenum param, float *val) +void AutowahEffectHandler::GetParamf(const AutowahProps &props, ALenum param, float *val) { switch(param) { @@ -100,7 +100,7 @@ void EffectHandler::GetParamf(const AutowahProps &props, ALenum param, float *va } } -void EffectHandler::GetParamfv(const AutowahProps &props, ALenum param, float *vals) +void AutowahEffectHandler::GetParamfv(const AutowahProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } #ifdef ALSOFT_EAX diff --git a/al/effects/chorus.cpp b/al/effects/chorus.cpp index 93771a1f..5a5013ce 100644 --- a/al/effects/chorus.cpp +++ b/al/effects/chorus.cpp @@ -7,13 +7,10 @@ #include "AL/al.h" #include "AL/efx.h" -#include "alc/effects/base.h" -#include "core/logging.h" #include "effects.h" #ifdef ALSOFT_EAX #include -#include "alnumeric.h" #include "al/eax/effect.h" #include "al/eax/exception.h" #include "al/eax/utils.h" @@ -61,7 +58,7 @@ constexpr EffectProps genDefaultChorusProps() noexcept constexpr EffectProps genDefaultFlangerProps() noexcept { - FlangerProps props{}; + ChorusProps props{}; props.Waveform = WaveformFromEnum(AL_FLANGER_DEFAULT_WAVEFORM).value(); props.Phase = AL_FLANGER_DEFAULT_PHASE; props.Rate = AL_FLANGER_DEFAULT_RATE; @@ -75,7 +72,7 @@ constexpr EffectProps genDefaultFlangerProps() noexcept const EffectProps ChorusEffectProps{genDefaultChorusProps()}; -void EffectHandler::SetParami(ChorusProps &props, ALenum param, int val) +void ChorusEffectHandler::SetParami(ChorusProps &props, ALenum param, int val) { switch(param) { @@ -96,9 +93,9 @@ void EffectHandler::SetParami(ChorusProps &props, ALenum param, int val) throw effect_exception{AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param}; } } -void EffectHandler::SetParamiv(ChorusProps &props, ALenum param, const int *vals) +void ChorusEffectHandler::SetParamiv(ChorusProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(ChorusProps &props, ALenum param, float val) +void ChorusEffectHandler::SetParamf(ChorusProps &props, ALenum param, float val) { switch(param) { @@ -130,10 +127,10 @@ void EffectHandler::SetParamf(ChorusProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(ChorusProps &props, ALenum param, const float *vals) +void ChorusEffectHandler::SetParamfv(ChorusProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const ChorusProps &props, ALenum param, int *val) +void ChorusEffectHandler::GetParami(const ChorusProps &props, ALenum param, int *val) { switch(param) { @@ -144,9 +141,9 @@ void EffectHandler::GetParami(const ChorusProps &props, ALenum param, int *val) throw effect_exception{AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param}; } } -void EffectHandler::GetParamiv(const ChorusProps &props, ALenum param, int *vals) +void ChorusEffectHandler::GetParamiv(const ChorusProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const ChorusProps &props, ALenum param, float *val) +void ChorusEffectHandler::GetParamf(const ChorusProps &props, ALenum param, float *val) { switch(param) { @@ -159,13 +156,13 @@ void EffectHandler::GetParamf(const ChorusProps &props, ALenum param, float *val throw effect_exception{AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const ChorusProps &props, ALenum param, float *vals) +void ChorusEffectHandler::GetParamfv(const ChorusProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } const EffectProps FlangerEffectProps{genDefaultFlangerProps()}; -void EffectHandler::SetParami(FlangerProps &props, ALenum param, int val) +void FlangerEffectHandler::SetParami(ChorusProps &props, ALenum param, int val) { switch(param) { @@ -186,9 +183,9 @@ void EffectHandler::SetParami(FlangerProps &props, ALenum param, int val) throw effect_exception{AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param}; } } -void EffectHandler::SetParamiv(FlangerProps &props, ALenum param, const int *vals) +void FlangerEffectHandler::SetParamiv(ChorusProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(FlangerProps &props, ALenum param, float val) +void FlangerEffectHandler::SetParamf(ChorusProps &props, ALenum param, float val) { switch(param) { @@ -220,10 +217,10 @@ void EffectHandler::SetParamf(FlangerProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(FlangerProps &props, ALenum param, const float *vals) +void FlangerEffectHandler::SetParamfv(ChorusProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const FlangerProps &props, ALenum param, int *val) +void FlangerEffectHandler::GetParami(const ChorusProps &props, ALenum param, int *val) { switch(param) { @@ -234,9 +231,9 @@ void EffectHandler::GetParami(const FlangerProps &props, ALenum param, int *val) throw effect_exception{AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param}; } } -void EffectHandler::GetParamiv(const FlangerProps &props, ALenum param, int *vals) +void FlangerEffectHandler::GetParamiv(const ChorusProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const FlangerProps &props, ALenum param, float *val) +void FlangerEffectHandler::GetParamf(const ChorusProps &props, ALenum param, float *val) { switch(param) { @@ -249,7 +246,7 @@ void EffectHandler::GetParamf(const FlangerProps &props, ALenum param, float *va throw effect_exception{AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const FlangerProps &props, ALenum param, float *vals) +void FlangerEffectHandler::GetParamfv(const ChorusProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } @@ -259,7 +256,6 @@ namespace { struct EaxChorusTraits { using EaxProps = EAXCHORUSPROPERTIES; using Committer = EaxChorusCommitter; - using AlProps = ChorusProps; static constexpr auto efx_effect() { return AL_EFFECT_CHORUS; } @@ -325,7 +321,6 @@ struct EaxChorusTraits { struct EaxFlangerTraits { using EaxProps = EAXFLANGERPROPERTIES; using Committer = EaxFlangerCommitter; - using AlProps = FlangerProps; static constexpr auto efx_effect() { return AL_EFFECT_FLANGER; } @@ -393,7 +388,6 @@ struct ChorusFlangerEffect { using Traits = TTraits; using EaxProps = typename Traits::EaxProps; using Committer = typename Traits::Committer; - using AlProps = typename Traits::AlProps; using Exception = typename Committer::Exception; struct WaveformValidator { @@ -551,7 +545,7 @@ public: } } - static bool Commit(const EaxProps &props, EaxEffectProps &props_, AlProps &al_props_) + static bool Commit(const EaxProps &props, EaxEffectProps &props_, ChorusProps &al_props_) { if(auto *cur = std::get_if(&props_); cur && *cur == props) return false; @@ -628,7 +622,7 @@ template<> bool EaxFlangerCommitter::commit(const EAXFLANGERPROPERTIES &props) { using Committer = ChorusFlangerEffect; - return Committer::Commit(props, mEaxProps, mAlProps.emplace()); + return Committer::Commit(props, mEaxProps, mAlProps.emplace()); } void EaxFlangerCommitter::SetDefaults(EaxEffectProps &props) diff --git a/al/effects/compressor.cpp b/al/effects/compressor.cpp index a388dcef..8c9f5b79 100644 --- a/al/effects/compressor.cpp +++ b/al/effects/compressor.cpp @@ -28,7 +28,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps CompressorEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(CompressorProps &props, ALenum param, int val) +void CompressorEffectHandler::SetParami(CompressorProps &props, ALenum param, int val) { switch(param) { @@ -43,34 +43,31 @@ void EffectHandler::SetParami(CompressorProps &props, ALenum param, int val) param}; } } -void EffectHandler::SetParamiv(CompressorProps &props, ALenum param, const int *vals) +void CompressorEffectHandler::SetParamiv(CompressorProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(CompressorProps&, ALenum param, float) +void CompressorEffectHandler::SetParamf(CompressorProps&, ALenum param, float) { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param}; } -void EffectHandler::SetParamfv(CompressorProps&, ALenum param, const float*) +void CompressorEffectHandler::SetParamfv(CompressorProps&, ALenum param, const float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param}; } -void EffectHandler::GetParami(const CompressorProps &props, ALenum param, int *val) +void CompressorEffectHandler::GetParami(const CompressorProps &props, ALenum param, int *val) { switch(param) { - case AL_COMPRESSOR_ONOFF: - *val = props.OnOff; - break; - + case AL_COMPRESSOR_ONOFF: *val = props.OnOff; break; default: throw effect_exception{AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", param}; } } -void EffectHandler::GetParamiv(const CompressorProps &props, ALenum param, int *vals) +void CompressorEffectHandler::GetParamiv(const CompressorProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const CompressorProps&, ALenum param, float*) +void CompressorEffectHandler::GetParamf(const CompressorProps&, ALenum param, float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param}; } -void EffectHandler::GetParamfv(const CompressorProps&, ALenum param, float*) +void CompressorEffectHandler::GetParamfv(const CompressorProps&, ALenum param, float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param}; diff --git a/al/effects/convolution.cpp b/al/effects/convolution.cpp index 6f31fce3..618d5aac 100644 --- a/al/effects/convolution.cpp +++ b/al/effects/convolution.cpp @@ -28,7 +28,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps ConvolutionEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(ConvolutionProps& /*props*/, ALenum param, int /*val*/) +void ConvolutionEffectHandler::SetParami(ConvolutionProps& /*props*/, ALenum param, int /*val*/) { switch(param) { @@ -37,7 +37,7 @@ void EffectHandler::SetParami(ConvolutionProps& /*props*/, ALenum param, int /*v param}; } } -void EffectHandler::SetParamiv(ConvolutionProps &props, ALenum param, const int *vals) +void ConvolutionEffectHandler::SetParamiv(ConvolutionProps &props, ALenum param, const int *vals) { switch(param) { @@ -45,7 +45,7 @@ void EffectHandler::SetParamiv(ConvolutionProps &props, ALenum param, const int SetParami(props, param, *vals); } } -void EffectHandler::SetParamf(ConvolutionProps& /*props*/, ALenum param, float /*val*/) +void ConvolutionEffectHandler::SetParamf(ConvolutionProps& /*props*/, ALenum param, float /*val*/) { switch(param) { @@ -54,7 +54,7 @@ void EffectHandler::SetParamf(ConvolutionProps& /*props*/, ALenum param, float / param}; } } -void EffectHandler::SetParamfv(ConvolutionProps &props, ALenum param, const float *values) +void ConvolutionEffectHandler::SetParamfv(ConvolutionProps &props, ALenum param, const float *values) { static constexpr auto finite_checker = [](float val) -> bool { return std::isfinite(val); }; al::span vals; @@ -74,7 +74,7 @@ void EffectHandler::SetParamfv(ConvolutionProps &props, ALenum param, const floa } } -void EffectHandler::GetParami(const ConvolutionProps& /*props*/, ALenum param, int* /*val*/) +void ConvolutionEffectHandler::GetParami(const ConvolutionProps& /*props*/, ALenum param, int* /*val*/) { switch(param) { @@ -83,7 +83,7 @@ void EffectHandler::GetParami(const ConvolutionProps& /*props*/, ALenum param, i param}; } } -void EffectHandler::GetParamiv(const ConvolutionProps &props, ALenum param, int *vals) +void ConvolutionEffectHandler::GetParamiv(const ConvolutionProps &props, ALenum param, int *vals) { switch(param) { @@ -91,7 +91,7 @@ void EffectHandler::GetParamiv(const ConvolutionProps &props, ALenum param, int GetParami(props, param, vals); } } -void EffectHandler::GetParamf(const ConvolutionProps& /*props*/, ALenum param, float* /*val*/) +void ConvolutionEffectHandler::GetParamf(const ConvolutionProps& /*props*/, ALenum param, float* /*val*/) { switch(param) { @@ -100,7 +100,7 @@ void EffectHandler::GetParamf(const ConvolutionProps& /*props*/, ALenum param, f param}; } } -void EffectHandler::GetParamfv(const ConvolutionProps &props, ALenum param, float *values) +void ConvolutionEffectHandler::GetParamfv(const ConvolutionProps &props, ALenum param, float *values) { al::span vals; switch(param) diff --git a/al/effects/dedicated.cpp b/al/effects/dedicated.cpp index e6e62f56..f032a72e 100644 --- a/al/effects/dedicated.cpp +++ b/al/effects/dedicated.cpp @@ -14,14 +14,16 @@ namespace { constexpr EffectProps genDefaultDialogProps() noexcept { - DedicatedDialogProps props{}; + DedicatedProps props{}; + props.Target = DedicatedProps::Dialog; props.Gain = 1.0f; return props; } constexpr EffectProps genDefaultLfeProps() noexcept { - DedicatedLfeProps props{}; + DedicatedProps props{}; + props.Target = DedicatedProps::Lfe; props.Gain = 1.0f; return props; } @@ -30,14 +32,14 @@ constexpr EffectProps genDefaultLfeProps() noexcept const EffectProps DedicatedDialogEffectProps{genDefaultDialogProps()}; -void EffectHandler::SetParami(DedicatedDialogProps&, ALenum param, int) +void DedicatedDialogEffectHandler::SetParami(DedicatedProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(DedicatedDialogProps&, ALenum param, const int*) +void DedicatedDialogEffectHandler::SetParamiv(DedicatedProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(DedicatedDialogProps &props, ALenum param, float val) +void DedicatedDialogEffectHandler::SetParamf(DedicatedProps &props, ALenum param, float val) { switch(param) { @@ -51,17 +53,17 @@ void EffectHandler::SetParamf(DedicatedDialogProps &props, ALenum param, float v throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(DedicatedDialogProps &props, ALenum param, const float *vals) +void DedicatedDialogEffectHandler::SetParamfv(DedicatedProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const DedicatedDialogProps&, ALenum param, int*) +void DedicatedDialogEffectHandler::GetParami(const DedicatedProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const DedicatedDialogProps&, ALenum param, int*) +void DedicatedDialogEffectHandler::GetParamiv(const DedicatedProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const DedicatedDialogProps &props, ALenum param, float *val) +void DedicatedDialogEffectHandler::GetParamf(const DedicatedProps &props, ALenum param, float *val) { switch(param) { @@ -70,20 +72,20 @@ void EffectHandler::GetParamf(const DedicatedDialogProps &props, ALenum param, f throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const DedicatedDialogProps &props, ALenum param, float *vals) +void DedicatedDialogEffectHandler::GetParamfv(const DedicatedProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } const EffectProps DedicatedLfeEffectProps{genDefaultLfeProps()}; -void EffectHandler::SetParami(DedicatedLfeProps&, ALenum param, int) +void DedicatedLfeEffectHandler::SetParami(DedicatedProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(DedicatedLfeProps&, ALenum param, const int*) +void DedicatedLfeEffectHandler::SetParamiv(DedicatedProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(DedicatedLfeProps &props, ALenum param, float val) +void DedicatedLfeEffectHandler::SetParamf(DedicatedProps &props, ALenum param, float val) { switch(param) { @@ -97,17 +99,17 @@ void EffectHandler::SetParamf(DedicatedLfeProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(DedicatedLfeProps &props, ALenum param, const float *vals) +void DedicatedLfeEffectHandler::SetParamfv(DedicatedProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const DedicatedLfeProps&, ALenum param, int*) +void DedicatedLfeEffectHandler::GetParami(const DedicatedProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const DedicatedLfeProps&, ALenum param, int*) +void DedicatedLfeEffectHandler::GetParamiv(const DedicatedProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const DedicatedLfeProps &props, ALenum param, float *val) +void DedicatedLfeEffectHandler::GetParamf(const DedicatedProps &props, ALenum param, float *val) { switch(param) { @@ -116,5 +118,5 @@ void EffectHandler::GetParamf(const DedicatedLfeProps &props, ALenum param, floa throw effect_exception{AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const DedicatedLfeProps &props, ALenum param, float *vals) +void DedicatedLfeEffectHandler::GetParamfv(const DedicatedProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/distortion.cpp b/al/effects/distortion.cpp index eb93d8cd..7d47fef2 100644 --- a/al/effects/distortion.cpp +++ b/al/effects/distortion.cpp @@ -32,14 +32,14 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps DistortionEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(DistortionProps&, ALenum param, int) +void DistortionEffectHandler::SetParami(DistortionProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(DistortionProps&, ALenum param, const int*) +void DistortionEffectHandler::SetParamiv(DistortionProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(DistortionProps &props, ALenum param, float val) +void DistortionEffectHandler::SetParamf(DistortionProps &props, ALenum param, float val) { switch(param) { @@ -77,17 +77,17 @@ void EffectHandler::SetParamf(DistortionProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(DistortionProps &props, ALenum param, const float *vals) +void DistortionEffectHandler::SetParamfv(DistortionProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const DistortionProps&, ALenum param, int*) +void DistortionEffectHandler::GetParami(const DistortionProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const DistortionProps&, ALenum param, int*) +void DistortionEffectHandler::GetParamiv(const DistortionProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const DistortionProps &props, ALenum param, float *val) +void DistortionEffectHandler::GetParamf(const DistortionProps &props, ALenum param, float *val) { switch(param) { @@ -101,7 +101,7 @@ void EffectHandler::GetParamf(const DistortionProps &props, ALenum param, float throw effect_exception{AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const DistortionProps &props, ALenum param, float *vals) +void DistortionEffectHandler::GetParamfv(const DistortionProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/echo.cpp b/al/effects/echo.cpp index 4605f5b4..96ed7be2 100644 --- a/al/effects/echo.cpp +++ b/al/effects/echo.cpp @@ -35,11 +35,11 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps EchoEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(EchoProps&, ALenum param, int) +void EchoEffectHandler::SetParami(EchoProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(EchoProps&, ALenum param, const int*) +void EchoEffectHandler::SetParamiv(EchoProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(EchoProps &props, ALenum param, float val) +void EchoEffectHandler::SetParamf(EchoProps &props, ALenum param, float val) { switch(param) { @@ -77,14 +77,14 @@ void EffectHandler::SetParamf(EchoProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(EchoProps &props, ALenum param, const float *vals) +void EchoEffectHandler::SetParamfv(EchoProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const EchoProps&, ALenum param, int*) +void EchoEffectHandler::GetParami(const EchoProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const EchoProps&, ALenum param, int*) +void EchoEffectHandler::GetParamiv(const EchoProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const EchoProps &props, ALenum param, float *val) +void EchoEffectHandler::GetParamf(const EchoProps &props, ALenum param, float *val) { switch(param) { @@ -98,7 +98,7 @@ void EffectHandler::GetParamf(const EchoProps &props, ALenum param, float *val) throw effect_exception{AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const EchoProps &props, ALenum param, float *vals) +void EchoEffectHandler::GetParamfv(const EchoProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/effects.h b/al/effects/effects.h dissimilarity index 62% index 8dc9f9bc..3c4b8f93 100644 --- a/al/effects/effects.h +++ b/al/effects/effects.h @@ -1,73 +1,66 @@ -#ifndef AL_EFFECTS_EFFECTS_H -#define AL_EFFECTS_EFFECTS_H - -#include - -#include "AL/al.h" - -#include "al/error.h" -#include "core/effects/base.h" - - -struct EffectHandler { -#define DECL_HANDLER(T) \ - static void SetParami(T &props, ALenum param, int val); \ - static void SetParamiv(T &props, ALenum param, const int *vals); \ - static void SetParamf(T &props, ALenum param, float val); \ - static void SetParamfv(T &props, ALenum param, const float *vals); \ - static void GetParami(const T &props, ALenum param, int *val); \ - static void GetParamiv(const T &props, ALenum param, int *vals); \ - static void GetParamf(const T &props, ALenum param, float *val); \ - static void GetParamfv(const T &props, ALenum param, float *vals); - - DECL_HANDLER(std::monostate) - DECL_HANDLER(ReverbProps) - DECL_HANDLER(ChorusProps) - DECL_HANDLER(AutowahProps) - DECL_HANDLER(CompressorProps) - DECL_HANDLER(ConvolutionProps) - DECL_HANDLER(DedicatedDialogProps) - DECL_HANDLER(DedicatedLfeProps) - DECL_HANDLER(DistortionProps) - DECL_HANDLER(EchoProps) - DECL_HANDLER(EqualizerProps) - DECL_HANDLER(FlangerProps) - DECL_HANDLER(FshifterProps) - DECL_HANDLER(ModulatorProps) - DECL_HANDLER(PshifterProps) - DECL_HANDLER(VmorpherProps) -#undef DECL_HANDLER - - static void StdReverbSetParami(ReverbProps &props, ALenum param, int val); - static void StdReverbSetParamiv(ReverbProps &props, ALenum param, const int *vals); - static void StdReverbSetParamf(ReverbProps &props, ALenum param, float val); - static void StdReverbSetParamfv(ReverbProps &props, ALenum param, const float *vals); - static void StdReverbGetParami(const ReverbProps &props, ALenum param, int *val); - static void StdReverbGetParamiv(const ReverbProps &props, ALenum param, int *vals); - static void StdReverbGetParamf(const ReverbProps &props, ALenum param, float *val); - static void StdReverbGetParamfv(const ReverbProps &props, ALenum param, float *vals); -}; - -using effect_exception = al::context_error; - - -/* Default properties for the given effect types. */ -extern const EffectProps NullEffectProps; -extern const EffectProps ReverbEffectProps; -extern const EffectProps StdReverbEffectProps; -extern const EffectProps AutowahEffectProps; -extern const EffectProps ChorusEffectProps; -extern const EffectProps CompressorEffectProps; -extern const EffectProps DistortionEffectProps; -extern const EffectProps EchoEffectProps; -extern const EffectProps EqualizerEffectProps; -extern const EffectProps FlangerEffectProps; -extern const EffectProps FshifterEffectProps; -extern const EffectProps ModulatorEffectProps; -extern const EffectProps PshifterEffectProps; -extern const EffectProps VmorpherEffectProps; -extern const EffectProps DedicatedDialogEffectProps; -extern const EffectProps DedicatedLfeEffectProps; -extern const EffectProps ConvolutionEffectProps; - -#endif /* AL_EFFECTS_EFFECTS_H */ +#ifndef AL_EFFECTS_EFFECTS_H +#define AL_EFFECTS_EFFECTS_H + +#include + +#include "AL/al.h" + +#include "al/error.h" +#include "core/effects/base.h" + +#define DECL_HANDLER(N, T) \ +struct N { \ + using prop_type = T; \ + \ + static void SetParami(prop_type &props, ALenum param, int val); \ + static void SetParamiv(prop_type &props, ALenum param, const int *vals); \ + static void SetParamf(prop_type &props, ALenum param, float val); \ + static void SetParamfv(prop_type &props, ALenum param, const float *vals);\ + static void GetParami(const prop_type &props, ALenum param, int *val); \ + static void GetParamiv(const prop_type &props, ALenum param, int *vals); \ + static void GetParamf(const prop_type &props, ALenum param, float *val); \ + static void GetParamfv(const prop_type &props, ALenum param, float *vals);\ +}; +DECL_HANDLER(NullEffectHandler, std::monostate) +DECL_HANDLER(ReverbEffectHandler, ReverbProps) +DECL_HANDLER(StdReverbEffectHandler, ReverbProps) +DECL_HANDLER(AutowahEffectHandler, AutowahProps) +DECL_HANDLER(ChorusEffectHandler, ChorusProps) +DECL_HANDLER(CompressorEffectHandler, CompressorProps) +DECL_HANDLER(DistortionEffectHandler, DistortionProps) +DECL_HANDLER(EchoEffectHandler, EchoProps) +DECL_HANDLER(EqualizerEffectHandler, EqualizerProps) +DECL_HANDLER(FlangerEffectHandler, ChorusProps) +DECL_HANDLER(FshifterEffectHandler, FshifterProps) +DECL_HANDLER(ModulatorEffectHandler, ModulatorProps) +DECL_HANDLER(PshifterEffectHandler, PshifterProps) +DECL_HANDLER(VmorpherEffectHandler, VmorpherProps) +DECL_HANDLER(DedicatedDialogEffectHandler, DedicatedProps) +DECL_HANDLER(DedicatedLfeEffectHandler, DedicatedProps) +DECL_HANDLER(ConvolutionEffectHandler, ConvolutionProps) +#undef DECL_HANDLER + + +using effect_exception = al::context_error; + + +/* Default properties for the given effect types. */ +extern const EffectProps NullEffectProps; +extern const EffectProps ReverbEffectProps; +extern const EffectProps StdReverbEffectProps; +extern const EffectProps AutowahEffectProps; +extern const EffectProps ChorusEffectProps; +extern const EffectProps CompressorEffectProps; +extern const EffectProps DistortionEffectProps; +extern const EffectProps EchoEffectProps; +extern const EffectProps EqualizerEffectProps; +extern const EffectProps FlangerEffectProps; +extern const EffectProps FshifterEffectProps; +extern const EffectProps ModulatorEffectProps; +extern const EffectProps PshifterEffectProps; +extern const EffectProps VmorpherEffectProps; +extern const EffectProps DedicatedDialogEffectProps; +extern const EffectProps DedicatedLfeEffectProps; +extern const EffectProps ConvolutionEffectProps; + +#endif /* AL_EFFECTS_EFFECTS_H */ diff --git a/al/effects/equalizer.cpp b/al/effects/equalizer.cpp index f12ad2da..ba735307 100644 --- a/al/effects/equalizer.cpp +++ b/al/effects/equalizer.cpp @@ -37,14 +37,14 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps EqualizerEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(EqualizerProps&, ALenum param, int) +void EqualizerEffectHandler::SetParami(EqualizerProps&, ALenum param, int) { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param}; } -void EffectHandler::SetParamiv(EqualizerProps&, ALenum param, const int*) +void EqualizerEffectHandler::SetParamiv(EqualizerProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(EqualizerProps &props, ALenum param, float val) +void EqualizerEffectHandler::SetParamf(EqualizerProps &props, ALenum param, float val) { switch(param) { @@ -112,17 +112,17 @@ void EffectHandler::SetParamf(EqualizerProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(EqualizerProps &props, ALenum param, const float *vals) +void EqualizerEffectHandler::SetParamfv(EqualizerProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const EqualizerProps&, ALenum param, int*) +void EqualizerEffectHandler::GetParami(const EqualizerProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param}; } -void EffectHandler::GetParamiv(const EqualizerProps&, ALenum param, int*) +void EqualizerEffectHandler::GetParamiv(const EqualizerProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const EqualizerProps &props, ALenum param, float *val) +void EqualizerEffectHandler::GetParamf(const EqualizerProps &props, ALenum param, float *val) { switch(param) { @@ -141,7 +141,7 @@ void EffectHandler::GetParamf(const EqualizerProps &props, ALenum param, float * throw effect_exception{AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const EqualizerProps &props, ALenum param, float *vals) +void EqualizerEffectHandler::GetParamfv(const EqualizerProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/fshifter.cpp b/al/effects/fshifter.cpp index bae00d18..a2321395 100644 --- a/al/effects/fshifter.cpp +++ b/al/effects/fshifter.cpp @@ -55,7 +55,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps FshifterEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(FshifterProps &props, ALenum param, int val) +void FshifterEffectHandler::SetParami(FshifterProps &props, ALenum param, int val) { switch(param) { @@ -80,10 +80,10 @@ void EffectHandler::SetParami(FshifterProps &props, ALenum param, int val) "Invalid frequency shifter integer property 0x%04x", param}; } } -void EffectHandler::SetParamiv(FshifterProps &props, ALenum param, const int *vals) +void FshifterEffectHandler::SetParamiv(FshifterProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(FshifterProps &props, ALenum param, float val) +void FshifterEffectHandler::SetParamf(FshifterProps &props, ALenum param, float val) { switch(param) { @@ -98,10 +98,10 @@ void EffectHandler::SetParamf(FshifterProps &props, ALenum param, float val) param}; } } -void EffectHandler::SetParamfv(FshifterProps &props, ALenum param, const float *vals) +void FshifterEffectHandler::SetParamfv(FshifterProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const FshifterProps &props, ALenum param, int *val) +void FshifterEffectHandler::GetParami(const FshifterProps &props, ALenum param, int *val) { switch(param) { @@ -117,10 +117,10 @@ void EffectHandler::GetParami(const FshifterProps &props, ALenum param, int *val "Invalid frequency shifter integer property 0x%04x", param}; } } -void EffectHandler::GetParamiv(const FshifterProps &props, ALenum param, int *vals) +void FshifterEffectHandler::GetParamiv(const FshifterProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const FshifterProps &props, ALenum param, float *val) +void FshifterEffectHandler::GetParamf(const FshifterProps &props, ALenum param, float *val) { switch(param) { @@ -133,7 +133,7 @@ void EffectHandler::GetParamf(const FshifterProps &props, ALenum param, float *v param}; } } -void EffectHandler::GetParamfv(const FshifterProps &props, ALenum param, float *vals) +void FshifterEffectHandler::GetParamfv(const FshifterProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/modulator.cpp b/al/effects/modulator.cpp index a80b59af..856c85a9 100644 --- a/al/effects/modulator.cpp +++ b/al/effects/modulator.cpp @@ -56,7 +56,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps ModulatorEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(ModulatorProps &props, ALenum param, int val) +void ModulatorEffectHandler::SetParami(ModulatorProps &props, ALenum param, int val) { switch(param) { @@ -77,10 +77,10 @@ void EffectHandler::SetParami(ModulatorProps &props, ALenum param, int val) param}; } } -void EffectHandler::SetParamiv(ModulatorProps &props, ALenum param, const int *vals) +void ModulatorEffectHandler::SetParamiv(ModulatorProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(ModulatorProps &props, ALenum param, float val) +void ModulatorEffectHandler::SetParamf(ModulatorProps &props, ALenum param, float val) { switch(param) { @@ -100,10 +100,10 @@ void EffectHandler::SetParamf(ModulatorProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(ModulatorProps &props, ALenum param, const float *vals) +void ModulatorEffectHandler::SetParamfv(ModulatorProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const ModulatorProps &props, ALenum param, int *val) +void ModulatorEffectHandler::GetParami(const ModulatorProps &props, ALenum param, int *val) { switch(param) { @@ -116,9 +116,9 @@ void EffectHandler::GetParami(const ModulatorProps &props, ALenum param, int *va param}; } } -void EffectHandler::GetParamiv(const ModulatorProps &props, ALenum param, int *vals) +void ModulatorEffectHandler::GetParamiv(const ModulatorProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const ModulatorProps &props, ALenum param, float *val) +void ModulatorEffectHandler::GetParamf(const ModulatorProps &props, ALenum param, float *val) { switch(param) { @@ -129,7 +129,7 @@ void EffectHandler::GetParamf(const ModulatorProps &props, ALenum param, float * throw effect_exception{AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const ModulatorProps &props, ALenum param, float *vals) +void ModulatorEffectHandler::GetParamfv(const ModulatorProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/al/effects/null.cpp b/al/effects/null.cpp index 02d24175..2fa9cb6d 100644 --- a/al/effects/null.cpp +++ b/al/effects/null.cpp @@ -24,7 +24,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps NullEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(std::monostate& /*props*/, ALenum param, int /*val*/) +void NullEffectHandler::SetParami(std::monostate& /*props*/, ALenum param, int /*val*/) { switch(param) { @@ -33,7 +33,7 @@ void EffectHandler::SetParami(std::monostate& /*props*/, ALenum param, int /*val param}; } } -void EffectHandler::SetParamiv(std::monostate &props, ALenum param, const int *vals) +void NullEffectHandler::SetParamiv(std::monostate &props, ALenum param, const int *vals) { switch(param) { @@ -41,7 +41,7 @@ void EffectHandler::SetParamiv(std::monostate &props, ALenum param, const int *v SetParami(props, param, *vals); } } -void EffectHandler::SetParamf(std::monostate& /*props*/, ALenum param, float /*val*/) +void NullEffectHandler::SetParamf(std::monostate& /*props*/, ALenum param, float /*val*/) { switch(param) { @@ -50,7 +50,7 @@ void EffectHandler::SetParamf(std::monostate& /*props*/, ALenum param, float /*v param}; } } -void EffectHandler::SetParamfv(std::monostate &props, ALenum param, const float *vals) +void NullEffectHandler::SetParamfv(std::monostate &props, ALenum param, const float *vals) { switch(param) { @@ -59,7 +59,7 @@ void EffectHandler::SetParamfv(std::monostate &props, ALenum param, const float } } -void EffectHandler::GetParami(const std::monostate& /*props*/, ALenum param, int* /*val*/) +void NullEffectHandler::GetParami(const std::monostate& /*props*/, ALenum param, int* /*val*/) { switch(param) { @@ -68,7 +68,7 @@ void EffectHandler::GetParami(const std::monostate& /*props*/, ALenum param, int param}; } } -void EffectHandler::GetParamiv(const std::monostate &props, ALenum param, int *vals) +void NullEffectHandler::GetParamiv(const std::monostate &props, ALenum param, int *vals) { switch(param) { @@ -76,7 +76,7 @@ void EffectHandler::GetParamiv(const std::monostate &props, ALenum param, int *v GetParami(props, param, vals); } } -void EffectHandler::GetParamf(const std::monostate& /*props*/, ALenum param, float* /*val*/) +void NullEffectHandler::GetParamf(const std::monostate& /*props*/, ALenum param, float* /*val*/) { switch(param) { @@ -85,7 +85,7 @@ void EffectHandler::GetParamf(const std::monostate& /*props*/, ALenum param, flo param}; } } -void EffectHandler::GetParamfv(const std::monostate &props, ALenum param, float *vals) +void NullEffectHandler::GetParamfv(const std::monostate &props, ALenum param, float *vals) { switch(param) { diff --git a/al/effects/pshifter.cpp b/al/effects/pshifter.cpp index 7b91dd1f..c408eddc 100644 --- a/al/effects/pshifter.cpp +++ b/al/effects/pshifter.cpp @@ -29,7 +29,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps PshifterEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(PshifterProps &props, ALenum param, int val) +void PshifterEffectHandler::SetParami(PshifterProps &props, ALenum param, int val) { switch(param) { @@ -50,18 +50,18 @@ void EffectHandler::SetParami(PshifterProps &props, ALenum param, int val) param}; } } -void EffectHandler::SetParamiv(PshifterProps &props, ALenum param, const int *vals) +void PshifterEffectHandler::SetParamiv(PshifterProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(PshifterProps&, ALenum param, float) +void PshifterEffectHandler::SetParamf(PshifterProps&, ALenum param, float) { throw effect_exception{AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param}; } -void EffectHandler::SetParamfv(PshifterProps&, ALenum param, const float*) +void PshifterEffectHandler::SetParamfv(PshifterProps&, ALenum param, const float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid pitch shifter float-vector property 0x%04x", param}; } -void EffectHandler::GetParami(const PshifterProps &props, ALenum param, int *val) +void PshifterEffectHandler::GetParami(const PshifterProps &props, ALenum param, int *val) { switch(param) { @@ -73,12 +73,12 @@ void EffectHandler::GetParami(const PshifterProps &props, ALenum param, int *val param}; } } -void EffectHandler::GetParamiv(const PshifterProps &props, ALenum param, int *vals) +void PshifterEffectHandler::GetParamiv(const PshifterProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const PshifterProps&, ALenum param, float*) +void PshifterEffectHandler::GetParamf(const PshifterProps&, ALenum param, float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param}; } -void EffectHandler::GetParamfv(const PshifterProps&, ALenum param, float*) +void PshifterEffectHandler::GetParamfv(const PshifterProps&, ALenum param, float*) { throw effect_exception{AL_INVALID_ENUM, "Invalid pitch shifter float vector-property 0x%04x", param}; diff --git a/al/effects/reverb.cpp b/al/effects/reverb.cpp index 5030e9e9..7954e617 100644 --- a/al/effects/reverb.cpp +++ b/al/effects/reverb.cpp @@ -92,7 +92,7 @@ constexpr EffectProps genDefaultStdProps() noexcept const EffectProps ReverbEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(ReverbProps &props, ALenum param, int val) +void ReverbEffectHandler::SetParami(ReverbProps &props, ALenum param, int val) { switch(param) { @@ -107,9 +107,9 @@ void EffectHandler::SetParami(ReverbProps &props, ALenum param, int val) param}; } } -void EffectHandler::SetParamiv(ReverbProps &props, ALenum param, const int *vals) +void ReverbEffectHandler::SetParamiv(ReverbProps &props, ALenum param, const int *vals) { SetParami(props, param, *vals); } -void EffectHandler::SetParamf(ReverbProps &props, ALenum param, float val) +void ReverbEffectHandler::SetParamf(ReverbProps &props, ALenum param, float val) { switch(param) { @@ -237,7 +237,7 @@ void EffectHandler::SetParamf(ReverbProps &props, ALenum param, float val) throw effect_exception{AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param}; } } -void EffectHandler::SetParamfv(ReverbProps &props, ALenum param, const float *vals) +void ReverbEffectHandler::SetParamfv(ReverbProps &props, ALenum param, const float *vals) { static constexpr auto finite_checker = [](float f) -> bool { return std::isfinite(f); }; al::span values; @@ -262,7 +262,7 @@ void EffectHandler::SetParamfv(ReverbProps &props, ALenum param, const float *va } } -void EffectHandler::GetParami(const ReverbProps &props, ALenum param, int *val) +void ReverbEffectHandler::GetParami(const ReverbProps &props, ALenum param, int *val) { switch(param) { @@ -272,9 +272,9 @@ void EffectHandler::GetParami(const ReverbProps &props, ALenum param, int *val) param}; } } -void EffectHandler::GetParamiv(const ReverbProps &props, ALenum param, int *vals) +void ReverbEffectHandler::GetParamiv(const ReverbProps &props, ALenum param, int *vals) { GetParami(props, param, vals); } -void EffectHandler::GetParamf(const ReverbProps &props, ALenum param, float *val) +void ReverbEffectHandler::GetParamf(const ReverbProps &props, ALenum param, float *val) { switch(param) { @@ -303,7 +303,7 @@ void EffectHandler::GetParamf(const ReverbProps &props, ALenum param, float *val throw effect_exception{AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param}; } } -void EffectHandler::GetParamfv(const ReverbProps &props, ALenum param, float *vals) +void ReverbEffectHandler::GetParamfv(const ReverbProps &props, ALenum param, float *vals) { al::span values; switch(param) @@ -326,7 +326,7 @@ void EffectHandler::GetParamfv(const ReverbProps &props, ALenum param, float *va const EffectProps StdReverbEffectProps{genDefaultStdProps()}; -void EffectHandler::StdReverbSetParami(ReverbProps &props, ALenum param, int val) +void StdReverbEffectHandler::SetParami(ReverbProps &props, ALenum param, int val) { switch(param) { @@ -341,9 +341,9 @@ void EffectHandler::StdReverbSetParami(ReverbProps &props, ALenum param, int val param}; } } -void EffectHandler::StdReverbSetParamiv(ReverbProps &props, ALenum param, const int *vals) -{ StdReverbSetParami(props, param, *vals); } -void EffectHandler::StdReverbSetParamf(ReverbProps &props, ALenum param, float val) +void StdReverbEffectHandler::SetParamiv(ReverbProps &props, ALenum param, const int *vals) +{ SetParami(props, param, *vals); } +void StdReverbEffectHandler::SetParamf(ReverbProps &props, ALenum param, float val) { switch(param) { @@ -423,17 +423,10 @@ void EffectHandler::StdReverbSetParamf(ReverbProps &props, ALenum param, float v throw effect_exception{AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param}; } } -void EffectHandler::StdReverbSetParamfv(ReverbProps &props, ALenum param, const float *vals) -{ - switch(param) - { - default: - StdReverbSetParamf(props, param, *vals); - break; - } -} +void StdReverbEffectHandler::SetParamfv(ReverbProps &props, ALenum param, const float *vals) +{ SetParamf(props, param, *vals); } -void EffectHandler::StdReverbGetParami(const ReverbProps &props, ALenum param, int *val) +void StdReverbEffectHandler::GetParami(const ReverbProps &props, ALenum param, int *val) { switch(param) { @@ -443,9 +436,9 @@ void EffectHandler::StdReverbGetParami(const ReverbProps &props, ALenum param, i param}; } } -void EffectHandler::StdReverbGetParamiv(const ReverbProps &props, ALenum param, int *vals) -{ StdReverbGetParami(props, param, vals); } -void EffectHandler::StdReverbGetParamf(const ReverbProps &props, ALenum param, float *val) +void StdReverbEffectHandler::GetParamiv(const ReverbProps &props, ALenum param, int *vals) +{ GetParami(props, param, vals); } +void StdReverbEffectHandler::GetParamf(const ReverbProps &props, ALenum param, float *val) { switch(param) { @@ -466,15 +459,8 @@ void EffectHandler::StdReverbGetParamf(const ReverbProps &props, ALenum param, f throw effect_exception{AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", param}; } } -void EffectHandler::StdReverbGetParamfv(const ReverbProps &props, ALenum param, float *vals) -{ - switch(param) - { - default: - StdReverbGetParamf(props, param, vals); - break; - } -} +void StdReverbEffectHandler::GetParamfv(const ReverbProps &props, ALenum param, float *vals) +{ GetParamf(props, param, vals); } #ifdef ALSOFT_EAX diff --git a/al/effects/vmorpher.cpp b/al/effects/vmorpher.cpp index 9519f10d..8c66957b 100644 --- a/al/effects/vmorpher.cpp +++ b/al/effects/vmorpher.cpp @@ -138,7 +138,7 @@ constexpr EffectProps genDefaultProps() noexcept const EffectProps VmorpherEffectProps{genDefaultProps()}; -void EffectHandler::SetParami(VmorpherProps &props, ALenum param, int val) +void VmorpherEffectHandler::SetParami(VmorpherProps &props, ALenum param, int val) { switch(param) { @@ -180,12 +180,12 @@ void EffectHandler::SetParami(VmorpherProps &props, ALenum param, int val) param}; } } -void EffectHandler::SetParamiv(VmorpherProps&, ALenum param, const int*) +void VmorpherEffectHandler::SetParamiv(VmorpherProps&, ALenum param, const int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid vocal morpher integer-vector property 0x%04x", param}; } -void EffectHandler::SetParamf(VmorpherProps &props, ALenum param, float val) +void VmorpherEffectHandler::SetParamf(VmorpherProps &props, ALenum param, float val) { switch(param) { @@ -200,10 +200,10 @@ void EffectHandler::SetParamf(VmorpherProps &props, ALenum param, float val) param}; } } -void EffectHandler::SetParamfv(VmorpherProps &props, ALenum param, const float *vals) +void VmorpherEffectHandler::SetParamfv(VmorpherProps &props, ALenum param, const float *vals) { SetParamf(props, param, *vals); } -void EffectHandler::GetParami(const VmorpherProps &props, ALenum param, int* val) +void VmorpherEffectHandler::GetParami(const VmorpherProps &props, ALenum param, int* val) { switch(param) { @@ -218,12 +218,12 @@ void EffectHandler::GetParami(const VmorpherProps &props, ALenum param, int* val param}; } } -void EffectHandler::GetParamiv(const VmorpherProps&, ALenum param, int*) +void VmorpherEffectHandler::GetParamiv(const VmorpherProps&, ALenum param, int*) { throw effect_exception{AL_INVALID_ENUM, "Invalid vocal morpher integer-vector property 0x%04x", param}; } -void EffectHandler::GetParamf(const VmorpherProps &props, ALenum param, float *val) +void VmorpherEffectHandler::GetParamf(const VmorpherProps &props, ALenum param, float *val) { switch(param) { @@ -236,7 +236,7 @@ void EffectHandler::GetParamf(const VmorpherProps &props, ALenum param, float *v param}; } } -void EffectHandler::GetParamfv(const VmorpherProps &props, ALenum param, float *vals) +void VmorpherEffectHandler::GetParamfv(const VmorpherProps &props, ALenum param, float *vals) { GetParamf(props, param, vals); } diff --git a/alc/effects/base.h b/alc/effects/base.h index 9bbbfc71..90b60e50 100644 --- a/alc/effects/base.h +++ b/alc/effects/base.h @@ -19,14 +19,12 @@ EffectStateFactory *CompressorStateFactory_getFactory(); EffectStateFactory *DistortionStateFactory_getFactory(); EffectStateFactory *EchoStateFactory_getFactory(); EffectStateFactory *EqualizerStateFactory_getFactory(); -EffectStateFactory *FlangerStateFactory_getFactory(); EffectStateFactory *FshifterStateFactory_getFactory(); EffectStateFactory *ModulatorStateFactory_getFactory(); EffectStateFactory *PshifterStateFactory_getFactory(); EffectStateFactory* VmorpherStateFactory_getFactory(); -EffectStateFactory *DedicatedDialogStateFactory_getFactory(); -EffectStateFactory *DedicatedLfeStateFactory_getFactory(); +EffectStateFactory *DedicatedStateFactory_getFactory(); EffectStateFactory *ConvolutionStateFactory_getFactory(); diff --git a/alc/effects/chorus.cpp b/alc/effects/chorus.cpp index d0d6fe85..8dfabb88 100644 --- a/alc/effects/chorus.cpp +++ b/alc/effects/chorus.cpp @@ -58,7 +58,7 @@ constexpr auto lcoeffs_nrml = CalcDirectionCoeffs(std::array{-inv_sqrt2, 0.0f, i constexpr auto rcoeffs_nrml = CalcDirectionCoeffs(std::array{ inv_sqrt2, 0.0f, inv_sqrt2}); -struct ChorusState : public EffectState { +struct ChorusState final : public EffectState { std::vector mDelayBuffer; uint mOffset{0}; @@ -94,34 +94,17 @@ struct ChorusState : public EffectState { const float delay, const float depth, const float feedback, const float rate, int phase, const EffectTarget target); - void deviceUpdate(const DeviceBase *device, const BufferStorage*) override - { deviceUpdate(device, ChorusMaxDelay); } + void deviceUpdate(const DeviceBase *device, const BufferStorage*) final; void update(const ContextBase *context, const EffectSlot *slot, const EffectProps *props_, - const EffectTarget target) override - { - auto &props = std::get(*props_); - update(context, slot, props.Waveform, props.Delay, props.Depth, props.Feedback, props.Rate, - props.Phase, target); - } + const EffectTarget target) final; void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) final; }; -struct FlangerState final : public ChorusState { - void deviceUpdate(const DeviceBase *device, const BufferStorage*) final - { ChorusState::deviceUpdate(device, FlangerMaxDelay); } - void update(const ContextBase *context, const EffectSlot *slot, const EffectProps *props_, - const EffectTarget target) final - { - auto &props = std::get(*props_); - ChorusState::update(context, slot, props.Waveform, props.Delay, props.Depth, - props.Feedback, props.Rate, props.Phase, target); - } -}; - -void ChorusState::deviceUpdate(const DeviceBase *Device, const float MaxDelay) +void ChorusState::deviceUpdate(const DeviceBase *Device, const BufferStorage*) { + constexpr auto MaxDelay = std::max(ChorusMaxDelay, FlangerMaxDelay); const auto frequency = static_cast(Device->Frequency); const size_t maxlen{NextPowerOf2(float2uint(MaxDelay*2.0f*frequency) + 1u)}; if(maxlen != mDelayBuffer.size()) @@ -136,10 +119,10 @@ void ChorusState::deviceUpdate(const DeviceBase *Device, const float MaxDelay) } void ChorusState::update(const ContextBase *context, const EffectSlot *slot, - const ChorusWaveform waveform, const float delay, const float depth, const float feedback, - const float rate, int phase, const EffectTarget target) + const EffectProps *props_, const EffectTarget target) { static constexpr int mindelay{MaxResamplerEdge << gCubicTable.sTableBits}; + auto &props = std::get(*props_); /* The LFO depth is scaled to be relative to the sample delay. Clamp the * delay and depth to allow enough padding for resampling. @@ -147,12 +130,12 @@ void ChorusState::update(const ContextBase *context, const EffectSlot *slot, const DeviceBase *device{context->mDevice}; const auto frequency = static_cast(device->Frequency); - mWaveform = waveform; + mWaveform = props.Waveform; - mDelay = std::max(float2int(std::round(delay*frequency*gCubicTable.sTableSteps)), mindelay); - mDepth = std::min(static_cast(mDelay)*depth, static_cast(mDelay-mindelay)); + mDelay = std::max(float2int(std::round(props.Delay*frequency*gCubicTable.sTableSteps)), mindelay); + mDepth = std::min(static_cast(mDelay)*props.Depth, static_cast(mDelay-mindelay)); - mFeedback = feedback; + mFeedback = props.Feedback; /* Gains for left and right sides */ const bool ispairwise{device->mRenderMode == RenderMode::Pairwise}; @@ -163,7 +146,7 @@ void ChorusState::update(const ContextBase *context, const EffectSlot *slot, ComputePanGains(target.Main, lcoeffs, slot->Gain, mGains[0].Target); ComputePanGains(target.Main, rcoeffs, slot->Gain, mGains[1].Target); - if(!(rate > 0.0f)) + if(!(props.Rate > 0.0f)) { mLfoOffset = 0; mLfoRange = 1; @@ -176,7 +159,7 @@ void ChorusState::update(const ContextBase *context, const EffectSlot *slot, * max range to avoid overflow when calculating the displacement. */ static constexpr int range_limit{std::numeric_limits::max()/360 - 180}; - const uint lfo_range{float2uint(std::min(std::round(frequency/rate), float{range_limit}))}; + const uint lfo_range{float2uint(std::min(std::round(frequency/props.Rate), float{range_limit}))}; mLfoOffset = mLfoOffset * lfo_range / mLfoRange; mLfoRange = lfo_range; @@ -191,7 +174,8 @@ void ChorusState::update(const ContextBase *context, const EffectSlot *slot, } /* Calculate lfo phase displacement */ - if(phase < 0) phase = 360 + phase; + auto phase = props.Phase; + if(phase < 0) phase += 360; mLfoDisp = (mLfoRange*static_cast(phase) + 180) / 360; } } @@ -336,15 +320,6 @@ struct ChorusStateFactory final : public EffectStateFactory { { return al::intrusive_ptr{new ChorusState{}}; } }; - -/* Flanger is basically a chorus with a really short delay. They can both use - * the same processing functions, so piggyback flanger on the chorus functions. - */ -struct FlangerStateFactory final : public EffectStateFactory { - al::intrusive_ptr create() override - { return al::intrusive_ptr{new FlangerState{}}; } -}; - } // namespace EffectStateFactory *ChorusStateFactory_getFactory() @@ -352,9 +327,3 @@ EffectStateFactory *ChorusStateFactory_getFactory() static ChorusStateFactory ChorusFactory{}; return &ChorusFactory; } - -EffectStateFactory *FlangerStateFactory_getFactory() -{ - static FlangerStateFactory FlangerFactory{}; - return &FlangerFactory; -} diff --git a/alc/effects/dedicated.cpp b/alc/effects/dedicated.cpp index bb93cab5..df1bd5ed 100644 --- a/alc/effects/dedicated.cpp +++ b/alc/effects/dedicated.cpp @@ -43,7 +43,7 @@ namespace { using uint = unsigned int; -struct DedicatedState : public EffectState { +struct DedicatedState final : public EffectState { /* The "dedicated" effect can output to the real output, so should have * gains for all possible output channels and not just the main ambisonic * buffer. @@ -53,60 +53,53 @@ struct DedicatedState : public EffectState { void deviceUpdate(const DeviceBase *device, const BufferStorage *buffer) final; - void update(const ContextBase *context, const EffectSlot *slot, const EffectProps *props, - const EffectTarget target) override; + void update(const ContextBase *context, const EffectSlot *slot, const EffectProps *props_, + const EffectTarget target) final; void process(const size_t samplesToDo, const al::span samplesIn, const al::span samplesOut) final; }; -struct DedicatedLfeState final : public DedicatedState { - void update(const ContextBase *context, const EffectSlot *slot, const EffectProps *props, - const EffectTarget target) final; -}; - void DedicatedState::deviceUpdate(const DeviceBase*, const BufferStorage*) { std::fill(mCurrentGains.begin(), mCurrentGains.end(), 0.0f); } void DedicatedState::update(const ContextBase*, const EffectSlot *slot, - const EffectProps *props, const EffectTarget target) + const EffectProps *props_, const EffectTarget target) { std::fill(mTargetGains.begin(), mTargetGains.end(), 0.0f); - const float Gain{slot->Gain * std::get(*props).Gain}; + auto &props = std::get(*props_); + const float Gain{slot->Gain * props.Gain}; - /* Dialog goes to the front-center speaker if it exists, otherwise it plays - * from the front-center location. - */ - const size_t idx{target.RealOut ? target.RealOut->ChannelIndex[FrontCenter] - : InvalidChannelIndex}; - if(idx != InvalidChannelIndex) + if(props.Target == DedicatedProps::Dialog) { - mOutTarget = target.RealOut->Buffer; - mTargetGains[idx] = Gain; + /* Dialog goes to the front-center speaker if it exists, otherwise it + * plays from the front-center location. + */ + const size_t idx{target.RealOut ? target.RealOut->ChannelIndex[FrontCenter] + : InvalidChannelIndex}; + if(idx != InvalidChannelIndex) + { + mOutTarget = target.RealOut->Buffer; + mTargetGains[idx] = Gain; + } + else + { + static constexpr auto coeffs = CalcDirectionCoeffs(std::array{0.0f, 0.0f, -1.0f}); + + mOutTarget = target.Main->Buffer; + ComputePanGains(target.Main, coeffs, Gain, mTargetGains); + } } - else + else if(props.Target == DedicatedProps::Lfe) { - static constexpr auto coeffs = CalcDirectionCoeffs(std::array{0.0f, 0.0f, -1.0f}); - - mOutTarget = target.Main->Buffer; - ComputePanGains(target.Main, coeffs, Gain, mTargetGains); - } -} - -void DedicatedLfeState::update(const ContextBase*, const EffectSlot *slot, - const EffectProps *props, const EffectTarget target) -{ - std::fill(mTargetGains.begin(), mTargetGains.end(), 0.0f); - - const float Gain{slot->Gain * std::get(*props).Gain}; - - const size_t idx{target.RealOut ? target.RealOut->ChannelIndex[LFE] : InvalidChannelIndex}; - if(idx != InvalidChannelIndex) - { - mOutTarget = target.RealOut->Buffer; - mTargetGains[idx] = Gain; + const size_t idx{target.RealOut ? target.RealOut->ChannelIndex[LFE] : InvalidChannelIndex}; + if(idx != InvalidChannelIndex) + { + mOutTarget = target.RealOut->Buffer; + mTargetGains[idx] = Gain; + } } } @@ -117,26 +110,15 @@ void DedicatedState::process(const size_t samplesToDo, const al::span create() override { return al::intrusive_ptr{new DedicatedState{}}; } }; -struct DedicatedLfeStateFactory final : public EffectStateFactory { - al::intrusive_ptr create() override - { return al::intrusive_ptr{new DedicatedLfeState{}}; } -}; - } // namespace -EffectStateFactory *DedicatedDialogStateFactory_getFactory() -{ - static DedicatedDialogStateFactory DedicatedFactory{}; - return &DedicatedFactory; -} - -EffectStateFactory *DedicatedLfeStateFactory_getFactory() +EffectStateFactory *DedicatedStateFactory_getFactory() { - static DedicatedLfeStateFactory DedicatedFactory{}; + static DedicatedStateFactory DedicatedFactory{}; return &DedicatedFactory; } diff --git a/core/effects/base.h b/core/effects/base.h index 2e1eaa75..e939afbd 100644 --- a/core/effects/base.h +++ b/core/effects/base.h @@ -100,15 +100,6 @@ struct ChorusProps { float Delay; }; -struct FlangerProps { - ChorusWaveform Waveform; - int Phase; - float Rate; - float Depth; - float Feedback; - float Delay; -}; - struct CompressorProps { bool OnOff; }; @@ -170,11 +161,9 @@ struct VmorpherProps { VMorpherWaveform Waveform; }; -struct DedicatedDialogProps { - float Gain; -}; - -struct DedicatedLfeProps { +struct DedicatedProps { + enum TargetType : bool { Dialog, Lfe }; + TargetType Target; float Gain; }; @@ -187,7 +176,6 @@ using EffectProps = std::variant; -- 2.11.4.GIT