aboutsummaryrefslogtreecommitdiffstats
path: root/al/effects/chorus.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-12-21 21:11:25 -0800
committerChris Robinson <[email protected]>2020-12-24 22:49:55 -0800
commit0d3b041aa25cefb16b6ef2e5d0ad0a2f93986a92 (patch)
treef8988a7f43dea7bf4df48c4e6b2ca7e5f431da46 /al/effects/chorus.cpp
parenteedc42890fa1358a6639051a39f7e73f8d4d3b07 (diff)
Avoid AL types and enums in the effect processors
Diffstat (limited to 'al/effects/chorus.cpp')
-rw-r--r--al/effects/chorus.cpp66
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;