diff options
author | Chris Robinson <[email protected]> | 2020-12-21 21:11:25 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2020-12-24 22:49:55 -0800 |
commit | 0d3b041aa25cefb16b6ef2e5d0ad0a2f93986a92 (patch) | |
tree | f8988a7f43dea7bf4df48c4e6b2ca7e5f431da46 /al/effects/chorus.cpp | |
parent | eedc42890fa1358a6639051a39f7e73f8d4d3b07 (diff) |
Avoid AL types and enums in the effect processors
Diffstat (limited to 'al/effects/chorus.cpp')
-rw-r--r-- | al/effects/chorus.cpp | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/al/effects/chorus.cpp b/al/effects/chorus.cpp index 2d983885..b2395283 100644 --- a/al/effects/chorus.cpp +++ b/al/effects/chorus.cpp @@ -4,25 +4,50 @@ #include "AL/al.h" #include "AL/efx.h" +#include "aloptional.h" +#include "core/logging.h" #include "effects.h" #include "effects/base.h" namespace { +static_assert(AL_CHORUS_WAVEFORM_SINUSOID == AL_FLANGER_WAVEFORM_SINUSOID, "Chorus/Flanger waveform value mismatch"); +static_assert(AL_CHORUS_WAVEFORM_TRIANGLE == AL_FLANGER_WAVEFORM_TRIANGLE, "Chorus/Flanger waveform value mismatch"); + +inline al::optional<ChorusWaveform> WaveformFromEnum(ALenum type) +{ + switch(type) + { + case AL_CHORUS_WAVEFORM_SINUSOID: return al::make_optional(ChorusWaveform::Sinusoid); + case AL_CHORUS_WAVEFORM_TRIANGLE: return al::make_optional(ChorusWaveform::Triangle); + } + return al::nullopt; +} +inline ALenum EnumFromWaveform(ChorusWaveform type) +{ + switch(type) + { + case ChorusWaveform::Sinusoid: return AL_CHORUS_WAVEFORM_SINUSOID; + case ChorusWaveform::Triangle: return AL_CHORUS_WAVEFORM_TRIANGLE; + } + throw std::runtime_error{"Invalid chorus waveform: "+std::to_string(static_cast<int>(type))}; +} + void Chorus_setParami(EffectProps *props, ALenum param, int val) { switch(param) { case AL_CHORUS_WAVEFORM: - if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM)) - throw effect_exception{AL_INVALID_VALUE, "Invalid chorus waveform"}; - props->Chorus.Waveform = val; + if(auto formopt = WaveformFromEnum(val)) + props->Chorus.Waveform = *formopt; + else + throw effect_exception{AL_INVALID_VALUE, "Invalid chorus waveform: 0x%04x", val}; break; case AL_CHORUS_PHASE: if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE)) - throw effect_exception{AL_INVALID_VALUE, "Chorus phase out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Chorus phase out of range: %d", val}; props->Chorus.Phase = val; break; @@ -38,25 +63,25 @@ void Chorus_setParamf(EffectProps *props, ALenum param, float val) { case AL_CHORUS_RATE: if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE)) - throw effect_exception{AL_INVALID_VALUE, "Chorus rate out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Chorus rate out of range: %f", val}; props->Chorus.Rate = val; break; case AL_CHORUS_DEPTH: if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH)) - throw effect_exception{AL_INVALID_VALUE, "Chorus depth out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Chorus depth out of range: %f", val}; props->Chorus.Depth = val; break; case AL_CHORUS_FEEDBACK: if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK)) - throw effect_exception{AL_INVALID_VALUE, "Chorus feedback out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Chorus feedback out of range: %f", val}; props->Chorus.Feedback = val; break; case AL_CHORUS_DELAY: if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY)) - throw effect_exception{AL_INVALID_VALUE, "Chorus delay out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Chorus delay out of range: %f", val}; props->Chorus.Delay = val; break; @@ -72,7 +97,7 @@ void Chorus_getParami(const EffectProps *props, ALenum param, int *val) switch(param) { case AL_CHORUS_WAVEFORM: - *val = props->Chorus.Waveform; + *val = EnumFromWaveform(props->Chorus.Waveform); break; case AL_CHORUS_PHASE: @@ -115,7 +140,7 @@ void Chorus_getParamfv(const EffectProps *props, ALenum param, float *vals) const EffectProps genDefaultChorusProps() noexcept { EffectProps props{}; - props.Chorus.Waveform = AL_CHORUS_DEFAULT_WAVEFORM; + props.Chorus.Waveform = *WaveformFromEnum(AL_CHORUS_DEFAULT_WAVEFORM); props.Chorus.Phase = AL_CHORUS_DEFAULT_PHASE; props.Chorus.Rate = AL_CHORUS_DEFAULT_RATE; props.Chorus.Depth = AL_CHORUS_DEFAULT_DEPTH; @@ -130,14 +155,15 @@ void Flanger_setParami(EffectProps *props, ALenum param, int val) switch(param) { case AL_FLANGER_WAVEFORM: - if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM)) - throw effect_exception{AL_INVALID_VALUE, "Invalid flanger waveform"}; - props->Chorus.Waveform = val; + if(auto formopt = WaveformFromEnum(val)) + props->Chorus.Waveform = *formopt; + else + throw effect_exception{AL_INVALID_VALUE, "Invalid flanger waveform: 0x%04x", val}; break; case AL_FLANGER_PHASE: if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE)) - throw effect_exception{AL_INVALID_VALUE, "Flanger phase out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Flanger phase out of range: %d", val}; props->Chorus.Phase = val; break; @@ -153,25 +179,25 @@ void Flanger_setParamf(EffectProps *props, ALenum param, float val) { case AL_FLANGER_RATE: if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE)) - throw effect_exception{AL_INVALID_VALUE, "Flanger rate out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Flanger rate out of range: %f", val}; props->Chorus.Rate = val; break; case AL_FLANGER_DEPTH: if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH)) - throw effect_exception{AL_INVALID_VALUE, "Flanger depth out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Flanger depth out of range: %f", val}; props->Chorus.Depth = val; break; case AL_FLANGER_FEEDBACK: if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK)) - throw effect_exception{AL_INVALID_VALUE, "Flanger feedback out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Flanger feedback out of range: %f", val}; props->Chorus.Feedback = val; break; case AL_FLANGER_DELAY: if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY)) - throw effect_exception{AL_INVALID_VALUE, "Flanger delay out of range"}; + throw effect_exception{AL_INVALID_VALUE, "Flanger delay out of range: %f", val}; props->Chorus.Delay = val; break; @@ -187,7 +213,7 @@ void Flanger_getParami(const EffectProps *props, ALenum param, int *val) switch(param) { case AL_FLANGER_WAVEFORM: - *val = props->Chorus.Waveform; + *val = EnumFromWaveform(props->Chorus.Waveform); break; case AL_FLANGER_PHASE: @@ -230,7 +256,7 @@ void Flanger_getParamfv(const EffectProps *props, ALenum param, float *vals) EffectProps genDefaultFlangerProps() noexcept { EffectProps props{}; - props.Chorus.Waveform = AL_FLANGER_DEFAULT_WAVEFORM; + props.Chorus.Waveform = *WaveformFromEnum(AL_FLANGER_DEFAULT_WAVEFORM); props.Chorus.Phase = AL_FLANGER_DEFAULT_PHASE; props.Chorus.Rate = AL_FLANGER_DEFAULT_RATE; props.Chorus.Depth = AL_FLANGER_DEFAULT_DEPTH; |