7 #include "alc/effects/base.h"
11 #include "alnumeric.h"
13 #include "al/eax_exception.h"
14 #include "al/eax_utils.h"
20 void Compressor_setParami(EffectProps
*props
, ALenum param
, int val
)
24 case AL_COMPRESSOR_ONOFF
:
25 if(!(val
>= AL_COMPRESSOR_MIN_ONOFF
&& val
<= AL_COMPRESSOR_MAX_ONOFF
))
26 throw effect_exception
{AL_INVALID_VALUE
, "Compressor state out of range"};
27 props
->Compressor
.OnOff
= (val
!= AL_FALSE
);
31 throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor integer property 0x%04x",
35 void Compressor_setParamiv(EffectProps
*props
, ALenum param
, const int *vals
)
36 { Compressor_setParami(props
, param
, vals
[0]); }
37 void Compressor_setParamf(EffectProps
*, ALenum param
, float)
38 { throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor float property 0x%04x", param
}; }
39 void Compressor_setParamfv(EffectProps
*, ALenum param
, const float*)
41 throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor float-vector property 0x%04x",
45 void Compressor_getParami(const EffectProps
*props
, ALenum param
, int *val
)
49 case AL_COMPRESSOR_ONOFF
:
50 *val
= props
->Compressor
.OnOff
;
54 throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor integer property 0x%04x",
58 void Compressor_getParamiv(const EffectProps
*props
, ALenum param
, int *vals
)
59 { Compressor_getParami(props
, param
, vals
); }
60 void Compressor_getParamf(const EffectProps
*, ALenum param
, float*)
61 { throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor float property 0x%04x", param
}; }
62 void Compressor_getParamfv(const EffectProps
*, ALenum param
, float*)
64 throw effect_exception
{AL_INVALID_ENUM
, "Invalid compressor float-vector property 0x%04x",
68 EffectProps
genDefaultProps() noexcept
71 props
.Compressor
.OnOff
= AL_COMPRESSOR_DEFAULT_ONOFF
;
77 DEFINE_ALEFFECT_VTABLE(Compressor
);
79 const EffectProps CompressorEffectProps
{genDefaultProps()};
84 using EaxCompressorEffectDirtyFlagsValue
= std::uint_least8_t;
86 struct EaxCompressorEffectDirtyFlags
88 using EaxIsBitFieldStruct
= bool;
90 EaxCompressorEffectDirtyFlagsValue ulOnOff
: 1;
91 }; // EaxCompressorEffectDirtyFlags
94 class EaxCompressorEffect final
:
98 EaxCompressorEffect();
103 const EaxEaxCall
& eax_call
) override
;
107 EAXAGCCOMPRESSORPROPERTIES eax_
{};
108 EAXAGCCOMPRESSORPROPERTIES eax_d_
{};
109 EaxCompressorEffectDirtyFlags eax_dirty_flags_
{};
112 void set_eax_defaults();
115 void set_efx_on_off();
117 void set_efx_defaults();
122 const EaxEaxCall
& eax_call
);
125 void validate_on_off(
126 unsigned long ulOnOff
);
129 const EAXAGCCOMPRESSORPROPERTIES
& eax_all
);
133 unsigned long ulOnOff
);
136 const EAXAGCCOMPRESSORPROPERTIES
& eax_all
);
140 const EaxEaxCall
& eax_call
);
143 const EaxEaxCall
& eax_call
);
147 bool apply_deferred();
151 const EaxEaxCall
& eax_call
);
152 }; // EaxCompressorEffect
155 class EaxCompressorEffectException
:
159 explicit EaxCompressorEffectException(
162 EaxException
{"EAX_COMPRESSOR_EFFECT", message
}
165 }; // EaxCompressorEffectException
168 EaxCompressorEffect::EaxCompressorEffect()
169 : EaxEffect
{AL_EFFECT_COMPRESSOR
}
176 bool EaxCompressorEffect::dispatch(
177 const EaxEaxCall
& eax_call
)
179 return eax_call
.is_get() ? get(eax_call
) : set(eax_call
);
182 void EaxCompressorEffect::set_eax_defaults()
184 eax_
.ulOnOff
= EAXAGCCOMPRESSOR_DEFAULTONOFF
;
189 void EaxCompressorEffect::set_efx_on_off()
191 const auto on_off
= clamp(
192 static_cast<ALint
>(eax_
.ulOnOff
),
193 AL_COMPRESSOR_MIN_ONOFF
,
194 AL_COMPRESSOR_MAX_ONOFF
);
196 al_effect_props_
.Compressor
.OnOff
= (on_off
!= AL_FALSE
);
199 void EaxCompressorEffect::set_efx_defaults()
205 bool EaxCompressorEffect::get(
206 const EaxEaxCall
& eax_call
)
208 switch (eax_call
.get_property_id())
210 case EAXAGCCOMPRESSOR_NONE
:
213 case EAXAGCCOMPRESSOR_ALLPARAMETERS
:
214 eax_call
.set_value
<EaxCompressorEffectException
>(eax_
);
217 case EAXAGCCOMPRESSOR_ONOFF
:
218 eax_call
.set_value
<EaxCompressorEffectException
>(eax_
.ulOnOff
);
222 throw EaxCompressorEffectException
{"Unsupported property id."};
228 void EaxCompressorEffect::validate_on_off(
229 unsigned long ulOnOff
)
231 eax_validate_range
<EaxCompressorEffectException
>(
234 EAXAGCCOMPRESSOR_MINONOFF
,
235 EAXAGCCOMPRESSOR_MAXONOFF
);
238 void EaxCompressorEffect::validate_all(
239 const EAXAGCCOMPRESSORPROPERTIES
& eax_all
)
241 validate_on_off(eax_all
.ulOnOff
);
244 void EaxCompressorEffect::defer_on_off(
245 unsigned long ulOnOff
)
247 eax_d_
.ulOnOff
= ulOnOff
;
248 eax_dirty_flags_
.ulOnOff
= (eax_
.ulOnOff
!= eax_d_
.ulOnOff
);
251 void EaxCompressorEffect::defer_all(
252 const EAXAGCCOMPRESSORPROPERTIES
& eax_all
)
254 defer_on_off(eax_all
.ulOnOff
);
257 void EaxCompressorEffect::defer_on_off(
258 const EaxEaxCall
& eax_call
)
261 eax_call
.get_value
<EaxCompressorEffectException
, const decltype(EAXAGCCOMPRESSORPROPERTIES::ulOnOff
)>();
263 validate_on_off(on_off
);
264 defer_on_off(on_off
);
267 void EaxCompressorEffect::defer_all(
268 const EaxEaxCall
& eax_call
)
271 eax_call
.get_value
<EaxCompressorEffectException
, const EAXAGCCOMPRESSORPROPERTIES
>();
278 bool EaxCompressorEffect::apply_deferred()
280 if (eax_dirty_flags_
== EaxCompressorEffectDirtyFlags
{})
287 if (eax_dirty_flags_
.ulOnOff
)
292 eax_dirty_flags_
= EaxCompressorEffectDirtyFlags
{};
298 bool EaxCompressorEffect::set(
299 const EaxEaxCall
& eax_call
)
301 switch (eax_call
.get_property_id())
303 case EAXAGCCOMPRESSOR_NONE
:
306 case EAXAGCCOMPRESSOR_ALLPARAMETERS
:
310 case EAXAGCCOMPRESSOR_ONOFF
:
311 defer_on_off(eax_call
);
315 throw EaxCompressorEffectException
{"Unsupported property id."};
318 if (!eax_call
.is_deferred())
320 return apply_deferred();
328 EaxEffectUPtr
eax_create_eax_compressor_effect()
330 return std::make_unique
<EaxCompressorEffect
>();