1 #include "effects/effectparameter.h"
2
3 #include <QtDebug>
4
5 #include "effects/effect.h"
6 #include "effects/effectsmanager.h"
7 #include "moc_effectparameter.cpp"
8 #include "util/assert.h"
9
EffectParameter(Effect * pEffect,EffectsManager * pEffectsManager,int iParameterNumber,EffectManifestParameterPointer pParameter)10 EffectParameter::EffectParameter(Effect* pEffect, EffectsManager* pEffectsManager,
11 int iParameterNumber,
12 EffectManifestParameterPointer pParameter)
13 : QObject(), // no parent
14 m_pEffect(pEffect),
15 m_pEffectsManager(pEffectsManager),
16 m_iParameterNumber(iParameterNumber),
17 m_pParameter(pParameter),
18 m_bAddedToEngine(false) {
19 // qDebug() << debugString() << "Constructing new EffectParameter from EffectManifestParameter:"
20 // << m_parameter.id();
21 m_minimum = m_pParameter->getMinimum();
22 m_maximum = m_pParameter->getMaximum();
23 // Sanity check the maximum and minimum
24 if (m_minimum > m_maximum) {
25 qWarning() << debugString() << "WARNING: Parameter maximum is less than the minimum.";
26 m_maximum = m_minimum;
27 }
28
29 // If the parameter specifies a default, set that. Otherwise use the minimum
30 // value.
31 m_default = m_pParameter->getDefault();
32 if (m_default < m_minimum || m_default > m_maximum) {
33 qWarning() << debugString() << "WARNING: Parameter default is outside of minimum/maximum range.";
34 m_default = m_minimum;
35 }
36
37 // Finally, set the value to the default.
38 m_value = m_default;
39 }
40
~EffectParameter()41 EffectParameter::~EffectParameter() {
42 //qDebug() << debugString() << "destroyed";
43 }
44
manifest() const45 EffectManifestParameterPointer EffectParameter::manifest() const {
46 return m_pParameter;
47 }
48
id() const49 const QString& EffectParameter::id() const {
50 return m_pParameter->id();
51 }
52
name() const53 const QString& EffectParameter::name() const {
54 return m_pParameter->name();
55 }
56
shortName() const57 const QString& EffectParameter::shortName() const {
58 return m_pParameter->shortName();
59 }
60
description() const61 const QString& EffectParameter::description() const {
62 return m_pParameter->description();
63 }
64
65 // static
clampValue(double * pValue,const double & minimum,const double & maximum)66 bool EffectParameter::clampValue(double* pValue,
67 const double& minimum, const double& maximum) {
68 if (*pValue < minimum) {
69 *pValue = minimum;
70 return true;
71 } else if (*pValue > maximum) {
72 *pValue = maximum;
73 return true;
74 }
75 return false;
76 }
77
clampValue()78 bool EffectParameter::clampValue() {
79 return clampValue(&m_value, m_minimum, m_maximum);
80 }
81
clampDefault()82 bool EffectParameter::clampDefault() {
83 return clampValue(&m_default, m_minimum, m_maximum);
84 }
85
clampRanges()86 bool EffectParameter::clampRanges() {
87 if (m_minimum > m_maximum) {
88 m_maximum = m_minimum;
89 return true;
90 }
91 return false;
92 }
93
getDefaultLinkType() const94 EffectManifestParameter::LinkType EffectParameter::getDefaultLinkType() const {
95 return m_pParameter->defaultLinkType();
96 }
97
getDefaultLinkInversion() const98 EffectManifestParameter::LinkInversion EffectParameter::getDefaultLinkInversion() const {
99 return m_pParameter->defaultLinkInversion();
100 }
101
getNeutralPointOnScale() const102 double EffectParameter::getNeutralPointOnScale() const {
103 return m_pParameter->neutralPointOnScale();
104 }
105
getValue() const106 double EffectParameter::getValue() const {
107 return m_value;
108 }
109
setValue(double value)110 void EffectParameter::setValue(double value) {
111 // TODO(XXX) Handle inf, -inf, and nan
112 m_value = value;
113
114 if (clampValue()) {
115 qWarning() << debugString() << "WARNING: Value was outside of limits, clamped.";
116 }
117
118 updateEngineState();
119 emit valueChanged(m_value);
120 }
121
getDefault() const122 double EffectParameter::getDefault() const {
123 return m_default;
124 }
125
setDefault(double dflt)126 void EffectParameter::setDefault(double dflt) {
127 m_default = dflt;
128
129 if (clampDefault()) {
130 qWarning() << debugString() << "WARNING: Default parameter value was outside of range, clamped.";
131 }
132
133 m_default = dflt;
134
135 updateEngineState();
136 }
137
getMinimum() const138 double EffectParameter::getMinimum() const {
139 return m_minimum;
140 }
141
setMinimum(double minimum)142 void EffectParameter::setMinimum(double minimum) {
143 // There's a degenerate case here where the maximum could be lower
144 // than the manifest minimum. If that's the case, then the minimum
145 // value is currently below the manifest minimum. Since similar
146 // guards exist in the setMaximum call, this should not be able to
147 // happen.
148 VERIFY_OR_DEBUG_ASSERT(m_minimum >= m_pParameter->getMinimum()) {
149 return;
150 }
151
152 m_minimum = minimum;
153 if (m_minimum < m_pParameter->getMinimum()) {
154 qWarning() << debugString() << "WARNING: Minimum value is less than plugin's absolute minimum, clamping.";
155 m_minimum = m_pParameter->getMinimum();
156 }
157
158 if (m_minimum > m_maximum) {
159 qWarning() << debugString() << "WARNING: New minimum was above maximum, clamped.";
160 m_minimum = m_maximum;
161 }
162
163 if (clampValue()) {
164 qWarning() << debugString() << "WARNING: Value was outside of new minimum, clamped.";
165 }
166
167 if (clampDefault()) {
168 qWarning() << debugString() << "WARNING: Default was outside of new minimum, clamped.";
169 }
170
171 updateEngineState();
172 }
173
getMaximum() const174 double EffectParameter::getMaximum() const {
175 return m_maximum;
176 }
177
setMaximum(double maximum)178 void EffectParameter::setMaximum(double maximum) {
179 // There's a degenerate case here where the minimum could be larger
180 // than the manifest maximum. If that's the case, then the maximum
181 // value is currently above the manifest maximum. Since similar
182 // guards exist in the setMinimum call, this should not be able to
183 // happen.
184 VERIFY_OR_DEBUG_ASSERT(m_maximum <= m_pParameter->getMaximum()) {
185 return;
186 }
187
188 m_maximum = maximum;
189 if (m_maximum > m_pParameter->getMaximum()) {
190 qWarning() << debugString() << "WARNING: Maximum value is less than plugin's absolute maximum, clamping.";
191 m_maximum = m_pParameter->getMaximum();
192 }
193
194 if (m_maximum < m_minimum) {
195 qWarning() << debugString() << "WARNING: New maximum was below the minimum, clamped.";
196 m_maximum = m_minimum;
197 }
198
199 if (clampValue()) {
200 qWarning() << debugString() << "WARNING: Value was outside of new maximum, clamped.";
201 }
202
203 if (clampDefault()) {
204 qWarning() << debugString() << "WARNING: Default was outside of new maximum, clamped.";
205 }
206
207 updateEngineState();
208 }
209
getControlHint() const210 EffectManifestParameter::ControlHint EffectParameter::getControlHint() const {
211 return m_pParameter->controlHint();
212 }
213
updateEngineState()214 void EffectParameter::updateEngineState() {
215 EngineEffect* pEngineEffect = m_pEffect->getEngineEffect();
216 if (!pEngineEffect) {
217 return;
218 }
219 EffectsRequest* pRequest = new EffectsRequest();
220 pRequest->type = EffectsRequest::SET_PARAMETER_PARAMETERS;
221 pRequest->pTargetEffect = pEngineEffect;
222 pRequest->SetParameterParameters.iParameter = m_iParameterNumber;
223 pRequest->value = m_value;
224 pRequest->minimum = m_minimum;
225 pRequest->maximum = m_maximum;
226 pRequest->default_value = m_default;
227 m_pEffectsManager->writeRequest(pRequest);
228 }
229