diff options
Diffstat (limited to 'al/effects/compressor.cpp')
-rw-r--r-- | al/effects/compressor.cpp | 230 |
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 |