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