27#include "../JuceLibraryCode/JuceHeader.h"
85 inline std::unique_ptr<juce::XmlElement>
writeToXml();
95 inline void restoreFromXml(std::unique_ptr<juce::XmlElement> element);
111 const juce::String& name,
117 const juce::String& name,
123 const juce::String& name,
128 const juce::String& name,
153 const juce::String& name,
157 std::function<
void(
float)> setter);
160 const juce::String& name,
163 std::function<
void(
int)> setter);
165 template <
typename PARAM_TYPE>
216 public juce::ChangeBroadcaster {
222 this->sendChangeMessage();
239 std::unique_ptr<juce::XmlElement> rootElement);
263 param->setValueNotifyingHost(param->getNormalisableRange().convertTo0to1(value));
267 param->setValueNotifyingHost(param->getNormalisableRange().convertTo0to1(value));
271 param->setValueNotifyingHost(value);
275 std::unique_ptr<juce::XmlElement> element =
writeToXml();
276 copyXmlToBinary(*element.get(), destData);
280 auto rootElement = std::make_unique<juce::XmlElement>(
"Root");
286 juce::XmlElement* paramsElement = rootElement->createNewChildElement(
"Params");
288 paramsElement->setAttribute(param.name, param.getter());
292 juce::XmlElement* thisParameterElement = paramsElement->createNewChildElement(param.name);
293 param.writeToXml(thisParameterElement);
300 std::unique_ptr<juce::XmlElement> element(getXmlFromBinary(data, sizeInBytes));
306 if (element !=
nullptr) {
314 juce::XmlElement* paramsElement = element->getChildByName(
"Params");
315 if (paramsElement !=
nullptr) {
317 if (paramsElement->hasAttribute(param.name)) {
318 param.setter(
static_cast<float>(paramsElement->getDoubleAttribute(param.name)));
323 juce::XmlElement* thisParameterElement = paramsElement->getChildByName(param.name);
325 if (thisParameterElement !=
nullptr) {
326 param.restoreFromXml(thisParameterElement);
334 const juce::String& name,
338 param =
new juce::AudioParameterFloat(name, name, {
static_cast<float>(range->
minValue),
static_cast<float>(range->
maxValue), precision}, defaultValue);
341 [¶m]() {
return param->get(); },
350 const juce::String& name,
354 param =
new juce::AudioParameterFloat(name, name, {
static_cast<float>(range->
minValue),
static_cast<float>(range->
maxValue), precision}, defaultValue);
357 [¶m]() {
return param->get(); },
366 const juce::String& name,
369 param =
new juce::AudioParameterInt(name, name, range->
minValue, range->
maxValue, defaultValue);
372 [¶m]() {
return param->get(); },
381 const juce::String& name,
383 param =
new juce::AudioParameterBool(name, name, defaultValue);
386 [¶m]() {
return param->get(); },
395 const juce::String& name,
399 std::function<
void(
float)> setter) {
400 param =
new juce::AudioParameterFloat(name, name, {
static_cast<float>(range->
minValue),
static_cast<float>(range->
maxValue), precision}, defaultValue);
403 [¶m]() {
return param->get(); },
404 [setter](
float val) { setter(val); }};
412 const juce::String& name,
415 std::function<
void(
int)> setter) {
416 param =
new juce::AudioParameterInt(name, name, range->
minValue, range->
maxValue, defaultValue);
419 [¶m]() {
return param->get(); },
420 [setter](
float val) { setter(
static_cast<int>(val)); }};
427 template <
typename PARAM_TYPE>
429 param =
new PARAM_TYPE();
432 [¶m](juce::XmlElement* element) { param->writeToXml(element); },
433 [¶m](juce::XmlElement* element) { param->restoreFromXml(element); }};
441 juce::StringArray tokenizer;
442 tokenizer.addTokens(sFloatCSV,
",",
"");
444 std::vector<float> values;
446 for (
int iii {0}; iii < tokenizer.size(); iii++) {
447 values.push_back(tokenizer[iii].getFloatValue());
454 const int schemaVersion {rootElement->getIntAttribute(
"SchemaVersion", 0)};
456 std::unique_ptr<juce::XmlElement> retVal = std::make_unique<juce::XmlElement>(
"Root");
458 if (schemaVersion == 0) {
461 forEachXmlChildElement((*rootElement), childElement) {
462 if (childElement->hasTagName(
"AllUserParam")) {
465 juce::String sFloatCSV = childElement->getAllSubText();
471 juce::XmlElement* paramsElement = retVal->createNewChildElement(
"Params");
473 for (
size_t idx {0}; idx < paramNames.size(); idx++) {
474 if (idx < readParamValues.size()) {
475 paramsElement->setAttribute(paramNames[idx], readParamValues[idx]);
virtual void parameterValueChanged(int, float) override
virtual ~ParameterBroadcaster()=default
ParameterBroadcaster()=default
virtual void parameterGestureChanged(int, bool) override
virtual std::vector< juce::String > _provideParamNamesForMigration()=0
std::vector< ParameterInterface > _paramsList
static constexpr int PARAMS_SCHEMA_VERSION
virtual void _migrateParamValues(std::vector< float > ¶mValues)=0
void setParameterValueInternal(juce::AudioParameterFloat *param, float value)
std::vector< CustomParameter * > _customParameters
std::unique_ptr< juce::XmlElement > _migrateParameters(std::unique_ptr< juce::XmlElement > rootElement)
virtual void setStateInformation(const void *data, int sizeInBytes) override
void addParameterChangeListener(juce::ChangeListener *listener)
ParameterBroadcaster _parameterBroadcaster
void restoreFromXml(std::unique_ptr< juce::XmlElement > element)
virtual ~CoreAudioProcessor()
std::unique_ptr< juce::XmlElement > writeToXml()
void registerPrivateParameter(juce::AudioParameterFloat *¶m, const juce::String &name, const ParameterDefinition::RangedParameter< double > *range, float defaultValue, float precision, std::function< void(float)> setter)
std::vector< juce::AudioProcessorParameter * > _privateParameters
virtual void getStateInformation(juce::MemoryBlock &destData) override
void removeParameterChangeListener(juce::ChangeListener *listener)
std::vector< float > _stringToFloatVector(const juce::String sFloatCSV) const
std::vector< CustomParameterInterface > _customParamsList
void registerParameter(juce::AudioParameterFloat *¶m, const juce::String &name, const ParameterDefinition::RangedParameter< double > *range, float defaultValue, float precision)
ParameterUpdateListener _parameterListener
std::function< void(juce::XmlElement *)> restoreFromXml
std::function< void(juce::XmlElement *)> writeToXml
std::function< void(float)> setter
std::function< float()> getter