27
27
#include " ../JuceLibraryCode/JuceHeader.h"
28
28
#include " General/ParameterDefinition.h"
29
29
#include " ParameterUpdateHandler.h"
30
+ #include " CustomParameter.h"
30
31
31
32
namespace WECore ::JUCEPlugin {
32
33
@@ -118,7 +119,6 @@ namespace WECore::JUCEPlugin {
118
119
float defaultValue);
119
120
/* * @} */
120
121
121
- // These methods allow custom setters if needed
122
122
/* *
123
123
* Used to register private parameters that are not visible to the host. Used for parameters
124
124
* that cause other parameter or state changes so make automation impractical, but should
@@ -133,7 +133,10 @@ namespace WECore::JUCEPlugin {
133
133
*
134
134
* Int parameters are created with their real (not normalised) ranges.
135
135
*
136
+ * Custom parameters don't have a range and can only ever be private.
137
+ *
136
138
* (Bool parameters don't have a meaningful range.)
139
+ *
137
140
*/
138
141
/* * @{ */
139
142
inline void registerPrivateParameter (juce::AudioParameterFloat*& param,
@@ -148,6 +151,9 @@ namespace WECore::JUCEPlugin {
148
151
const ParameterDefinition::BaseParameter<int >* range,
149
152
int defaultValue,
150
153
std::function<void (int )> setter);
154
+
155
+ template <typename PARAM_TYPE>
156
+ inline void registerPrivateParameter (PARAM_TYPE*& param, const juce::String& name);
151
157
/* * @} */
152
158
153
159
/* *
@@ -169,6 +175,7 @@ namespace WECore::JUCEPlugin {
169
175
// We need to store pointers to all the private parameters that are registered so that they
170
176
// can be deallocated by the destructor
171
177
std::vector<juce::AudioProcessorParameter*> _privateParameters;
178
+ std::vector<CustomParameter*> _customParameters;
172
179
173
180
/* *
174
181
* Stores a setter and getter for a parameter. Used when persisting parameter values to XML
@@ -180,6 +187,17 @@ namespace WECore::JUCEPlugin {
180
187
std::function<void (float )> setter;
181
188
};
182
189
190
+ /* *
191
+ * Stores a setter and getter for a custom parameter. Used when persisting parameter values
192
+ * to XML and restoring values from XML. Access to the params XML element is provided since
193
+ * custom parameters typically need to store complex data.
194
+ */
195
+ struct CustomParameterInterface {
196
+ juce::String name;
197
+ std::function<void (juce::XmlElement*)> writeToXml;
198
+ std::function<void (juce::XmlElement*)> restoreFromXml;
199
+ };
200
+
183
201
/* *
184
202
* Listens for parameter changes and triggers the broadcaster so the changes can be handled
185
203
* by another thread.
@@ -200,9 +218,10 @@ namespace WECore::JUCEPlugin {
200
218
ParameterBroadcaster _parameterBroadcaster;
201
219
202
220
/* *
203
- * List of parameters in the order they are registered and stored in XML.
221
+ * List of parameters which will trigger updates and are stored in XML.
204
222
*/
205
223
std::vector<ParameterInterface> _paramsList;
224
+ std::vector<CustomParameterInterface> _customParamsList;
206
225
207
226
inline std::vector<float > _stringToFloatVector (const juce::String sFloatCSV ) const ;
208
227
@@ -224,6 +243,10 @@ namespace WECore::JUCEPlugin {
224
243
for (juce::AudioProcessorParameter* parameter : _privateParameters) {
225
244
delete parameter;
226
245
}
246
+
247
+ for (CustomParameter* parameter : _customParameters) {
248
+ delete parameter;
249
+ }
227
250
}
228
251
229
252
void CoreAudioProcessor::setParameterValueInternal (juce::AudioParameterFloat* param, float value) {
@@ -251,6 +274,11 @@ namespace WECore::JUCEPlugin {
251
274
paramsElement->setAttribute (param.name , param.getter ());
252
275
}
253
276
277
+ for (const CustomParameterInterface& param : _customParamsList) {
278
+ juce::XmlElement* thisParameterElement = paramsElement->createNewChildElement (param.name );
279
+ param.writeToXml (thisParameterElement);
280
+ }
281
+
254
282
copyXmlToBinary (rootElement, destData);
255
283
}
256
284
@@ -273,6 +301,14 @@ namespace WECore::JUCEPlugin {
273
301
param.setter (paramsElement->getDoubleAttribute (param.name ));
274
302
}
275
303
}
304
+
305
+ for (const CustomParameterInterface& param : _customParamsList) {
306
+ juce::XmlElement* thisParameterElement = paramsElement->getChildByName (param.name );
307
+
308
+ if (thisParameterElement != nullptr ) {
309
+ param.restoreFromXml (thisParameterElement);
310
+ }
311
+ }
276
312
}
277
313
}
278
314
}
@@ -371,6 +407,19 @@ namespace WECore::JUCEPlugin {
371
407
_privateParameters.push_back (param);
372
408
}
373
409
410
+ template <typename PARAM_TYPE>
411
+ void CoreAudioProcessor::registerPrivateParameter (PARAM_TYPE*& param, const juce::String& name) {
412
+ param = new PARAM_TYPE ();
413
+
414
+ CustomParameterInterface interface = {name,
415
+ [¶m](juce::XmlElement* element) { param->writeToXml (element); },
416
+ [¶m](juce::XmlElement* element) { param->restoreFromXml (element); }};
417
+ _customParamsList.push_back (interface);
418
+
419
+ param->setListener (&_parameterBroadcaster);
420
+ _customParameters.push_back (param);
421
+ }
422
+
374
423
std::vector<float > CoreAudioProcessor::_stringToFloatVector (const juce::String sFloatCSV ) const {
375
424
juce::StringArray tokenizer;
376
425
tokenizer.addTokens (sFloatCSV , " ," ," " );
0 commit comments