From 52babe107eec9d56ce2aee2ad1de0d89fba24888 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 5 Jul 2014 21:45:17 +0100 Subject: [PATCH] Make state utils calls part of StateSave struct --- source/backend/CarlaPlugin.hpp | 10 +- source/backend/engine/CarlaEngine.cpp | 21 +- source/backend/engine/CarlaEngineJack.cpp | 4 +- source/backend/engine/CarlaEngineNative.cpp | 19 +- source/backend/plugin/CarlaPlugin.cpp | 96 ++-- source/backend/plugin/CarlaPluginInternal.hpp | 2 +- source/tests/CarlaUtils4.cpp | 6 +- source/utils/CarlaStateUtils.cpp | 500 +++++++++--------- source/utils/CarlaStateUtils.hpp | 20 +- 9 files changed, 340 insertions(+), 338 deletions(-) diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 63c81eac4..e41581794 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -49,7 +49,7 @@ class CarlaEngineAudioPort; /*! * Save state data. */ -struct SaveState; +struct StateSave; // ----------------------------------------------------------------------- @@ -382,16 +382,16 @@ public: * Get the plugin's save state.\n * The plugin will automatically call prepareForSave() as needed. * - * \see loadSaveState() + * \see loadStateSave() */ - const SaveState& getSaveState(); + const StateSave& getStateSave(); /*! * Get the plugin's save state. * - * \see getSaveState() + * \see getStateSave() */ - void loadSaveState(const SaveState& saveState); + void loadStateSave(const StateSave& stateSave); /*! * Save the current plugin state to \a filename. diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 20a6e42ec..d86358628 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -1353,7 +1353,7 @@ bool CarlaEngine::clonePlugin(const uint id) CARLA_SAFE_ASSERT_RETURN_ERR(pluginCountBefore+1 == pData->curPluginCount, "No new plugin found"); if (CarlaPlugin* const newPlugin = pData->plugins[pluginCountBefore].plugin) - newPlugin->loadSaveState(plugin->getSaveState()); + newPlugin->loadStateSave(plugin->getStateSave()); return true; } @@ -1680,21 +1680,21 @@ bool CarlaEngine::loadProject(const char* const filename) { if (isPreset || node.toElement().tagName().compare("plugin", Qt::CaseInsensitive) == 0) { - SaveState saveState; - fillSaveStateFromXmlNode(saveState, isPreset ? xmlNode : node); + StateSave stateSave; + stateSave.fillFromXmlNode(isPreset ? xmlNode : node); callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); - CARLA_SAFE_ASSERT_CONTINUE(saveState.type != nullptr); + CARLA_SAFE_ASSERT_CONTINUE(stateSave.type != nullptr); const void* extraStuff = nullptr; // check if using GIG, SF2 or SFZ 16outs static const char kUse16OutsSuffix[] = " (16 outs)"; - const PluginType ptype(getPluginTypeFromString(saveState.type)); + const PluginType ptype(getPluginTypeFromString(stateSave.type)); - if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix)) + if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) { if (ptype == PLUGIN_FILE_GIG || ptype == PLUGIN_FILE_SF2) extraStuff = "true"; @@ -1702,10 +1702,10 @@ bool CarlaEngine::loadProject(const char* const filename) // TODO - proper find&load plugins - if (addPlugin(ptype, saveState.binary, saveState.name, saveState.label, saveState.uniqueId, extraStuff)) + if (addPlugin(ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) { if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) - plugin->loadSaveState(saveState); + plugin->loadStateSave(stateSave); } else carla_stderr2("Failed to load a plugin, error was:%s\n", getLastError()); @@ -1796,11 +1796,8 @@ bool CarlaEngine::saveProject(const char* const filename) //if (strBuf[0] != '\0') // out << QString(" \n").arg(xmlSafeString(strBuf, true)); - QString content; - fillXmlStringFromSaveState(content, plugin->getSaveState()); - out << " \n"; - out << content; + out << plugin->getStateSave().toString(); out << " \n"; firstPlugin = false; diff --git a/source/backend/engine/CarlaEngineJack.cpp b/source/backend/engine/CarlaEngineJack.cpp index 8016b5347..47f1f8b1c 100644 --- a/source/backend/engine/CarlaEngineJack.cpp +++ b/source/backend/engine/CarlaEngineJack.cpp @@ -1156,9 +1156,9 @@ public: if (needsReinit) { // reload plugin to recreate its ports - const SaveState& saveState(plugin->getSaveState()); + const StateSave& saveState(plugin->getStateSave()); plugin->reload(); - plugin->loadSaveState(saveState); + plugin->loadStateSave(saveState); } return plugin->getName(); diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 826c6c1ba..79f6d166b 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -1313,11 +1313,8 @@ protected: //if (strBuf[0] != '\0') // out << QString(" \n").arg(xmlSafeString(strBuf, true)); - QString content; - fillXmlStringFromSaveState(content, plugin->getSaveState()); - out << " \n"; - out << content; + out << plugin->getStateSave().toString(); out << " \n"; firstPlugin = false; @@ -1348,19 +1345,19 @@ protected: { if (node.toElement().tagName().compare("plugin", Qt::CaseInsensitive) == 0) { - SaveState saveState; - fillSaveStateFromXmlNode(saveState, node); + StateSave stateSave; + stateSave.fillFromXmlNode(node); - CARLA_SAFE_ASSERT_CONTINUE(saveState.type != nullptr); + CARLA_SAFE_ASSERT_CONTINUE(stateSave.type != nullptr); const void* extraStuff = nullptr; // check if using GIG, SF2 or SFZ 16outs static const char kUse16OutsSuffix[] = " (16 outs)"; - const PluginType ptype(getPluginTypeFromString(saveState.type)); + const PluginType ptype(getPluginTypeFromString(stateSave.type)); - if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix)) + if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) { if (ptype == PLUGIN_FILE_GIG || ptype == PLUGIN_FILE_SF2) extraStuff = "true"; @@ -1368,10 +1365,10 @@ protected: // TODO - proper find&load plugins - if (addPlugin(ptype, saveState.binary, saveState.name, saveState.label, saveState.uniqueId, extraStuff)) + if (addPlugin(ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) { if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) - plugin->loadSaveState(saveState); + plugin->loadStateSave(stateSave); } //pluginsAdded = true; diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index ff64a92a2..b1f5823e9 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -41,7 +41,7 @@ static const CustomData kCustomDataNull = { nullptr, nullptr, nullptr static bool gIsLoadingProject = false; // ------------------------------------------------------------------- -// ParamSymbol struct, needed for CarlaPlugin::loadSaveState() +// ParamSymbol struct, needed for CarlaPlugin::loadStateSave() struct ParamSymbol { int32_t index; @@ -507,9 +507,9 @@ void CarlaPlugin::randomizeParameters() noexcept } } -const SaveState& CarlaPlugin::getSaveState() +const StateSave& CarlaPlugin::getStateSave() { - pData->saveState.reset(); + pData->stateSave.clear(); prepareForSave(); char strBuf[STR_MAX+1]; @@ -519,26 +519,26 @@ const SaveState& CarlaPlugin::getSaveState() getLabel(strBuf); - pData->saveState.type = carla_strdup(getPluginTypeAsString(getType())); - pData->saveState.name = carla_strdup(pData->name); - pData->saveState.label = carla_strdup(strBuf); - pData->saveState.uniqueId = getUniqueId(); + pData->stateSave.type = carla_strdup(getPluginTypeAsString(getType())); + pData->stateSave.name = carla_strdup(pData->name); + pData->stateSave.label = carla_strdup(strBuf); + pData->stateSave.uniqueId = getUniqueId(); if (pData->filename != nullptr) - pData->saveState.binary = carla_strdup(pData->filename); + pData->stateSave.binary = carla_strdup(pData->filename); // --------------------------------------------------------------- // Internals - pData->saveState.active = pData->active; + pData->stateSave.active = pData->active; #ifndef BUILD_BRIDGE - pData->saveState.dryWet = pData->postProc.dryWet; - pData->saveState.volume = pData->postProc.volume; - pData->saveState.balanceLeft = pData->postProc.balanceLeft; - pData->saveState.balanceRight = pData->postProc.balanceRight; - pData->saveState.panning = pData->postProc.panning; - pData->saveState.ctrlChannel = pData->ctrlChannel; + pData->stateSave.dryWet = pData->postProc.dryWet; + pData->stateSave.volume = pData->postProc.volume; + pData->stateSave.balanceLeft = pData->postProc.balanceLeft; + pData->stateSave.balanceRight = pData->postProc.balanceRight; + pData->stateSave.panning = pData->postProc.panning; + pData->stateSave.ctrlChannel = pData->ctrlChannel; #endif // --------------------------------------------------------------- @@ -551,10 +551,10 @@ const SaveState& CarlaPlugin::getSaveState() if (data != nullptr && dataSize > 0) { - pData->saveState.chunk = carla_strdup(QByteArray((char*)data, dataSize).toBase64().constData()); + pData->stateSave.chunk = carla_strdup(QByteArray((char*)data, dataSize).toBase64().constData()); // Don't save anything else if using chunks - return pData->saveState; + return pData->stateSave; } } @@ -563,8 +563,8 @@ const SaveState& CarlaPlugin::getSaveState() if (pData->prog.current >= 0 && getType() != PLUGIN_LV2) { - pData->saveState.currentProgramIndex = pData->prog.current; - pData->saveState.currentProgramName = carla_strdup(pData->prog.names[pData->prog.current]); + pData->stateSave.currentProgramIndex = pData->prog.current; + pData->stateSave.currentProgramName = carla_strdup(pData->prog.names[pData->prog.current]); } // --------------------------------------------------------------- @@ -574,8 +574,8 @@ const SaveState& CarlaPlugin::getSaveState() { const MidiProgramData& mpData(pData->midiprog.getCurrent()); - pData->saveState.currentMidiBank = static_cast(mpData.bank); - pData->saveState.currentMidiProgram = static_cast(mpData.program); + pData->stateSave.currentMidiBank = static_cast(mpData.bank); + pData->stateSave.currentMidiProgram = static_cast(mpData.program); } // --------------------------------------------------------------- @@ -608,7 +608,7 @@ const SaveState& CarlaPlugin::getSaveState() if (paramData.hints & PARAMETER_USES_SAMPLERATE) stateParameter->value /= sampleRate; - pData->saveState.parameters.append(stateParameter); + pData->stateSave.parameters.append(stateParameter); } // --------------------------------------------------------------- @@ -624,13 +624,13 @@ const SaveState& CarlaPlugin::getSaveState() stateCustomData->key = carla_strdup(cData.key); stateCustomData->value = carla_strdup(cData.value); - pData->saveState.customData.append(stateCustomData); + pData->stateSave.customData.append(stateCustomData); } - return pData->saveState; + return pData->stateSave; } -void CarlaPlugin::loadSaveState(const SaveState& saveState) +void CarlaPlugin::loadStateSave(const StateSave& stateSave) { char strBuf[STR_MAX+1]; const bool usesMultiProgs(pData->extraHints & PLUGIN_EXTRA_HINT_USES_MULTI_PROGS); @@ -641,7 +641,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) // --------------------------------------------------------------- // Part 1 - PRE-set custom data (only that which reload programs) - for (LinkedList::Itenerator it = saveState.customData.begin(); it.valid(); it.next()) + for (LinkedList::Itenerator it = stateSave.customData.begin(); it.valid(); it.next()) { const StateCustomData* const stateCustomData(it.getValue()); const char* const key(stateCustomData->key); @@ -660,14 +660,14 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) // --------------------------------------------------------------- // Part 2 - set program - if (saveState.currentProgramIndex >= 0 && saveState.currentProgramName != nullptr) + if (stateSave.currentProgramIndex >= 0 && stateSave.currentProgramName != nullptr) { int32_t programId = -1; // index < count - if (saveState.currentProgramIndex < static_cast(pData->prog.count)) + if (stateSave.currentProgramIndex < static_cast(pData->prog.count)) { - programId = saveState.currentProgramIndex; + programId = stateSave.currentProgramIndex; } // index not valid, try to find by name else @@ -677,7 +677,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) strBuf[0] = '\0'; getProgramName(i, strBuf); - if (strBuf[0] != '\0' && std::strcmp(saveState.currentProgramName, strBuf) == 0) + if (strBuf[0] != '\0' && std::strcmp(stateSave.currentProgramName, strBuf) == 0) { programId = static_cast(i); break; @@ -693,8 +693,8 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) // --------------------------------------------------------------- // Part 3 - set midi program - if (saveState.currentMidiBank >= 0 && saveState.currentMidiProgram >= 0 && ! usesMultiProgs) - setMidiProgramById(static_cast(saveState.currentMidiBank), static_cast(saveState.currentMidiProgram), true, true, true); + if (stateSave.currentMidiBank >= 0 && stateSave.currentMidiProgram >= 0 && ! usesMultiProgs) + setMidiProgramById(static_cast(stateSave.currentMidiBank), static_cast(stateSave.currentMidiProgram), true, true, true); // --------------------------------------------------------------- // Part 4a - get plugin parameter symbols @@ -721,7 +721,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) const float sampleRate(static_cast(pData->engine->getSampleRate())); - for (LinkedList::Itenerator it = saveState.parameters.begin(); it.valid(); it.next()) + for (LinkedList::Itenerator it = stateSave.parameters.begin(); it.valid(); it.next()) { StateParameter* const stateParameter(it.getValue()); @@ -811,7 +811,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) // --------------------------------------------------------------- // Part 5 - set custom data - for (LinkedList::Itenerator it = saveState.customData.begin(); it.valid(); it.next()) + for (LinkedList::Itenerator it = stateSave.customData.begin(); it.valid(); it.next()) { const StateCustomData* const stateCustomData(it.getValue()); const char* const key(stateCustomData->key); @@ -833,22 +833,22 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) // --------------------------------------------------------------- // Part 6 - set chunk - if (saveState.chunk != nullptr && (pData->options & PLUGIN_OPTION_USE_CHUNKS) != 0) - setChunkData(saveState.chunk); + if (stateSave.chunk != nullptr && (pData->options & PLUGIN_OPTION_USE_CHUNKS) != 0) + setChunkData(stateSave.chunk); // --------------------------------------------------------------- // Part 6 - set internal stuff #ifndef BUILD_BRIDGE - setDryWet(saveState.dryWet, true, true); - setVolume(saveState.volume, true, true); - setBalanceLeft(saveState.balanceLeft, true, true); - setBalanceRight(saveState.balanceRight, true, true); - setPanning(saveState.panning, true, true); - setCtrlChannel(saveState.ctrlChannel, true, true); + setDryWet(stateSave.dryWet, true, true); + setVolume(stateSave.volume, true, true); + setBalanceLeft(stateSave.balanceLeft, true, true); + setBalanceRight(stateSave.balanceRight, true, true); + setPanning(stateSave.panning, true, true); + setCtrlChannel(stateSave.ctrlChannel, true, true); #endif - setActive(saveState.active, true, true); + setActive(stateSave.active, true, true); } bool CarlaPlugin::saveStateToFile(const char* const filename) @@ -861,14 +861,11 @@ bool CarlaPlugin::saveStateToFile(const char* const filename) if (! file.open(QIODevice::WriteOnly | QIODevice::Text)) return false; - QString content; - fillXmlStringFromSaveState(content, getSaveState()); - QTextStream out(&file); out << "\n"; out << "\n"; out << "\n"; - out << content; + out << getStateSave().toString(); out << "\n"; file.close(); @@ -897,9 +894,8 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename) return false; } - pData->saveState.reset(); - fillSaveStateFromXmlNode(pData->saveState, xmlNode); - loadSaveState(pData->saveState); + pData->stateSave.fillFromXmlNode(xmlNode); + loadStateSave(pData->stateSave); return true; } diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index dc19e84ae..b0e384c49 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -257,7 +257,7 @@ struct CarlaPlugin::ProtectedData { PluginMidiProgramData midiprog; LinkedList custom; - SaveState saveState; + StateSave stateSave; CarlaMutex masterMutex; // global master lock CarlaMutex singleMutex; // small lock used only in processSingle() diff --git a/source/tests/CarlaUtils4.cpp b/source/tests/CarlaUtils4.cpp index 921e03cd2..40ee9f432 100644 --- a/source/tests/CarlaUtils4.cpp +++ b/source/tests/CarlaUtils4.cpp @@ -50,13 +50,11 @@ int main() { state_juce::StateSave jsave; jsave.type = carla_strdup("NONE"); - juce::String js; - state_juce::fillXmlStringFromStateSave(js, jsave); + carla_stdout(jsave.toString().toRawUTF8()); state_qt::StateSave qsave; qsave.type = carla_strdup("NONE"); - QString qs; - state_qt::fillXmlStringFromStateSave(qs, qsave); + carla_stdout(qsave.toString().toUtf8().constData()); return 0; } diff --git a/source/utils/CarlaStateUtils.cpp b/source/utils/CarlaStateUtils.cpp index 6b8e4c0bc..071d01b3f 100644 --- a/source/utils/CarlaStateUtils.cpp +++ b/source/utils/CarlaStateUtils.cpp @@ -32,6 +32,46 @@ using juce::XmlElement; CARLA_BACKEND_START_NAMESPACE +// ----------------------------------------------------------------------- +// xmlSafeString + +#ifdef HAVE_JUCE_LATER +static String xmlSafeString(const String& string, const bool toXml) +{ + String newString(string); + + if (toXml) + return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); + else + return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); +} +#else +static QString xmlSafeString(const QString& string, const bool toXml) +{ + QString newString(string); + + if (toXml) + return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); + else + return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); +} +#endif + +// ----------------------------------------------------------------------- +// xmlSafeStringCharDup + +#ifdef HAVE_JUCE_LATER +static const char* xmlSafeStringCharDup(const String& string, const bool toXml) +{ + return carla_strdup(xmlSafeString(string, toXml).toRawUTF8()); +} +#else +static const char* xmlSafeStringCharDup(const QString& string, const bool toXml) +{ + return carla_strdup(xmlSafeString(string, toXml).toUtf8().constData()); +} +#endif + // ----------------------------------------------------------------------- // StateParameter @@ -109,10 +149,10 @@ StateSave::StateSave() noexcept StateSave::~StateSave() noexcept { - reset(); + clear(); } -void StateSave::reset() noexcept +void StateSave::clear() noexcept { if (type != nullptr) { @@ -174,51 +214,13 @@ void StateSave::reset() noexcept } // ----------------------------------------------------------------------- -// xmlSafeString - -#ifdef HAVE_JUCE_LATER -static String xmlSafeString(const String& string, const bool toXml) -{ - String newString(string); - - if (toXml) - return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); - else - return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); -} -#else -static QString xmlSafeString(const QString& string, const bool toXml) -{ - QString newString(string); - - if (toXml) - return newString.replace("&","&").replace("<","<").replace(">",">").replace("'","'").replace("\"","""); - else - return newString.replace("<","<").replace(">",">").replace("'","'").replace(""","\"").replace("&","&"); -} -#endif - -// ----------------------------------------------------------------------- -// xmlSafeStringCharDup +// fillFromXmlElement #ifdef HAVE_JUCE_LATER -static const char* xmlSafeStringCharDup(const String& string, const bool toXml) -{ - return carla_strdup(xmlSafeString(string, toXml).toRawUTF8()); -} -#else -static const char* xmlSafeStringCharDup(const QString& string, const bool toXml) +void StateSave::fillFromXmlElement(const XmlElement* const xmlElement) { - return carla_strdup(xmlSafeString(string, toXml).toUtf8().constData()); -} -#endif - -// ----------------------------------------------------------------------- -// fillStateSaveFromXmlNode + clear(); -#ifdef HAVE_JUCE_LATER -void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const xmlElement) -{ CARLA_SAFE_ASSERT_RETURN(xmlElement != nullptr,); for (XmlElement* elem = xmlElement->getFirstChildElement(); elem != nullptr; elem = elem->getNextElement()) @@ -236,15 +238,15 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x const String text(xmlInfo->getAllSubText().trim()); if (tag.equalsIgnoreCase("type")) - stateSave.type = xmlSafeStringCharDup(text, false); + type = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("name")) - stateSave.name = xmlSafeStringCharDup(text, false); + name = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("label") || tag.equalsIgnoreCase("uri")) - stateSave.label = xmlSafeStringCharDup(text, false); + label = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("binary") || tag.equalsIgnoreCase("bundle") || tag.equalsIgnoreCase("filename")) - stateSave.binary = xmlSafeStringCharDup(text, false); + binary = xmlSafeStringCharDup(text, false); else if (tag.equalsIgnoreCase("uniqueid")) - stateSave.uniqueId = text.getLargeIntValue(); + uniqueId = text.getLargeIntValue(); } } @@ -263,33 +265,33 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x if (tag.equalsIgnoreCase("active")) { - stateSave.active = (text.equalsIgnoreCase("yes") || text.equalsIgnoreCase("true")); + active = (text.equalsIgnoreCase("yes") || text.equalsIgnoreCase("true")); } else if (tag.equalsIgnoreCase("drywet")) { - stateSave.dryWet = carla_fixValue(0.0f, 1.0f, text.getFloatValue()); + dryWet = carla_fixValue(0.0f, 1.0f, text.getFloatValue()); } else if (tag.equalsIgnoreCase("volume")) { - stateSave.volume = carla_fixValue(0.0f, 1.27f, text.getFloatValue()); + volume = carla_fixValue(0.0f, 1.27f, text.getFloatValue()); } else if (tag.equalsIgnoreCase("balanceleft") || tag.equalsIgnoreCase("balance-left")) { - stateSave.balanceLeft = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); + balanceLeft = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); } else if (tag.equalsIgnoreCase("balanceright") || tag.equalsIgnoreCase("balance-right")) { - stateSave.balanceRight = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); + balanceRight = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); } else if (tag.equalsIgnoreCase("panning")) { - stateSave.panning = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); + panning = carla_fixValue(-1.0f, 1.0f, text.getFloatValue()); } else if (tag.equalsIgnoreCase("controlchannel") || tag.equalsIgnoreCase("control-channel")) { const int value(text.getIntValue()); if (value >= 1 && value <= MAX_MIDI_CHANNELS) - stateSave.ctrlChannel = static_cast(value-1); + ctrlChannel = static_cast(value-1); } // ------------------------------------------------------- @@ -299,11 +301,11 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x { const int value(text.getIntValue()); if (value >= 1) - stateSave.currentProgramIndex = value-1; + currentProgramIndex = value-1; } else if (tag.equalsIgnoreCase("currentprogramname") || tag.equalsIgnoreCase("current-program-name")) { - stateSave.currentProgramName = xmlSafeStringCharDup(text, false); + currentProgramName = xmlSafeStringCharDup(text, false); } // ------------------------------------------------------- @@ -313,13 +315,13 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x { const int value(text.getIntValue()); if (value >= 1) - stateSave.currentMidiBank = value-1; + currentMidiBank = value-1; } else if (tag.equalsIgnoreCase("currentmidiprogram") || tag.equalsIgnoreCase("current-midi-program")) { const int value(text.getIntValue()); if (value >= 1) - stateSave.currentMidiProgram = value-1; + currentMidiProgram = value-1; } // ------------------------------------------------------- @@ -366,7 +368,7 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x } } - stateSave.parameters.append(stateParameter); + parameters.append(stateParameter); } // ------------------------------------------------------- @@ -389,7 +391,7 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x stateCustomData->value = xmlSafeStringCharDup(cText, false); } - stateSave.customData.append(stateCustomData); + customData.append(stateCustomData); } // ------------------------------------------------------- @@ -397,15 +399,17 @@ void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const x else if (tag.equalsIgnoreCase("chunk")) { - stateSave.chunk = xmlSafeStringCharDup(text, false); + chunk = xmlSafeStringCharDup(text, false); } } } } } #else -void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) +void StateSave::fillFromXmlNode(const QDomNode& xmlNode) { + clear(); + CARLA_SAFE_ASSERT_RETURN(! xmlNode.isNull(),); for (QDomNode node = xmlNode.firstChild(); ! node.isNull(); node = node.nextSibling()) @@ -424,25 +428,25 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) if (tag.compare("type", Qt::CaseInsensitive) == 0) { - stateSave.type = xmlSafeStringCharDup(text, false); + type = xmlSafeStringCharDup(text, false); } else if (tag.compare("name", Qt::CaseInsensitive) == 0) { - stateSave.name = xmlSafeStringCharDup(text, false); + name = xmlSafeStringCharDup(text, false); } else if (tag.compare("label", Qt::CaseInsensitive) == 0 || tag.compare("uri", Qt::CaseInsensitive) == 0) { - stateSave.label = xmlSafeStringCharDup(text, false); + label = xmlSafeStringCharDup(text, false); } else if (tag.compare("binary", Qt::CaseInsensitive) == 0 || tag.compare("bundle", Qt::CaseInsensitive) == 0 || tag.compare("filename", Qt::CaseInsensitive) == 0) { - stateSave.binary = xmlSafeStringCharDup(text, false); + binary = xmlSafeStringCharDup(text, false); } else if (tag.compare("uniqueid", Qt::CaseInsensitive) == 0) { bool ok; - const qlonglong uniqueId(text.toLongLong(&ok)); - if (ok) stateSave.uniqueId = static_cast(uniqueId); + const qlonglong uniqueIdTry(text.toLongLong(&ok)); + if (ok) uniqueId = static_cast(uniqueIdTry); } } } @@ -462,44 +466,44 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) if (tag.compare("active", Qt::CaseInsensitive) == 0) { - stateSave.active = (text.compare("yes", Qt::CaseInsensitive) == 0 || text.compare("true", Qt::CaseInsensitive) == 0); + active = (text.compare("yes", Qt::CaseInsensitive) == 0 || text.compare("true", Qt::CaseInsensitive) == 0); } else if (tag.compare("drywet", Qt::CaseInsensitive) == 0) { bool ok; const float value(text.toFloat(&ok)); - if (ok) stateSave.dryWet = carla_fixValue(0.0f, 1.0f, value); + if (ok) dryWet = carla_fixValue(0.0f, 1.0f, value); } else if (tag.compare("volume", Qt::CaseInsensitive) == 0) { bool ok; const float value(text.toFloat(&ok)); - if (ok) stateSave.volume = carla_fixValue(0.0f, 1.27f, value); + if (ok) volume = carla_fixValue(0.0f, 1.27f, value); } else if (tag.compare("balanceleft", Qt::CaseInsensitive) == 0 || tag.compare("balance-left", Qt::CaseInsensitive) == 0) { bool ok; const float value(text.toFloat(&ok)); - if (ok) stateSave.balanceLeft = carla_fixValue(-1.0f, 1.0f, value); + if (ok) balanceLeft = carla_fixValue(-1.0f, 1.0f, value); } else if (tag.compare("balanceright", Qt::CaseInsensitive) == 0 || tag.compare("balance-right", Qt::CaseInsensitive) == 0) { bool ok; const float value(text.toFloat(&ok)); - if (ok) stateSave.balanceRight = carla_fixValue(-1.0f, 1.0f, value); + if (ok) balanceRight = carla_fixValue(-1.0f, 1.0f, value); } else if (tag.compare("panning", Qt::CaseInsensitive) == 0) { bool ok; const float value(text.toFloat(&ok)); - if (ok) stateSave.panning = carla_fixValue(-1.0f, 1.0f, value); + if (ok) panning = carla_fixValue(-1.0f, 1.0f, value); } else if (tag.compare("controlchannel", Qt::CaseInsensitive) == 0 || tag.compare("control-channel", Qt::CaseInsensitive) == 0) { bool ok; const short value(text.toShort(&ok)); if (ok && value >= 1 && value <= MAX_MIDI_CHANNELS) - stateSave.ctrlChannel = static_cast(value-1); + ctrlChannel = static_cast(value-1); } // ------------------------------------------------------- @@ -510,11 +514,11 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) bool ok; const int value(text.toInt(&ok)); if (ok && value >= 1) - stateSave.currentProgramIndex = value-1; + currentProgramIndex = value-1; } else if (tag.compare("currentprogramname", Qt::CaseInsensitive) == 0 || tag.compare("current-program-name", Qt::CaseInsensitive) == 0) { - stateSave.currentProgramName = xmlSafeStringCharDup(text, false); + currentProgramName = xmlSafeStringCharDup(text, false); } // ------------------------------------------------------- @@ -525,14 +529,14 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) bool ok; const int value(text.toInt(&ok)); if (ok && value >= 1) - stateSave.currentMidiBank = value-1; + currentMidiBank = value-1; } else if (tag.compare("currentmidiprogram", Qt::CaseInsensitive) == 0 || tag.compare("current-midi-program", Qt::CaseInsensitive) == 0) { bool ok; const int value(text.toInt(&ok)); if (ok && value >= 1) - stateSave.currentMidiProgram = value-1; + currentMidiProgram = value-1; } // ------------------------------------------------------- @@ -583,7 +587,7 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) } } - stateSave.parameters.append(stateParameter); + parameters.append(stateParameter); } // ------------------------------------------------------- @@ -606,7 +610,7 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) stateCustomData->value = xmlSafeStringCharDup(cText, false); } - stateSave.customData.append(stateCustomData); + customData.append(stateCustomData); } // ------------------------------------------------------- @@ -614,7 +618,7 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) else if (tag.compare("chunk", Qt::CaseInsensitive) == 0) { - stateSave.chunk = xmlSafeStringCharDup(text, false); + chunk = xmlSafeStringCharDup(text, false); } } } @@ -626,353 +630,361 @@ void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode) // fillXmlStringFromStateSave #ifdef HAVE_JUCE_LATER -void fillXmlStringFromStateSave(String& content, const StateSave& stateSave) +String StateSave::toString() const { + String content; + { - String info(" \n"); + String infoXml(" \n"); - info << " " << String(stateSave.type != nullptr ? stateSave.type : "") << "\n"; - info << " " << xmlSafeString(stateSave.name, true) << "\n"; + infoXml << " " << String(type != nullptr ? type : "") << "\n"; + infoXml << " " << xmlSafeString(name, true) << "\n"; - switch (getPluginTypeFromString(stateSave.type)) + switch (getPluginTypeFromString(type)) { case PLUGIN_NONE: break; case PLUGIN_INTERNAL: - info << " \n"; + infoXml << " \n"; break; case PLUGIN_LADSPA: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " \n"; - info << " " << stateSave.uniqueId << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " \n"; + infoXml << " " << uniqueId << "\n"; break; case PLUGIN_DSSI: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " \n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " \n"; break; case PLUGIN_LV2: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " " << xmlSafeString(stateSave.label, true) << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " " << xmlSafeString(label, true) << "\n"; break; case PLUGIN_VST: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " " << stateSave.uniqueId << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " " << uniqueId << "\n"; break; case PLUGIN_VST3: // TODO? - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " " << stateSave.uniqueId << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " " << uniqueId << "\n"; break; case PLUGIN_AU: // TODO? - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " " << stateSave.uniqueId << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " " << uniqueId << "\n"; break; case PLUGIN_JACK: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; break; case PLUGIN_REWIRE: - info << " \n"; + infoXml << " \n"; break; case PLUGIN_FILE_CSD: case PLUGIN_FILE_GIG: case PLUGIN_FILE_SF2: case PLUGIN_FILE_SFZ: - info << " " << xmlSafeString(stateSave.binary, true) << "\n"; - info << " \n"; + infoXml << " " << xmlSafeString(binary, true) << "\n"; + infoXml << " \n"; break; } - info << " \n\n"; + infoXml << " \n\n"; - content << info; + content << infoXml; } content << " \n"; { - String data; - - data << " " << (stateSave.active ? "Yes" : "No") << "\n"; - - if (stateSave.dryWet != 1.0f) - data << " " << stateSave.dryWet << "\n"; - if (stateSave.volume != 1.0f) - data << " " << stateSave.volume << "\n"; - if (stateSave.balanceLeft != -1.0f) - data << " " << stateSave.balanceLeft << "\n"; - if (stateSave.balanceRight != 1.0f) - data << " " << stateSave.balanceRight << "\n"; - if (stateSave.panning != 0.0f) - data << " " << stateSave.panning << "\n"; - - if (stateSave.ctrlChannel < 0) - data << " N\n"; + String dataXml; + + dataXml << " " << (active ? "Yes" : "No") << "\n"; + + if (dryWet != 1.0f) + dataXml << " " << dryWet << "\n"; + if (volume != 1.0f) + dataXml << " " << volume << "\n"; + if (balanceLeft != -1.0f) + dataXml << " " << balanceLeft << "\n"; + if (balanceRight != 1.0f) + dataXml << " " << balanceRight << "\n"; + if (panning != 0.0f) + dataXml << " " << panning << "\n"; + + if (ctrlChannel < 0) + dataXml << " N\n"; else - data << " " << int(stateSave.ctrlChannel+1) << "\n"; + dataXml << " " << int(ctrlChannel+1) << "\n"; - content << data; + content << dataXml; } - for (StateParameterItenerator it = stateSave.parameters.begin(); it.valid(); it.next()) + for (StateParameterItenerator it = parameters.begin(); it.valid(); it.next()) { StateParameter* const stateParameter(it.getValue()); - String parameter("\n"" \n"); + String parameterXml("\n"" \n"); - parameter << " " << String(stateParameter->index) << "\n"; - parameter << " " << xmlSafeString(stateParameter->name, true) << "\n"; + parameterXml << " " << String(stateParameter->index) << "\n"; + parameterXml << " " << xmlSafeString(stateParameter->name, true) << "\n"; if (stateParameter->symbol != nullptr && stateParameter->symbol[0] != '\0') - parameter << " " << xmlSafeString(stateParameter->symbol, true) << "\n"; + parameterXml << " " << xmlSafeString(stateParameter->symbol, true) << "\n"; if (stateParameter->isInput) - parameter << " " << stateParameter->value << "\n"; + parameterXml << " " << stateParameter->value << "\n"; if (stateParameter->midiCC > 0) { - parameter << " " << stateParameter->midiCC << "\n"; - parameter << " " << stateParameter->midiChannel+1 << "\n"; + parameterXml << " " << stateParameter->midiCC << "\n"; + parameterXml << " " << stateParameter->midiChannel+1 << "\n"; } - parameter << " \n"; + parameterXml << " \n"; - content << parameter; + content << parameterXml; } - if (stateSave.currentProgramIndex >= 0 && stateSave.currentProgramName != nullptr && stateSave.currentProgramName[0] != '\0') + if (currentProgramIndex >= 0 && currentProgramName != nullptr && currentProgramName[0] != '\0') { // ignore 'default' program - if (stateSave.currentProgramIndex > 0 || ! String(stateSave.currentProgramName).equalsIgnoreCase("default")) + if (currentProgramIndex > 0 || ! String(currentProgramName).equalsIgnoreCase("default")) { - String program("\n"); - program << " " << stateSave.currentProgramIndex+1 << "\n"; - program << " " << xmlSafeString(stateSave.currentProgramName, true) << "\n"; + String programXml("\n"); + programXml << " " << currentProgramIndex+1 << "\n"; + programXml << " " << xmlSafeString(currentProgramName, true) << "\n"; - content << program; + content << programXml; } } - if (stateSave.currentMidiBank >= 0 && stateSave.currentMidiProgram >= 0) + if (currentMidiBank >= 0 && currentMidiProgram >= 0) { - String midiProgram("\n"); - midiProgram << " " << stateSave.currentMidiBank+1 << "\n"; - midiProgram << " " << stateSave.currentMidiProgram+1 << "\n"; + String midiProgramXml("\n"); + midiProgramXml << " " << currentMidiBank+1 << "\n"; + midiProgramXml << " " << currentMidiProgram+1 << "\n"; - content << midiProgram; + content << midiProgramXml; } - for (StateCustomDataItenerator it = stateSave.customData.begin(); it.valid(); it.next()) + for (StateCustomDataItenerator it = customData.begin(); it.valid(); it.next()) { StateCustomData* const stateCustomData(it.getValue()); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->type != nullptr && stateCustomData->type[0] != '\0'); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->key != nullptr && stateCustomData->key[0] != '\0'); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->value != nullptr); - String customData("\n"" \n"); - customData << " " << xmlSafeString(stateCustomData->type, true) << "\n"; - customData << " " << xmlSafeString(stateCustomData->key, true) << "\n"; + String customDataXml("\n"" \n"); + customDataXml << " " << xmlSafeString(stateCustomData->type, true) << "\n"; + customDataXml << " " << xmlSafeString(stateCustomData->key, true) << "\n"; if (std::strcmp(stateCustomData->type, CUSTOM_DATA_TYPE_CHUNK) == 0 || std::strlen(stateCustomData->value) >= 128) { - customData << " \n"; - customData << xmlSafeString(stateCustomData->value, true); - customData << " \n"; + customDataXml << " \n"; + customDataXml << xmlSafeString(stateCustomData->value, true); + customDataXml << " \n"; } else { - customData << " "; - customData << xmlSafeString(stateCustomData->value, true); - customData << "\n"; + customDataXml << " "; + customDataXml << xmlSafeString(stateCustomData->value, true); + customDataXml << "\n"; } - customData << " \n"; + customDataXml << " \n"; - content << customData; + content << customDataXml; } - if (stateSave.chunk != nullptr && stateSave.chunk[0] != '\0') + if (chunk != nullptr && chunk[0] != '\0') { - String chunk("\n"" \n"); - chunk << stateSave.chunk << "\n \n"; + String chunkXml("\n"" \n"); + chunkXml << chunk << "\n \n"; - content << chunk; + content << chunkXml; } content << " \n"; + + return content; } #else -void fillXmlStringFromStateSave(QString& content, const StateSave& stateSave) +QString StateSave::toString() const { + QString content; + { - QString info(" \n"); + QString infoXml(" \n"); - info += QString(" %1\n").arg((stateSave.type != nullptr) ? stateSave.type : ""); - info += QString(" %1\n").arg(xmlSafeString(stateSave.name, true)); + infoXml += QString(" %1\n").arg((type != nullptr) ? type : ""); + infoXml += QString(" %1\n").arg(xmlSafeString(name, true)); - switch (getPluginTypeFromString(stateSave.type)) + switch (getPluginTypeFromString(type)) { case PLUGIN_NONE: break; case PLUGIN_INTERNAL: - info += QString(" \n").arg(xmlSafeString(stateSave.label, true)); + infoXml += QString(" \n").arg(xmlSafeString(label, true)); break; case PLUGIN_LADSPA: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" \n").arg(xmlSafeString(stateSave.label, true)); - info += QString(" %1\n").arg(stateSave.uniqueId); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" \n").arg(xmlSafeString(label, true)); + infoXml += QString(" %1\n").arg(uniqueId); break; case PLUGIN_DSSI: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" \n").arg(xmlSafeString(stateSave.label, true)); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" \n").arg(xmlSafeString(label, true)); break; case PLUGIN_LV2: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" %1\n").arg(xmlSafeString(stateSave.label, true)); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" %1\n").arg(xmlSafeString(label, true)); break; case PLUGIN_VST: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" %1\n").arg(stateSave.uniqueId); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" %1\n").arg(uniqueId); break; case PLUGIN_VST3: // TODO? - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" %1\n").arg(stateSave.uniqueId); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" %1\n").arg(uniqueId); break; case PLUGIN_AU: // TODO? - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" %1\n").arg(stateSave.uniqueId); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" %1\n").arg(uniqueId); break; case PLUGIN_JACK: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); break; case PLUGIN_REWIRE: - info += QString(" \n").arg(xmlSafeString(stateSave.label, true)); + infoXml += QString(" \n").arg(xmlSafeString(label, true)); break; case PLUGIN_FILE_CSD: case PLUGIN_FILE_GIG: case PLUGIN_FILE_SF2: case PLUGIN_FILE_SFZ: - info += QString(" %1\n").arg(xmlSafeString(stateSave.binary, true)); - info += QString(" \n").arg(xmlSafeString(stateSave.label, true)); + infoXml += QString(" %1\n").arg(xmlSafeString(binary, true)); + infoXml += QString(" \n").arg(xmlSafeString(label, true)); break; } - info += " \n\n"; + infoXml += " \n\n"; - content += info; + content += infoXml; } content += " \n"; { - QString data; - - data += QString(" %1\n").arg(stateSave.active ? "Yes" : "No"); - - if (stateSave.dryWet != 1.0f) - data += QString(" %1\n").arg(stateSave.dryWet, 0, 'g', 7); - if (stateSave.volume != 1.0f) - data += QString(" %1\n").arg(stateSave.volume, 0, 'g', 7); - if (stateSave.balanceLeft != -1.0f) - data += QString(" %1\n").arg(stateSave.balanceLeft, 0, 'g', 7); - if (stateSave.balanceRight != 1.0f) - data += QString(" %1\n").arg(stateSave.balanceRight, 0, 'g', 7); - if (stateSave.panning != 0.0f) - data += QString(" %1\n").arg(stateSave.panning, 0, 'g', 7); - - if (stateSave.ctrlChannel < 0) - data += QString(" N\n"); + QString dataXml; + + dataXml += QString(" %1\n").arg(active ? "Yes" : "No"); + + if (dryWet != 1.0f) + dataXml += QString(" %1\n").arg(dryWet, 0, 'g', 7); + if (volume != 1.0f) + dataXml += QString(" %1\n").arg(volume, 0, 'g', 7); + if (balanceLeft != -1.0f) + dataXml += QString(" %1\n").arg(balanceLeft, 0, 'g', 7); + if (balanceRight != 1.0f) + dataXml += QString(" %1\n").arg(balanceRight, 0, 'g', 7); + if (panning != 0.0f) + dataXml += QString(" %1\n").arg(panning, 0, 'g', 7); + + if (ctrlChannel < 0) + dataXml += QString(" N\n"); else - data += QString(" %1\n").arg(stateSave.ctrlChannel+1); + dataXml += QString(" %1\n").arg(ctrlChannel+1); - content += data; + content += dataXml; } - for (StateParameterItenerator it = stateSave.parameters.begin(); it.valid(); it.next()) + for (StateParameterItenerator it = parameters.begin(); it.valid(); it.next()) { StateParameter* const stateParameter(it.getValue()); - QString parameter("\n"" \n"); + QString parameterXml("\n"" \n"); - parameter += QString(" %1\n").arg(stateParameter->index); - parameter += QString(" %1\n").arg(xmlSafeString(stateParameter->name, true)); + parameterXml += QString(" %1\n").arg(stateParameter->index); + parameterXml += QString(" %1\n").arg(xmlSafeString(stateParameter->name, true)); if (stateParameter->symbol != nullptr && stateParameter->symbol[0] != '\0') - parameter += QString(" %1\n").arg(xmlSafeString(stateParameter->symbol, true)); + parameterXml += QString(" %1\n").arg(xmlSafeString(stateParameter->symbol, true)); if (stateParameter->isInput) - parameter += QString(" %1\n").arg(stateParameter->value, 0, 'g', 15); + parameterXml += QString(" %1\n").arg(stateParameter->value, 0, 'g', 15); if (stateParameter->midiCC > 0) { - parameter += QString(" %1\n").arg(stateParameter->midiCC); - parameter += QString(" %1\n").arg(stateParameter->midiChannel+1); + parameterXml += QString(" %1\n").arg(stateParameter->midiCC); + parameterXml += QString(" %1\n").arg(stateParameter->midiChannel+1); } - parameter += " \n"; + parameterXml += " \n"; - content += parameter; + content += parameterXml; } - if (stateSave.currentProgramIndex >= 0 && stateSave.currentProgramName != nullptr && stateSave.currentProgramName[0] != '\0') + if (currentProgramIndex >= 0 && currentProgramName != nullptr && currentProgramName[0] != '\0') { // ignore 'default' program - if (stateSave.currentProgramIndex > 0 || QString(stateSave.currentProgramName).compare("default", Qt::CaseInsensitive) != 0) + if (currentProgramIndex > 0 || QString(currentProgramName).compare("default", Qt::CaseInsensitive) != 0) { - QString program("\n"); - program += QString(" %1\n").arg(stateSave.currentProgramIndex+1); - program += QString(" %1\n").arg(xmlSafeString(stateSave.currentProgramName, true)); + QString programXml("\n"); + programXml += QString(" %1\n").arg(currentProgramIndex+1); + programXml += QString(" %1\n").arg(xmlSafeString(currentProgramName, true)); - content += program; + content += programXml; } } - if (stateSave.currentMidiBank >= 0 && stateSave.currentMidiProgram >= 0) + if (currentMidiBank >= 0 && currentMidiProgram >= 0) { - QString midiProgram("\n"); - midiProgram += QString(" %1\n").arg(stateSave.currentMidiBank+1); - midiProgram += QString(" %1\n").arg(stateSave.currentMidiProgram+1); + QString midiProgramXml("\n"); + midiProgramXml += QString(" %1\n").arg(currentMidiBank+1); + midiProgramXml += QString(" %1\n").arg(currentMidiProgram+1); - content += midiProgram; + content += midiProgramXml; } - for (StateCustomDataItenerator it = stateSave.customData.begin(); it.valid(); it.next()) + for (StateCustomDataItenerator it = customData.begin(); it.valid(); it.next()) { StateCustomData* const stateCustomData(it.getValue()); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->type != nullptr && stateCustomData->type[0] != '\0'); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->key != nullptr && stateCustomData->key[0] != '\0'); CARLA_SAFE_ASSERT_CONTINUE(stateCustomData->value != nullptr); - QString customData("\n"" \n"); - customData += QString(" %1\n").arg(xmlSafeString(stateCustomData->type, true)); - customData += QString(" %1\n").arg(xmlSafeString(stateCustomData->key, true)); + QString customDataXml("\n"" \n"); + customDataXml += QString(" %1\n").arg(xmlSafeString(stateCustomData->type, true)); + customDataXml += QString(" %1\n").arg(xmlSafeString(stateCustomData->key, true)); if (std::strcmp(stateCustomData->type, CUSTOM_DATA_TYPE_CHUNK) == 0 || std::strlen(stateCustomData->value) >= 128) { - customData += " \n"; - customData += QString("%1\n").arg(xmlSafeString(stateCustomData->value, true)); - customData += " \n"; + customDataXml += " \n"; + customDataXml += QString("%1\n").arg(xmlSafeString(stateCustomData->value, true)); + customDataXml += " \n"; } else - customData += QString(" %1\n").arg(xmlSafeString(stateCustomData->value, true)); + customDataXml += QString(" %1\n").arg(xmlSafeString(stateCustomData->value, true)); - customData += " \n"; + customDataXml += " \n"; - content += customData; + content += customDataXml; } - if (stateSave.chunk != nullptr && stateSave.chunk[0] != '\0') + if (chunk != nullptr && chunk[0] != '\0') { - QString chunk("\n"" \n"); - chunk += QString("%1\n").arg(stateSave.chunk); - chunk += " \n"; + QString chunkXml("\n"" \n"); + chunkXml += QString("%1\n").arg(chunk); + chunkXml += " \n"; - content += chunk; + content += chunkXml; } content += " \n"; + + return content; } #endif diff --git a/source/utils/CarlaStateUtils.hpp b/source/utils/CarlaStateUtils.hpp index 7619a0f8d..84ca09ca7 100644 --- a/source/utils/CarlaStateUtils.hpp +++ b/source/utils/CarlaStateUtils.hpp @@ -99,21 +99,23 @@ struct StateSave { StateSave() noexcept; ~StateSave() noexcept; - void reset() noexcept; + void clear() noexcept; - CARLA_DECLARE_NON_COPY_STRUCT(StateSave) -}; - -// ----------------------------------------------------------------------- +#ifdef HAVE_JUCE_LATER + void fillFromXmlElement(const juce::XmlElement* const xmlElement); +#else + void fillFromXmlNode(const QDomNode& xmlNode); +#endif #ifdef HAVE_JUCE_LATER -void fillStateSaveFromXmlElement(StateSave& stateSave, const juce::XmlElement* const xmlElement); -void fillXmlStringFromStateSave(juce::String& content, const StateSave& stateSave); + juce::String toString() const; #else -void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode); -void fillXmlStringFromStateSave(QString& content, const StateSave& stateSave); + QString toString() const; #endif + CARLA_DECLARE_NON_COPY_STRUCT(StateSave) +}; + // ----------------------------------------------------------------------- CARLA_BACKEND_END_NAMESPACE