aboutsummaryrefslogtreecommitdiffstats
path: root/al/effects/pshifter.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-03-11 16:19:48 -0800
committerChris Robinson <[email protected]>2023-03-11 16:24:01 -0800
commit028e7eff52a4d0b7b7c023832d2792bb56fef0d1 (patch)
tree6a3f5fab8506148f6fe7b8f4bc9c3077295f355c /al/effects/pshifter.cpp
parent96b3d98ac330a29e34f4161f9c0e9d1daa05994e (diff)
Convert the remaining EAX effects
Diffstat (limited to 'al/effects/pshifter.cpp')
-rw-r--r--al/effects/pshifter.cpp190
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