aboutsummaryrefslogtreecommitdiffstats
path: root/al/effects/autowah.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/effects/autowah.cpp')
-rw-r--r--al/effects/autowah.cpp283
1 files changed, 121 insertions, 162 deletions
diff --git a/al/effects/autowah.cpp b/al/effects/autowah.cpp
index 22c3ab9f..532d7276 100644
--- a/al/effects/autowah.cpp
+++ b/al/effects/autowah.cpp
@@ -118,202 +118,161 @@ const EffectProps AutowahEffectProps{genDefaultProps()};
#ifdef ALSOFT_EAX
namespace {
-class EaxAutoWahEffectException : public EaxException {
-public:
- explicit EaxAutoWahEffectException(const char* message)
- : EaxException{"EAX_AUTO_WAH_EFFECT", message}
- {}
-}; // EaxAutoWahEffectException
-
-class EaxAutoWahEffect final : public EaxEffect4<EaxAutoWahEffectException> {
-public:
- EaxAutoWahEffect(int eax_version);
-
-private:
- struct AttackTimeValidator {
- void operator()(float flAttackTime) const
- {
- eax_validate_range<Exception>(
- "Attack Time",
- flAttackTime,
- EAXAUTOWAH_MINATTACKTIME,
- EAXAUTOWAH_MAXATTACKTIME);
- }
- }; // AttackTimeValidator
-
- struct ReleaseTimeValidator {
- void operator()(float flReleaseTime) const
- {
- eax_validate_range<Exception>(
- "Release Time",
- flReleaseTime,
- EAXAUTOWAH_MINRELEASETIME,
- EAXAUTOWAH_MAXRELEASETIME);
- }
- }; // ReleaseTimeValidator
-
- struct ResonanceValidator {
- void operator()(long lResonance) const
- {
- eax_validate_range<Exception>(
- "Resonance",
- lResonance,
- EAXAUTOWAH_MINRESONANCE,
- EAXAUTOWAH_MAXRESONANCE);
- }
- }; // ResonanceValidator
-
- struct PeakLevelValidator {
- void operator()(long lPeakLevel) const
- {
- eax_validate_range<Exception>(
- "Peak Level",
- lPeakLevel,
- EAXAUTOWAH_MINPEAKLEVEL,
- EAXAUTOWAH_MAXPEAKLEVEL);
- }
- }; // PeakLevelValidator
-
- struct AllValidator {
- void operator()(const EAXAUTOWAHPROPERTIES& all) const
- {
- AttackTimeValidator{}(all.flAttackTime);
- ReleaseTimeValidator{}(all.flReleaseTime);
- ResonanceValidator{}(all.lResonance);
- PeakLevelValidator{}(all.lPeakLevel);
- }
- }; // AllValidator
-
- void set_defaults(Props4& props) override;
-
- void set_efx_attack_time() noexcept;
- void set_efx_release_time() noexcept;
- void set_efx_resonance() noexcept;
- void set_efx_peak_gain() 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& props) override;
-}; // EaxAutoWahEffect
-
-EaxAutoWahEffect::EaxAutoWahEffect(int eax_version)
- : EaxEffect4{AL_EFFECT_AUTOWAH, eax_version}
-{}
-
-void EaxAutoWahEffect::set_defaults(Props4& props)
-{
- props.mType = EaxEffectType::Autowah;
- props.mAutowah.flAttackTime = EAXAUTOWAH_DEFAULTATTACKTIME;
- props.mAutowah.flReleaseTime = EAXAUTOWAH_DEFAULTRELEASETIME;
- props.mAutowah.lResonance = EAXAUTOWAH_DEFAULTRESONANCE;
- props.mAutowah.lPeakLevel = EAXAUTOWAH_DEFAULTPEAKLEVEL;
-}
-
-void EaxAutoWahEffect::set_efx_attack_time() noexcept
-{
- al_effect_props_.Autowah.AttackTime = clamp(
- props_.mAutowah.flAttackTime,
- AL_AUTOWAH_MIN_ATTACK_TIME,
- AL_AUTOWAH_MAX_ATTACK_TIME);
-}
-
-void EaxAutoWahEffect::set_efx_release_time() noexcept
-{
- al_effect_props_.Autowah.ReleaseTime = clamp(
- props_.mAutowah.flReleaseTime,
- AL_AUTOWAH_MIN_RELEASE_TIME,
- AL_AUTOWAH_MAX_RELEASE_TIME);
-}
+using AutowahCommitter = EaxCommitter<EaxAutowahCommitter>;
-void EaxAutoWahEffect::set_efx_resonance() noexcept
-{
- al_effect_props_.Autowah.Resonance = clamp(
- level_mb_to_gain(static_cast<float>(props_.mAutowah.lResonance)),
- AL_AUTOWAH_MIN_RESONANCE,
- AL_AUTOWAH_MAX_RESONANCE);
-}
+struct AttackTimeValidator {
+ void operator()(float flAttackTime) const
+ {
+ eax_validate_range<AutowahCommitter::Exception>(
+ "Attack Time",
+ flAttackTime,
+ EAXAUTOWAH_MINATTACKTIME,
+ EAXAUTOWAH_MAXATTACKTIME);
+ }
+}; // AttackTimeValidator
-void EaxAutoWahEffect::set_efx_peak_gain() noexcept
-{
- al_effect_props_.Autowah.PeakGain = clamp(
- level_mb_to_gain(static_cast<float>(props_.mAutowah.lPeakLevel)),
- AL_AUTOWAH_MIN_PEAK_GAIN,
- AL_AUTOWAH_MAX_PEAK_GAIN);
-}
+struct ReleaseTimeValidator {
+ void operator()(float flReleaseTime) const
+ {
+ eax_validate_range<AutowahCommitter::Exception>(
+ "Release Time",
+ flReleaseTime,
+ EAXAUTOWAH_MINRELEASETIME,
+ EAXAUTOWAH_MAXRELEASETIME);
+ }
+}; // ReleaseTimeValidator
-void EaxAutoWahEffect::set_efx_defaults()
-{
- set_efx_attack_time();
- set_efx_release_time();
- set_efx_resonance();
- set_efx_peak_gain();
-}
+struct ResonanceValidator {
+ void operator()(long lResonance) const
+ {
+ eax_validate_range<AutowahCommitter::Exception>(
+ "Resonance",
+ lResonance,
+ EAXAUTOWAH_MINRESONANCE,
+ EAXAUTOWAH_MAXRESONANCE);
+ }
+}; // ResonanceValidator
-void EaxAutoWahEffect::get(const EaxCall& call, const Props4& props)
-{
- switch (call.get_property_id())
+struct PeakLevelValidator {
+ void operator()(long lPeakLevel) const
{
- case EAXAUTOWAH_NONE: break;
- case EAXAUTOWAH_ALLPARAMETERS: call.set_value<Exception>(props.mAutowah); break;
- case EAXAUTOWAH_ATTACKTIME: call.set_value<Exception>(props.mAutowah.flAttackTime); break;
- case EAXAUTOWAH_RELEASETIME: call.set_value<Exception>(props.mAutowah.flReleaseTime); break;
- case EAXAUTOWAH_RESONANCE: call.set_value<Exception>(props.mAutowah.lResonance); break;
- case EAXAUTOWAH_PEAKLEVEL: call.set_value<Exception>(props.mAutowah.lPeakLevel); break;
- default: fail_unknown_property_id();
+ eax_validate_range<AutowahCommitter::Exception>(
+ "Peak Level",
+ lPeakLevel,
+ EAXAUTOWAH_MINPEAKLEVEL,
+ EAXAUTOWAH_MAXPEAKLEVEL);
}
-}
+}; // PeakLevelValidator
-void EaxAutoWahEffect::set(const EaxCall& call, Props4& props)
-{
- switch (call.get_property_id())
+struct AllValidator {
+ void operator()(const EAXAUTOWAHPROPERTIES& all) const
{
- case EAXAUTOWAH_NONE: break;
- case EAXAUTOWAH_ALLPARAMETERS: defer<AllValidator>(call, props.mAutowah); break;
- case EAXAUTOWAH_ATTACKTIME: defer<AttackTimeValidator>(call, props.mAutowah.flAttackTime); break;
- case EAXAUTOWAH_RELEASETIME: defer<ReleaseTimeValidator>(call, props.mAutowah.flReleaseTime); break;
- case EAXAUTOWAH_RESONANCE: defer<ResonanceValidator>(call, props.mAutowah.lResonance); break;
- case EAXAUTOWAH_PEAKLEVEL: defer<PeakLevelValidator>(call, props.mAutowah.lPeakLevel); break;
- default: fail_unknown_property_id();
+ AttackTimeValidator{}(all.flAttackTime);
+ ReleaseTimeValidator{}(all.flReleaseTime);
+ ResonanceValidator{}(all.lResonance);
+ PeakLevelValidator{}(all.lPeakLevel);
}
+}; // AllValidator
+
+} // namespace
+
+template<>
+struct AutowahCommitter::Exception : public EaxException
+{
+ explicit Exception(const char *message) : EaxException{"EAX_AUTOWAH_EFFECT", message}
+ { }
+};
+
+template<>
+[[noreturn]] void AutowahCommitter::fail(const char *message)
+{
+ throw Exception{message};
}
-bool EaxAutoWahEffect::commit_props(const Props4& props)
+template<>
+bool AutowahCommitter::commit(const EaxEffectProps &props)
{
- auto is_dirty = false;
+ const auto orig = props_;
+ props_ = props;
- if (props_.mAutowah.flAttackTime != props.mAutowah.flAttackTime)
+ auto is_dirty = bool{orig.mType != props_.mType};
+ if(props_.mAutowah.flAttackTime != props.mAutowah.flAttackTime)
{
is_dirty = true;
- set_efx_attack_time();
+ al_effect_props_.Autowah.AttackTime = clamp(
+ props_.mAutowah.flAttackTime,
+ AL_AUTOWAH_MIN_ATTACK_TIME,
+ AL_AUTOWAH_MAX_ATTACK_TIME);
}
- if (props_.mAutowah.flReleaseTime != props.mAutowah.flReleaseTime)
+ if(props_.mAutowah.flReleaseTime != props.mAutowah.flReleaseTime)
{
is_dirty = true;
- set_efx_release_time();
+ al_effect_props_.Autowah.ReleaseTime = clamp(
+ props_.mAutowah.flReleaseTime,
+ AL_AUTOWAH_MIN_RELEASE_TIME,
+ AL_AUTOWAH_MAX_RELEASE_TIME);
}
- if (props_.mAutowah.lResonance != props.mAutowah.lResonance)
+ if(props_.mAutowah.lResonance != props.mAutowah.lResonance)
{
is_dirty = true;
- set_efx_resonance();
+ al_effect_props_.Autowah.Resonance = clamp(
+ level_mb_to_gain(static_cast<float>(props_.mAutowah.lResonance)),
+ AL_AUTOWAH_MIN_RESONANCE,
+ AL_AUTOWAH_MAX_RESONANCE);
}
- if (props_.mAutowah.lPeakLevel != props.mAutowah.lPeakLevel)
+ if(props_.mAutowah.lPeakLevel != props.mAutowah.lPeakLevel)
{
is_dirty = true;
- set_efx_peak_gain();
+ al_effect_props_.Autowah.PeakGain = clamp(
+ level_mb_to_gain(static_cast<float>(props_.mAutowah.lPeakLevel)),
+ AL_AUTOWAH_MIN_PEAK_GAIN,
+ AL_AUTOWAH_MAX_PEAK_GAIN);
}
return is_dirty;
}
-} // namespace
+template<>
+void AutowahCommitter::SetDefaults(EaxEffectProps &props)
+{
+ props.mType = EaxEffectType::Autowah;
+ props.mAutowah.flAttackTime = EAXAUTOWAH_DEFAULTATTACKTIME;
+ props.mAutowah.flReleaseTime = EAXAUTOWAH_DEFAULTRELEASETIME;
+ props.mAutowah.lResonance = EAXAUTOWAH_DEFAULTRESONANCE;
+ props.mAutowah.lPeakLevel = EAXAUTOWAH_DEFAULTPEAKLEVEL;
+}
+
+template<>
+void AutowahCommitter::Get(const EaxCall &call, const EaxEffectProps &props)
+{
+ switch(call.get_property_id())
+ {
+ case EAXAUTOWAH_NONE: break;
+ case EAXAUTOWAH_ALLPARAMETERS: call.set_value<Exception>(props.mAutowah); break;
+ case EAXAUTOWAH_ATTACKTIME: call.set_value<Exception>(props.mAutowah.flAttackTime); break;
+ case EAXAUTOWAH_RELEASETIME: call.set_value<Exception>(props.mAutowah.flReleaseTime); break;
+ case EAXAUTOWAH_RESONANCE: call.set_value<Exception>(props.mAutowah.lResonance); break;
+ case EAXAUTOWAH_PEAKLEVEL: call.set_value<Exception>(props.mAutowah.lPeakLevel); break;
+ default: fail_unknown_property_id();
+ }
+}
-EaxEffectUPtr eax_create_eax_auto_wah_effect(int eax_version)
+template<>
+void AutowahCommitter::Set(const EaxCall &call, EaxEffectProps &props)
{
- return eax_create_eax4_effect<EaxAutoWahEffect>(eax_version);
+ switch(call.get_property_id())
+ {
+ case EAXAUTOWAH_NONE: break;
+ case EAXAUTOWAH_ALLPARAMETERS: defer<AllValidator>(call, props.mAutowah); break;
+ case EAXAUTOWAH_ATTACKTIME: defer<AttackTimeValidator>(call, props.mAutowah.flAttackTime); break;
+ case EAXAUTOWAH_RELEASETIME: defer<ReleaseTimeValidator>(call, props.mAutowah.flReleaseTime); break;
+ case EAXAUTOWAH_RESONANCE: defer<ResonanceValidator>(call, props.mAutowah.lResonance); break;
+ case EAXAUTOWAH_PEAKLEVEL: defer<PeakLevelValidator>(call, props.mAutowah.lPeakLevel); break;
+ default: fail_unknown_property_id();
+ }
}
#endif // ALSOFT_EAX