]> git.tdb.fi Git - ext/openal.git/blob - al/effects/compressor.cpp
Import OpenAL Soft 1.23.1 sources
[ext/openal.git] / al / effects / compressor.cpp
1
2 #include "config.h"
3
4 #include "AL/al.h"
5 #include "AL/efx.h"
6
7 #include "alc/effects/base.h"
8 #include "effects.h"
9
10 #ifdef ALSOFT_EAX
11 #include "alnumeric.h"
12 #include "al/eax/exception.h"
13 #include "al/eax/utils.h"
14 #endif // ALSOFT_EAX
15
16
17 namespace {
18
19 void Compressor_setParami(EffectProps *props, ALenum param, int val)
20 {
21     switch(param)
22     {
23     case AL_COMPRESSOR_ONOFF:
24         if(!(val >= AL_COMPRESSOR_MIN_ONOFF && val <= AL_COMPRESSOR_MAX_ONOFF))
25             throw effect_exception{AL_INVALID_VALUE, "Compressor state out of range"};
26         props->Compressor.OnOff = (val != AL_FALSE);
27         break;
28
29     default:
30         throw effect_exception{AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x",
31             param};
32     }
33 }
34 void Compressor_setParamiv(EffectProps *props, ALenum param, const int *vals)
35 { Compressor_setParami(props, param, vals[0]); }
36 void Compressor_setParamf(EffectProps*, ALenum param, float)
37 { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param}; }
38 void Compressor_setParamfv(EffectProps*, ALenum param, const float*)
39 {
40     throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x",
41         param};
42 }
43
44 void Compressor_getParami(const EffectProps *props, ALenum param, int *val)
45
46     switch(param)
47     {
48     case AL_COMPRESSOR_ONOFF:
49         *val = props->Compressor.OnOff;
50         break;
51
52     default:
53         throw effect_exception{AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x",
54             param};
55     }
56 }
57 void Compressor_getParamiv(const EffectProps *props, ALenum param, int *vals)
58 { Compressor_getParami(props, param, vals); }
59 void Compressor_getParamf(const EffectProps*, ALenum param, float*)
60 { throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param}; }
61 void Compressor_getParamfv(const EffectProps*, ALenum param, float*)
62 {
63     throw effect_exception{AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x",
64         param};
65 }
66
67 EffectProps genDefaultProps() noexcept
68 {
69     EffectProps props{};
70     props.Compressor.OnOff = AL_COMPRESSOR_DEFAULT_ONOFF;
71     return props;
72 }
73
74 } // namespace
75
76 DEFINE_ALEFFECT_VTABLE(Compressor);
77
78 const EffectProps CompressorEffectProps{genDefaultProps()};
79
80 #ifdef ALSOFT_EAX
81 namespace {
82
83 using CompressorCommitter = EaxCommitter<EaxCompressorCommitter>;
84
85 struct OnOffValidator {
86     void operator()(unsigned long ulOnOff) const
87     {
88         eax_validate_range<CompressorCommitter::Exception>(
89             "On-Off",
90             ulOnOff,
91             EAXAGCCOMPRESSOR_MINONOFF,
92             EAXAGCCOMPRESSOR_MAXONOFF);
93     }
94 }; // OnOffValidator
95
96 struct AllValidator {
97     void operator()(const EAXAGCCOMPRESSORPROPERTIES& all) const
98     {
99         OnOffValidator{}(all.ulOnOff);
100     }
101 }; // AllValidator
102
103 } // namespace
104
105 template<>
106 struct CompressorCommitter::Exception : public EaxException
107 {
108     explicit Exception(const char *message) : EaxException{"EAX_CHORUS_EFFECT", message}
109     { }
110 };
111
112 template<>
113 [[noreturn]] void CompressorCommitter::fail(const char *message)
114 {
115     throw Exception{message};
116 }
117
118 template<>
119 bool CompressorCommitter::commit(const EaxEffectProps &props)
120 {
121     if(props.mType == mEaxProps.mType
122         && props.mCompressor.ulOnOff == mEaxProps.mCompressor.ulOnOff)
123         return false;
124
125     mEaxProps = props;
126
127     mAlProps.Compressor.OnOff = (props.mCompressor.ulOnOff != 0);
128     return true;
129 }
130
131 template<>
132 void CompressorCommitter::SetDefaults(EaxEffectProps &props)
133 {
134     props.mType = EaxEffectType::Compressor;
135     props.mCompressor.ulOnOff = EAXAGCCOMPRESSOR_DEFAULTONOFF;
136 }
137
138 template<>
139 void CompressorCommitter::Get(const EaxCall &call, const EaxEffectProps &props)
140 {
141     switch(call.get_property_id())
142     {
143     case EAXAGCCOMPRESSOR_NONE: break;
144     case EAXAGCCOMPRESSOR_ALLPARAMETERS: call.set_value<Exception>(props.mCompressor); break;
145     case EAXAGCCOMPRESSOR_ONOFF: call.set_value<Exception>(props.mCompressor.ulOnOff); break;
146     default: fail_unknown_property_id();
147     }
148 }
149
150 template<>
151 void CompressorCommitter::Set(const EaxCall &call, EaxEffectProps &props)
152 {
153     switch(call.get_property_id())
154     {
155     case EAXAGCCOMPRESSOR_NONE: break;
156     case EAXAGCCOMPRESSOR_ALLPARAMETERS: defer<AllValidator>(call, props.mCompressor); break;
157     case EAXAGCCOMPRESSOR_ONOFF: defer<OnOffValidator>(call, props.mCompressor.ulOnOff); break;
158     default: fail_unknown_property_id();
159     }
160 }
161
162 #endif // ALSOFT_EAX