aboutsummaryrefslogtreecommitdiffstats
path: root/al/effects/compressor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/effects/compressor.cpp')
-rw-r--r--al/effects/compressor.cpp230
1 files changed, 62 insertions, 168 deletions
diff --git a/al/effects/compressor.cpp b/al/effects/compressor.cpp
index a18609ca..9824d11b 100644
--- a/al/effects/compressor.cpp
+++ b/al/effects/compressor.cpp
@@ -9,7 +9,6 @@
#ifdef ALSOFT_EAX
#include "alnumeric.h"
-
#include "al/eax/exception.h"
#include "al/eax/utils.h"
#endif // ALSOFT_EAX
@@ -81,94 +80,63 @@ const EffectProps CompressorEffectProps{genDefaultProps()};
#ifdef ALSOFT_EAX
namespace {
-using EaxCompressorEffectDirtyFlagsValue = std::uint_least8_t;
-
-struct EaxCompressorEffectDirtyFlags
+class EaxCompressorEffectException : public EaxException
{
- using EaxIsBitFieldStruct = bool;
-
- EaxCompressorEffectDirtyFlagsValue ulOnOff : 1;
-}; // EaxCompressorEffectDirtyFlags
-
+public:
+ explicit EaxCompressorEffectException(const char* message)
+ : EaxException{"EAX_COMPRESSOR_EFFECT", message}
+ {}
+}; // EaxCompressorEffectException
-class EaxCompressorEffect final :
- public EaxEffect
+class EaxCompressorEffect final : public EaxEffect4<EaxCompressorEffectException, EAXAGCCOMPRESSORPROPERTIES>
{
public:
- EaxCompressorEffect();
-
-
- void dispatch(const EaxEaxCall& eax_call) override;
-
- // [[nodiscard]]
- bool apply_deferred() override;
+ EaxCompressorEffect(const EaxCall& call);
private:
- EAXAGCCOMPRESSORPROPERTIES eax_{};
- EAXAGCCOMPRESSORPROPERTIES eax_d_{};
- EaxCompressorEffectDirtyFlags eax_dirty_flags_{};
-
-
- void set_eax_defaults();
-
- void set_efx_on_off();
- void set_efx_defaults();
-
- void get(const EaxEaxCall& eax_call);
-
- void validate_on_off(unsigned long ulOnOff);
- void validate_all(const EAXAGCCOMPRESSORPROPERTIES& eax_all);
-
- void defer_on_off(unsigned long ulOnOff);
- void defer_all(const EAXAGCCOMPRESSORPROPERTIES& eax_all);
-
- void defer_on_off(const EaxEaxCall& eax_call);
- void defer_all(const EaxEaxCall& eax_call);
-
- void set(const EaxEaxCall& eax_call);
+ struct OnOffValidator {
+ void operator()(unsigned long ulOnOff) const
+ {
+ eax_validate_range<Exception>(
+ "On-Off",
+ ulOnOff,
+ EAXAGCCOMPRESSOR_MINONOFF,
+ EAXAGCCOMPRESSOR_MAXONOFF);
+ }
+ }; // OnOffValidator
+
+ struct AllValidator {
+ void operator()(const Props& all) const
+ {
+ OnOffValidator{}(all.ulOnOff);
+ }
+ }; // AllValidator
+
+ void set_defaults(Props& props) override;
+
+ void set_efx_on_off() noexcept;
+ void set_efx_defaults() override;
+
+ void get(const EaxCall& call, const Props& props) override;
+ void set(const EaxCall& call, Props& props) override;
+ bool commit_props(const Props& props) override;
}; // EaxCompressorEffect
+EaxCompressorEffect::EaxCompressorEffect(const EaxCall& call)
+ : EaxEffect4{AL_EFFECT_COMPRESSOR, call}
+{}
-class EaxCompressorEffectException :
- public EaxException
+void EaxCompressorEffect::set_defaults(Props& props)
{
-public:
- explicit EaxCompressorEffectException(
- const char* message)
- :
- EaxException{"EAX_COMPRESSOR_EFFECT", message}
- {
- }
-}; // EaxCompressorEffectException
-
-
-EaxCompressorEffect::EaxCompressorEffect()
- : EaxEffect{AL_EFFECT_COMPRESSOR}
-{
- set_eax_defaults();
- set_efx_defaults();
-}
-
-// [[nodiscard]]
-void EaxCompressorEffect::dispatch(const EaxEaxCall& eax_call)
-{
- eax_call.is_get() ? get(eax_call) : set(eax_call);
-}
-
-void EaxCompressorEffect::set_eax_defaults()
-{
- eax_.ulOnOff = EAXAGCCOMPRESSOR_DEFAULTONOFF;
-
- eax_d_ = eax_;
+ props.ulOnOff = EAXAGCCOMPRESSOR_DEFAULTONOFF;
}
-void EaxCompressorEffect::set_efx_on_off()
+void EaxCompressorEffect::set_efx_on_off() noexcept
{
const auto on_off = clamp(
- static_cast<ALint>(eax_.ulOnOff),
+ static_cast<ALint>(props_.ulOnOff),
AL_COMPRESSOR_MIN_ONOFF,
AL_COMPRESSOR_MAX_ONOFF);
-
al_effect_props_.Compressor.OnOff = (on_off != AL_FALSE);
}
@@ -177,120 +145,46 @@ void EaxCompressorEffect::set_efx_defaults()
set_efx_on_off();
}
-void EaxCompressorEffect::get(const EaxEaxCall& eax_call)
+void EaxCompressorEffect::get(const EaxCall& call, const Props& props)
{
- switch(eax_call.get_property_id())
+ switch(call.get_property_id())
{
- case EAXAGCCOMPRESSOR_NONE:
- break;
-
- case EAXAGCCOMPRESSOR_ALLPARAMETERS:
- eax_call.set_value<EaxCompressorEffectException>(eax_);
- break;
-
- case EAXAGCCOMPRESSOR_ONOFF:
- eax_call.set_value<EaxCompressorEffectException>(eax_.ulOnOff);
- break;
-
- default:
- throw EaxCompressorEffectException{"Unsupported property id."};
+ case EAXAGCCOMPRESSOR_NONE: break;
+ case EAXAGCCOMPRESSOR_ALLPARAMETERS: call.set_value<Exception>(props); break;
+ case EAXAGCCOMPRESSOR_ONOFF: call.set_value<Exception>(props.ulOnOff); break;
+ default: fail_unknown_property_id();
}
}
-void EaxCompressorEffect::validate_on_off(
- unsigned long ulOnOff)
-{
- eax_validate_range<EaxCompressorEffectException>(
- "On-Off",
- ulOnOff,
- EAXAGCCOMPRESSOR_MINONOFF,
- EAXAGCCOMPRESSOR_MAXONOFF);
-}
-
-void EaxCompressorEffect::validate_all(
- const EAXAGCCOMPRESSORPROPERTIES& eax_all)
+void EaxCompressorEffect::set(const EaxCall& call, Props& props)
{
- validate_on_off(eax_all.ulOnOff);
-}
-
-void EaxCompressorEffect::defer_on_off(
- unsigned long ulOnOff)
-{
- eax_d_.ulOnOff = ulOnOff;
- eax_dirty_flags_.ulOnOff = (eax_.ulOnOff != eax_d_.ulOnOff);
-}
-
-void EaxCompressorEffect::defer_all(
- const EAXAGCCOMPRESSORPROPERTIES& eax_all)
-{
- defer_on_off(eax_all.ulOnOff);
-}
-
-void EaxCompressorEffect::defer_on_off(
- const EaxEaxCall& eax_call)
-{
- const auto& on_off =
- eax_call.get_value<EaxCompressorEffectException, const decltype(EAXAGCCOMPRESSORPROPERTIES::ulOnOff)>();
-
- validate_on_off(on_off);
- defer_on_off(on_off);
-}
-
-void EaxCompressorEffect::defer_all(
- const EaxEaxCall& eax_call)
-{
- const auto& all =
- eax_call.get_value<EaxCompressorEffectException, const EAXAGCCOMPRESSORPROPERTIES>();
-
- validate_all(all);
- defer_all(all);
-}
-
-// [[nodiscard]]
-bool EaxCompressorEffect::apply_deferred()
-{
- if (eax_dirty_flags_ == EaxCompressorEffectDirtyFlags{})
+ switch(call.get_property_id())
{
- return false;
+ case EAXAGCCOMPRESSOR_NONE: break;
+ case EAXAGCCOMPRESSOR_ALLPARAMETERS: defer<AllValidator>(call, props); break;
+ case EAXAGCCOMPRESSOR_ONOFF: defer<OnOffValidator>(call, props.ulOnOff); break;
+ default: fail_unknown_property_id();
}
+}
- eax_ = eax_d_;
+bool EaxCompressorEffect::commit_props(const Props& props)
+{
+ auto is_dirty = false;
- if (eax_dirty_flags_.ulOnOff)
+ if (props_.ulOnOff != props.ulOnOff)
{
+ is_dirty = true;
set_efx_on_off();
}
- eax_dirty_flags_ = EaxCompressorEffectDirtyFlags{};
-
- return true;
-}
-
-void EaxCompressorEffect::set(const EaxEaxCall& eax_call)
-{
- switch(eax_call.get_property_id())
- {
- case EAXAGCCOMPRESSOR_NONE:
- break;
-
- case EAXAGCCOMPRESSOR_ALLPARAMETERS:
- defer_all(eax_call);
- break;
-
- case EAXAGCCOMPRESSOR_ONOFF:
- defer_on_off(eax_call);
- break;
-
- default:
- throw EaxCompressorEffectException{"Unsupported property id."};
- }
+ return is_dirty;
}
} // namespace
-EaxEffectUPtr eax_create_eax_compressor_effect()
+EaxEffectUPtr eax_create_eax_compressor_effect(const EaxCall& call)
{
- return std::make_unique<EaxCompressorEffect>();
+ return eax_create_eax4_effect<EaxCompressorEffect>(call);
}
#endif // ALSOFT_EAX