From fe00c682aff1c99670436f764edb5a6d9d269c5f Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 8 Feb 2015 17:06:25 +0000 Subject: [PATCH] Save parameter midi CC mapping for plugins that use chunks Closes #116 --- source/backend/plugin/CarlaPlugin.cpp | 38 +++++++++------------------ source/utils/CarlaStateUtils.cpp | 8 +++--- source/utils/CarlaStateUtils.hpp | 2 +- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index d0f8499e5..9e3c5f428 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -516,6 +516,8 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) pData->stateSave.ctrlChannel = pData->ctrlChannel; #endif + bool usingChunk = false; + // --------------------------------------------------------------- // Chunk @@ -526,29 +528,8 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) if (data != nullptr && dataSize > 0) { + usingChunk = true; pData->stateSave.chunk = CarlaString::asBase64(data, dataSize).dup(); - - // Don't save anything else if using chunks - // Well, except properties - - for (LinkedList::Itenerator it = pData->custom.begin(); it.valid(); it.next()) - { - const CustomData& cData(it.getValue(kCustomDataFallback)); - CARLA_SAFE_ASSERT_CONTINUE(cData.isValid()); - - if (std::strcmp(cData.type, CUSTOM_DATA_TYPE_PROPERTY) != 0) - continue; - - CarlaStateSave::CustomData* stateCustomData(new CarlaStateSave::CustomData()); - - stateCustomData->type = carla_strdup(cData.type); - stateCustomData->key = carla_strdup(cData.key); - stateCustomData->value = carla_strdup(cData.value); - - pData->stateSave.customData.append(stateCustomData); - } - - return pData->stateSave; } } @@ -584,10 +565,15 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) if ((paramData.hints & PARAMETER_IS_ENABLED) == 0) continue; + const bool dummy = paramData.type != PARAMETER_INPUT || usingChunk; + + if (dummy && paramData.midiCC <= -1) + continue; + CarlaStateSave::Parameter* const stateParameter(new CarlaStateSave::Parameter()); - stateParameter->isInput = (paramData.type == PARAMETER_INPUT); - stateParameter->index = paramData.index; + stateParameter->dummy = dummy; + stateParameter->index = paramData.index; #ifndef BUILD_BRIDGE stateParameter->midiCC = paramData.midiCC; stateParameter->midiChannel = paramData.midiChannel; @@ -633,7 +619,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) const bool usesMultiProgs(pData->extraHints & PLUGIN_EXTRA_HINT_USES_MULTI_PROGS); // --------------------------------------------------------------- - // Part 1 - PRE-set custom data (only that which reload programs) + // Part 1 - PRE-set custom data (only those which reload programs) for (CarlaStateSave::CustomDataItenerator it = stateSave.customData.begin(); it.valid(); it.next()) { @@ -780,7 +766,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) { //CARLA_SAFE_ASSERT(stateParameter->isInput == (pData - if (stateParameter->isInput) + if (! stateParameter->dummy) { if (pData->param.data[index].hints & PARAMETER_USES_SAMPLERATE) stateParameter->value *= sampleRate; diff --git a/source/utils/CarlaStateUtils.cpp b/source/utils/CarlaStateUtils.cpp index cbedf1dfc..9f53d48f8 100644 --- a/source/utils/CarlaStateUtils.cpp +++ b/source/utils/CarlaStateUtils.cpp @@ -116,7 +116,7 @@ static const char* xmlSafeStringCharDup(const String& string, const bool toXml) // StateParameter CarlaStateSave::Parameter::Parameter() noexcept - : isInput(true), + : dummy(false), index(-1), name(nullptr), symbol(nullptr), @@ -590,9 +590,6 @@ String CarlaStateSave::toString() const if (stateParameter->symbol != nullptr && stateParameter->symbol[0] != '\0') parameterXml << " " << xmlSafeString(stateParameter->symbol, true) << "\n"; - if (stateParameter->isInput) - parameterXml << " " << String(stateParameter->value, 15) << "\n"; - #ifndef BUILD_BRIDGE if (stateParameter->midiCC > 0) { @@ -601,6 +598,9 @@ String CarlaStateSave::toString() const } #endif + if (! stateParameter->dummy) + parameterXml << " " << String(stateParameter->value, 15) << "\n"; + parameterXml << " \n"; content << parameterXml; diff --git a/source/utils/CarlaStateUtils.hpp b/source/utils/CarlaStateUtils.hpp index c07908c19..7523d65ed 100644 --- a/source/utils/CarlaStateUtils.hpp +++ b/source/utils/CarlaStateUtils.hpp @@ -29,7 +29,7 @@ CARLA_BACKEND_START_NAMESPACE struct CarlaStateSave { struct Parameter { - bool isInput; + bool dummy; // if true only midiChannel/CC are used int32_t index; const char* name; const char* symbol;