diff options
author | Chris Robinson <[email protected]> | 2023-03-11 16:19:48 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2023-03-11 16:24:01 -0800 |
commit | 028e7eff52a4d0b7b7c023832d2792bb56fef0d1 (patch) | |
tree | 6a3f5fab8506148f6fe7b8f4bc9c3077295f355c /al/effects/pshifter.cpp | |
parent | 96b3d98ac330a29e34f4161f9c0e9d1daa05994e (diff) |
Convert the remaining EAX effects
Diffstat (limited to 'al/effects/pshifter.cpp')
-rw-r--r-- | al/effects/pshifter.cpp | 190 |
1 files changed, 75 insertions, 115 deletions
diff --git a/al/effects/pshifter.cpp b/al/effects/pshifter.cpp index 524585a2..53115edb 100644 --- a/al/effects/pshifter.cpp +++ b/al/effects/pshifter.cpp @@ -92,141 +92,101 @@ const EffectProps PshifterEffectProps{genDefaultProps()}; #ifdef ALSOFT_EAX namespace { -class EaxPitchShifterEffectException : public EaxException -{ -public: - explicit EaxPitchShifterEffectException(const char* message) - : EaxException{"EAX_PITCH_SHIFTER_EFFECT", message} - {} -}; // EaxPitchShifterEffectException - -class EaxPitchShifterEffect final : public EaxEffect4<EaxPitchShifterEffectException> { -public: - EaxPitchShifterEffect(int eax_version); - -private: - struct CoarseTuneValidator { - void operator()(long lCoarseTune) const - { - eax_validate_range<Exception>( - "Coarse Tune", - lCoarseTune, - EAXPITCHSHIFTER_MINCOARSETUNE, - EAXPITCHSHIFTER_MAXCOARSETUNE); - } - }; // CoarseTuneValidator - - struct FineTuneValidator { - void operator()(long lFineTune) const - { - eax_validate_range<Exception>( - "Fine Tune", - lFineTune, - EAXPITCHSHIFTER_MINFINETUNE, - EAXPITCHSHIFTER_MAXFINETUNE); - } - }; // FineTuneValidator - - struct AllValidator { - void operator()(const EAXPITCHSHIFTERPROPERTIES& all) const - { - CoarseTuneValidator{}(all.lCoarseTune); - FineTuneValidator{}(all.lFineTune); - } - }; // AllValidator - - void set_defaults(Props4& props) override; - - void set_efx_coarse_tune() noexcept; - void set_efx_fine_tune() noexcept; - void set_efx_defaults() override; - - void get(const EaxCall& call, const Props4& props) override; - void set(const EaxCall& call, Props4& props) override; - bool commit_props(const Props4& old_i) override; -}; // EaxPitchShifterEffect - -EaxPitchShifterEffect::EaxPitchShifterEffect(int eax_version) - : EaxEffect4{AL_EFFECT_PITCH_SHIFTER, eax_version} -{} - -void EaxPitchShifterEffect::set_defaults(Props4& props) -{ - props.mType = EaxEffectType::PitchShifter; - props.mPitchShifter.lCoarseTune = EAXPITCHSHIFTER_DEFAULTCOARSETUNE; - props.mPitchShifter.lFineTune = EAXPITCHSHIFTER_DEFAULTFINETUNE; -} +using PitchShifterCommitter = EaxCommitter<EaxPitchShifterCommitter>; -void EaxPitchShifterEffect::set_efx_coarse_tune() noexcept -{ - al_effect_props_.Pshifter.CoarseTune = clamp( - static_cast<ALint>(props_.mPitchShifter.lCoarseTune), - AL_PITCH_SHIFTER_MIN_COARSE_TUNE, - AL_PITCH_SHIFTER_MAX_COARSE_TUNE); -} +struct CoarseTuneValidator { + void operator()(long lCoarseTune) const + { + eax_validate_range<PitchShifterCommitter::Exception>( + "Coarse Tune", + lCoarseTune, + EAXPITCHSHIFTER_MINCOARSETUNE, + EAXPITCHSHIFTER_MAXCOARSETUNE); + } +}; // CoarseTuneValidator -void EaxPitchShifterEffect::set_efx_fine_tune() noexcept +struct FineTuneValidator { + void operator()(long lFineTune) const + { + eax_validate_range<PitchShifterCommitter::Exception>( + "Fine Tune", + lFineTune, + EAXPITCHSHIFTER_MINFINETUNE, + EAXPITCHSHIFTER_MAXFINETUNE); + } +}; // FineTuneValidator + +struct AllValidator { + void operator()(const EAXPITCHSHIFTERPROPERTIES& all) const + { + CoarseTuneValidator{}(all.lCoarseTune); + FineTuneValidator{}(all.lFineTune); + } +}; // AllValidator + +} // namespace + +template<> +struct PitchShifterCommitter::Exception : public EaxException { + explicit Exception(const char *message) : EaxException{"EAX_PITCH_SHIFTER_EFFECT", message} + { } +}; + +template<> +[[noreturn]] void PitchShifterCommitter::fail(const char *message) { - al_effect_props_.Pshifter.FineTune = clamp( - static_cast<ALint>(props_.mPitchShifter.lFineTune), - AL_PITCH_SHIFTER_MIN_FINE_TUNE, - AL_PITCH_SHIFTER_MAX_FINE_TUNE); + throw Exception{message}; } -void EaxPitchShifterEffect::set_efx_defaults() +template<> +bool PitchShifterCommitter::commit(const EaxEffectProps &props) { - set_efx_coarse_tune(); - set_efx_fine_tune(); + const auto orig = props_; + props_ = props; + + if(orig.mType == props_.mType + && props_.mPitchShifter.lCoarseTune == props.mPitchShifter.lCoarseTune + && props_.mPitchShifter.lFineTune == props.mPitchShifter.lFineTune) + return false; + + al_effect_props_.Pshifter.CoarseTune = static_cast<ALint>(props_.mPitchShifter.lCoarseTune); + al_effect_props_.Pshifter.FineTune = static_cast<ALint>(props_.mPitchShifter.lFineTune); + + return true; } -void EaxPitchShifterEffect::get(const EaxCall& call, const Props4& props) +template<> +void PitchShifterCommitter::SetDefaults(EaxEffectProps &props) { - switch(call.get_property_id()) - { - case EAXPITCHSHIFTER_NONE: break; - case EAXPITCHSHIFTER_ALLPARAMETERS: call.set_value<Exception>(props.mPitchShifter); break; - case EAXPITCHSHIFTER_COARSETUNE: call.set_value<Exception>(props.mPitchShifter.lCoarseTune); break; - case EAXPITCHSHIFTER_FINETUNE: call.set_value<Exception>(props.mPitchShifter.lFineTune); break; - default: fail_unknown_property_id(); - } + props.mType = EaxEffectType::PitchShifter; + props.mPitchShifter.lCoarseTune = EAXPITCHSHIFTER_DEFAULTCOARSETUNE; + props.mPitchShifter.lFineTune = EAXPITCHSHIFTER_DEFAULTFINETUNE; } -void EaxPitchShifterEffect::set(const EaxCall& call, Props4& props) +template<> +void PitchShifterCommitter::Get(const EaxCall &call, const EaxEffectProps &props) { switch(call.get_property_id()) { - case EAXPITCHSHIFTER_NONE: break; - case EAXPITCHSHIFTER_ALLPARAMETERS: defer<AllValidator>(call, props.mPitchShifter); break; - case EAXPITCHSHIFTER_COARSETUNE: defer<CoarseTuneValidator>(call, props.mPitchShifter.lCoarseTune); break; - case EAXPITCHSHIFTER_FINETUNE: defer<FineTuneValidator>(call, props.mPitchShifter.lFineTune); break; - default: fail_unknown_property_id(); + case EAXPITCHSHIFTER_NONE: break; + case EAXPITCHSHIFTER_ALLPARAMETERS: call.set_value<Exception>(props.mPitchShifter); break; + case EAXPITCHSHIFTER_COARSETUNE: call.set_value<Exception>(props.mPitchShifter.lCoarseTune); break; + case EAXPITCHSHIFTER_FINETUNE: call.set_value<Exception>(props.mPitchShifter.lFineTune); break; + default: fail_unknown_property_id(); } } -bool EaxPitchShifterEffect::commit_props(const Props4& props) +template<> +void PitchShifterCommitter::Set(const EaxCall &call, EaxEffectProps &props) { - auto is_dirty = false; - - if (props_.mPitchShifter.lCoarseTune != props.mPitchShifter.lCoarseTune) - { - is_dirty = true; - set_efx_coarse_tune(); - } - - if (props_.mPitchShifter.lFineTune != props.mPitchShifter.lFineTune) + switch(call.get_property_id()) { - is_dirty = true; - set_efx_fine_tune(); + case EAXPITCHSHIFTER_NONE: break; + case EAXPITCHSHIFTER_ALLPARAMETERS: defer<AllValidator>(call, props.mPitchShifter); break; + case EAXPITCHSHIFTER_COARSETUNE: defer<CoarseTuneValidator>(call, props.mPitchShifter.lCoarseTune); break; + case EAXPITCHSHIFTER_FINETUNE: defer<FineTuneValidator>(call, props.mPitchShifter.lFineTune); break; + default: fail_unknown_property_id(); } - - return is_dirty; -} - -} // namespace - -EaxEffectUPtr eax_create_eax_pitch_shifter_effect(int eax_version) -{ - return eax_create_eax4_effect<EaxPitchShifterEffect>(eax_version); } #endif // ALSOFT_EAX |