Handle AL effect properties with a variant
[openal-soft.git] / al / effects / convolution.cpp
blob618d5aac580d0582e65c15b093829e0bf453a067
2 #include "config.h"
4 #include <algorithm>
5 #include <array>
6 #include <cmath>
8 #include "AL/al.h"
10 #include "alc/inprogext.h"
11 #include "alnumeric.h"
12 #include "alspan.h"
13 #include "core/effects/base.h"
14 #include "effects.h"
17 namespace {
19 constexpr EffectProps genDefaultProps() noexcept
21 ConvolutionProps props{};
22 props.OrientAt = {0.0f, 0.0f, -1.0f};
23 props.OrientUp = {0.0f, 1.0f, 0.0f};
24 return props;
27 } // namespace
29 const EffectProps ConvolutionEffectProps{genDefaultProps()};
31 void ConvolutionEffectHandler::SetParami(ConvolutionProps& /*props*/, ALenum param, int /*val*/)
33 switch(param)
35 default:
36 throw effect_exception{AL_INVALID_ENUM, "Invalid convolution effect integer property 0x%04x",
37 param};
40 void ConvolutionEffectHandler::SetParamiv(ConvolutionProps &props, ALenum param, const int *vals)
42 switch(param)
44 default:
45 SetParami(props, param, *vals);
48 void ConvolutionEffectHandler::SetParamf(ConvolutionProps& /*props*/, ALenum param, float /*val*/)
50 switch(param)
52 default:
53 throw effect_exception{AL_INVALID_ENUM, "Invalid convolution effect float property 0x%04x",
54 param};
57 void ConvolutionEffectHandler::SetParamfv(ConvolutionProps &props, ALenum param, const float *values)
59 static constexpr auto finite_checker = [](float val) -> bool { return std::isfinite(val); };
60 al::span<const float> vals;
61 switch(param)
63 case AL_CONVOLUTION_ORIENTATION_SOFT:
64 vals = {values, 6_uz};
65 if(!std::all_of(vals.cbegin(), vals.cend(), finite_checker))
66 throw effect_exception{AL_INVALID_VALUE, "Property 0x%04x value out of range", param};
68 std::copy_n(vals.cbegin(), props.OrientAt.size(), props.OrientAt.begin());
69 std::copy_n(vals.cbegin()+3, props.OrientUp.size(), props.OrientUp.begin());
70 break;
72 default:
73 SetParamf(props, param, *values);
77 void ConvolutionEffectHandler::GetParami(const ConvolutionProps& /*props*/, ALenum param, int* /*val*/)
79 switch(param)
81 default:
82 throw effect_exception{AL_INVALID_ENUM, "Invalid convolution effect integer property 0x%04x",
83 param};
86 void ConvolutionEffectHandler::GetParamiv(const ConvolutionProps &props, ALenum param, int *vals)
88 switch(param)
90 default:
91 GetParami(props, param, vals);
94 void ConvolutionEffectHandler::GetParamf(const ConvolutionProps& /*props*/, ALenum param, float* /*val*/)
96 switch(param)
98 default:
99 throw effect_exception{AL_INVALID_ENUM, "Invalid convolution effect float property 0x%04x",
100 param};
103 void ConvolutionEffectHandler::GetParamfv(const ConvolutionProps &props, ALenum param, float *values)
105 al::span<float> vals;
106 switch(param)
108 case AL_CONVOLUTION_ORIENTATION_SOFT:
109 vals = {values, 6_uz};
110 std::copy(props.OrientAt.cbegin(), props.OrientAt.cend(), vals.begin());
111 std::copy(props.OrientUp.cbegin(), props.OrientUp.cend(), vals.begin()+3);
112 break;
114 default:
115 GetParamf(props, param, values);