Browse Source

Misc

tags/1.9.4
falkTX 10 years ago
parent
commit
d3b260da16
3 changed files with 147 additions and 146 deletions
  1. +1
    -0
      source/tests/CarlaUtils4.cpp
  2. +138
    -138
      source/utils/CarlaStateUtils.cpp
  3. +8
    -8
      source/utils/CarlaStateUtils.hpp

+ 1
- 0
source/tests/CarlaUtils4.cpp View File

@@ -48,6 +48,7 @@ using namespace CarlaBackend;


int main() int main()
{ {
SaveState s;
return 0; return 0;
} }




+ 138
- 138
source/utils/CarlaStateUtils.cpp View File

@@ -86,9 +86,9 @@ StateCustomData::~StateCustomData() noexcept
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// SaveState
// StateSave


SaveState::SaveState() noexcept
StateSave::StateSave() noexcept
: type(nullptr), : type(nullptr),
name(nullptr), name(nullptr),
label(nullptr), label(nullptr),
@@ -107,12 +107,12 @@ SaveState::SaveState() noexcept
currentMidiProgram(-1), currentMidiProgram(-1),
chunk(nullptr) {} chunk(nullptr) {}


SaveState::~SaveState() noexcept
StateSave::~StateSave() noexcept
{ {
reset(); reset();
} }


void SaveState::reset() noexcept
void StateSave::reset() noexcept
{ {
if (type != nullptr) if (type != nullptr)
{ {
@@ -214,10 +214,10 @@ static const char* xmlSafeStringCharDup(const QString& string, const bool toXml)
#endif #endif


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// fillSaveStateFromXmlNode
// fillStateSaveFromXmlNode


#ifdef HAVE_JUCE_LATER #ifdef HAVE_JUCE_LATER
void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlElement)
void fillStateSaveFromXmlElement(StateSave& stateSave, const XmlElement* const xmlElement)
{ {
CARLA_SAFE_ASSERT_RETURN(xmlElement != nullptr,); CARLA_SAFE_ASSERT_RETURN(xmlElement != nullptr,);


@@ -236,15 +236,15 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE
const String text(xmlInfo->getAllSubText().trim()); const String text(xmlInfo->getAllSubText().trim());


if (tag.equalsIgnoreCase("type")) if (tag.equalsIgnoreCase("type"))
saveState.type = xmlSafeStringCharDup(text, false);
stateSave.type = xmlSafeStringCharDup(text, false);
else if (tag.equalsIgnoreCase("name")) else if (tag.equalsIgnoreCase("name"))
saveState.name = xmlSafeStringCharDup(text, false);
stateSave.name = xmlSafeStringCharDup(text, false);
else if (tag.equalsIgnoreCase("label") || tag.equalsIgnoreCase("uri")) else if (tag.equalsIgnoreCase("label") || tag.equalsIgnoreCase("uri"))
saveState.label = xmlSafeStringCharDup(text, false);
stateSave.label = xmlSafeStringCharDup(text, false);
else if (tag.equalsIgnoreCase("binary") || tag.equalsIgnoreCase("bundle") || tag.equalsIgnoreCase("filename")) else if (tag.equalsIgnoreCase("binary") || tag.equalsIgnoreCase("bundle") || tag.equalsIgnoreCase("filename"))
saveState.binary = xmlSafeStringCharDup(text, false);
stateSave.binary = xmlSafeStringCharDup(text, false);
else if (tag.equalsIgnoreCase("uniqueid")) else if (tag.equalsIgnoreCase("uniqueid"))
saveState.uniqueId = text.getLargeIntValue();
stateSave.uniqueId = text.getLargeIntValue();
} }
} }


@@ -263,33 +263,33 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE


if (tag.equalsIgnoreCase("active")) if (tag.equalsIgnoreCase("active"))
{ {
saveState.active = (text.equalsIgnoreCase("yes") || text.equalsIgnoreCase("true"));
stateSave.active = (text.equalsIgnoreCase("yes") || text.equalsIgnoreCase("true"));
} }
else if (tag.equalsIgnoreCase("drywet")) else if (tag.equalsIgnoreCase("drywet"))
{ {
saveState.dryWet = carla_fixValue(0.0f, 1.0f, text.getFloatValue());
stateSave.dryWet = carla_fixValue(0.0f, 1.0f, text.getFloatValue());
} }
else if (tag.equalsIgnoreCase("volume")) else if (tag.equalsIgnoreCase("volume"))
{ {
saveState.volume = carla_fixValue(0.0f, 1.27f, text.getFloatValue());
stateSave.volume = carla_fixValue(0.0f, 1.27f, text.getFloatValue());
} }
else if (tag.equalsIgnoreCase("balanceleft") || tag.equalsIgnoreCase("balance-left")) else if (tag.equalsIgnoreCase("balanceleft") || tag.equalsIgnoreCase("balance-left"))
{ {
saveState.balanceLeft = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
stateSave.balanceLeft = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
} }
else if (tag.equalsIgnoreCase("balanceright") || tag.equalsIgnoreCase("balance-right")) else if (tag.equalsIgnoreCase("balanceright") || tag.equalsIgnoreCase("balance-right"))
{ {
saveState.balanceRight = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
stateSave.balanceRight = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
} }
else if (tag.equalsIgnoreCase("panning")) else if (tag.equalsIgnoreCase("panning"))
{ {
saveState.panning = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
stateSave.panning = carla_fixValue(-1.0f, 1.0f, text.getFloatValue());
} }
else if (tag.equalsIgnoreCase("controlchannel") || tag.equalsIgnoreCase("control-channel")) else if (tag.equalsIgnoreCase("controlchannel") || tag.equalsIgnoreCase("control-channel"))
{ {
const int value(text.getIntValue()); const int value(text.getIntValue());
if (value >= 1 && value <= MAX_MIDI_CHANNELS) if (value >= 1 && value <= MAX_MIDI_CHANNELS)
saveState.ctrlChannel = static_cast<int8_t>(value-1);
stateSave.ctrlChannel = static_cast<int8_t>(value-1);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -299,11 +299,11 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE
{ {
const int value(text.getIntValue()); const int value(text.getIntValue());
if (value >= 1) if (value >= 1)
saveState.currentProgramIndex = value-1;
stateSave.currentProgramIndex = value-1;
} }
else if (tag.equalsIgnoreCase("currentprogramname") || tag.equalsIgnoreCase("current-program-name")) else if (tag.equalsIgnoreCase("currentprogramname") || tag.equalsIgnoreCase("current-program-name"))
{ {
saveState.currentProgramName = xmlSafeStringCharDup(text, false);
stateSave.currentProgramName = xmlSafeStringCharDup(text, false);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -313,13 +313,13 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE
{ {
const int value(text.getIntValue()); const int value(text.getIntValue());
if (value >= 1) if (value >= 1)
saveState.currentMidiBank = value-1;
stateSave.currentMidiBank = value-1;
} }
else if (tag.equalsIgnoreCase("currentmidiprogram") || tag.equalsIgnoreCase("current-midi-program")) else if (tag.equalsIgnoreCase("currentmidiprogram") || tag.equalsIgnoreCase("current-midi-program"))
{ {
const int value(text.getIntValue()); const int value(text.getIntValue());
if (value >= 1) if (value >= 1)
saveState.currentMidiProgram = value-1;
stateSave.currentMidiProgram = value-1;
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -366,7 +366,7 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE
} }
} }


saveState.parameters.append(stateParameter);
stateSave.parameters.append(stateParameter);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -389,7 +389,7 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE
stateCustomData->value = xmlSafeStringCharDup(cText, false); stateCustomData->value = xmlSafeStringCharDup(cText, false);
} }


saveState.customData.append(stateCustomData);
stateSave.customData.append(stateCustomData);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -397,14 +397,14 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const XmlElement* const xmlE


else if (tag.equalsIgnoreCase("chunk")) else if (tag.equalsIgnoreCase("chunk"))
{ {
saveState.chunk = xmlSafeStringCharDup(text, false);
stateSave.chunk = xmlSafeStringCharDup(text, false);
} }
} }
} }
} }
} }
#else #else
void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode)
{ {
CARLA_SAFE_ASSERT_RETURN(! xmlNode.isNull(),); CARLA_SAFE_ASSERT_RETURN(! xmlNode.isNull(),);


@@ -424,25 +424,25 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)


if (tag.compare("type", Qt::CaseInsensitive) == 0) if (tag.compare("type", Qt::CaseInsensitive) == 0)
{ {
saveState.type = xmlSafeStringCharDup(text, false);
stateSave.type = xmlSafeStringCharDup(text, false);
} }
else if (tag.compare("name", Qt::CaseInsensitive) == 0) else if (tag.compare("name", Qt::CaseInsensitive) == 0)
{ {
saveState.name = xmlSafeStringCharDup(text, false);
stateSave.name = xmlSafeStringCharDup(text, false);
} }
else if (tag.compare("label", Qt::CaseInsensitive) == 0 || tag.compare("uri", Qt::CaseInsensitive) == 0) else if (tag.compare("label", Qt::CaseInsensitive) == 0 || tag.compare("uri", Qt::CaseInsensitive) == 0)
{ {
saveState.label = xmlSafeStringCharDup(text, false);
stateSave.label = xmlSafeStringCharDup(text, false);
} }
else if (tag.compare("binary", Qt::CaseInsensitive) == 0 || tag.compare("bundle", Qt::CaseInsensitive) == 0 || tag.compare("filename", Qt::CaseInsensitive) == 0) else if (tag.compare("binary", Qt::CaseInsensitive) == 0 || tag.compare("bundle", Qt::CaseInsensitive) == 0 || tag.compare("filename", Qt::CaseInsensitive) == 0)
{ {
saveState.binary = xmlSafeStringCharDup(text, false);
stateSave.binary = xmlSafeStringCharDup(text, false);
} }
else if (tag.compare("uniqueid", Qt::CaseInsensitive) == 0) else if (tag.compare("uniqueid", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const qlonglong uniqueId(text.toLongLong(&ok)); const qlonglong uniqueId(text.toLongLong(&ok));
if (ok) saveState.uniqueId = static_cast<int64_t>(uniqueId);
if (ok) stateSave.uniqueId = static_cast<int64_t>(uniqueId);
} }
} }
} }
@@ -462,44 +462,44 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)


if (tag.compare("active", Qt::CaseInsensitive) == 0) if (tag.compare("active", Qt::CaseInsensitive) == 0)
{ {
saveState.active = (text.compare("yes", Qt::CaseInsensitive) == 0 || text.compare("true", Qt::CaseInsensitive) == 0);
stateSave.active = (text.compare("yes", Qt::CaseInsensitive) == 0 || text.compare("true", Qt::CaseInsensitive) == 0);
} }
else if (tag.compare("drywet", Qt::CaseInsensitive) == 0) else if (tag.compare("drywet", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const float value(text.toFloat(&ok)); const float value(text.toFloat(&ok));
if (ok) saveState.dryWet = carla_fixValue(0.0f, 1.0f, value);
if (ok) stateSave.dryWet = carla_fixValue(0.0f, 1.0f, value);
} }
else if (tag.compare("volume", Qt::CaseInsensitive) == 0) else if (tag.compare("volume", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const float value(text.toFloat(&ok)); const float value(text.toFloat(&ok));
if (ok) saveState.volume = carla_fixValue(0.0f, 1.27f, value);
if (ok) stateSave.volume = carla_fixValue(0.0f, 1.27f, value);
} }
else if (tag.compare("balanceleft", Qt::CaseInsensitive) == 0 || tag.compare("balance-left", Qt::CaseInsensitive) == 0) else if (tag.compare("balanceleft", Qt::CaseInsensitive) == 0 || tag.compare("balance-left", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const float value(text.toFloat(&ok)); const float value(text.toFloat(&ok));
if (ok) saveState.balanceLeft = carla_fixValue(-1.0f, 1.0f, value);
if (ok) stateSave.balanceLeft = carla_fixValue(-1.0f, 1.0f, value);
} }
else if (tag.compare("balanceright", Qt::CaseInsensitive) == 0 || tag.compare("balance-right", Qt::CaseInsensitive) == 0) else if (tag.compare("balanceright", Qt::CaseInsensitive) == 0 || tag.compare("balance-right", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const float value(text.toFloat(&ok)); const float value(text.toFloat(&ok));
if (ok) saveState.balanceRight = carla_fixValue(-1.0f, 1.0f, value);
if (ok) stateSave.balanceRight = carla_fixValue(-1.0f, 1.0f, value);
} }
else if (tag.compare("panning", Qt::CaseInsensitive) == 0) else if (tag.compare("panning", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const float value(text.toFloat(&ok)); const float value(text.toFloat(&ok));
if (ok) saveState.panning = carla_fixValue(-1.0f, 1.0f, value);
if (ok) stateSave.panning = carla_fixValue(-1.0f, 1.0f, value);
} }
else if (tag.compare("controlchannel", Qt::CaseInsensitive) == 0 || tag.compare("control-channel", Qt::CaseInsensitive) == 0) else if (tag.compare("controlchannel", Qt::CaseInsensitive) == 0 || tag.compare("control-channel", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const short value(text.toShort(&ok)); const short value(text.toShort(&ok));
if (ok && value >= 1 && value <= MAX_MIDI_CHANNELS) if (ok && value >= 1 && value <= MAX_MIDI_CHANNELS)
saveState.ctrlChannel = static_cast<int8_t>(value-1);
stateSave.ctrlChannel = static_cast<int8_t>(value-1);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -510,11 +510,11 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
bool ok; bool ok;
const int value(text.toInt(&ok)); const int value(text.toInt(&ok));
if (ok && value >= 1) if (ok && value >= 1)
saveState.currentProgramIndex = value-1;
stateSave.currentProgramIndex = value-1;
} }
else if (tag.compare("currentprogramname", Qt::CaseInsensitive) == 0 || tag.compare("current-program-name", Qt::CaseInsensitive) == 0) else if (tag.compare("currentprogramname", Qt::CaseInsensitive) == 0 || tag.compare("current-program-name", Qt::CaseInsensitive) == 0)
{ {
saveState.currentProgramName = xmlSafeStringCharDup(text, false);
stateSave.currentProgramName = xmlSafeStringCharDup(text, false);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -525,14 +525,14 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
bool ok; bool ok;
const int value(text.toInt(&ok)); const int value(text.toInt(&ok));
if (ok && value >= 1) if (ok && value >= 1)
saveState.currentMidiBank = value-1;
stateSave.currentMidiBank = value-1;
} }
else if (tag.compare("currentmidiprogram", Qt::CaseInsensitive) == 0 || tag.compare("current-midi-program", Qt::CaseInsensitive) == 0) else if (tag.compare("currentmidiprogram", Qt::CaseInsensitive) == 0 || tag.compare("current-midi-program", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const int value(text.toInt(&ok)); const int value(text.toInt(&ok));
if (ok && value >= 1) if (ok && value >= 1)
saveState.currentMidiProgram = value-1;
stateSave.currentMidiProgram = value-1;
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -583,7 +583,7 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
} }
} }


saveState.parameters.append(stateParameter);
stateSave.parameters.append(stateParameter);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -606,7 +606,7 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
stateCustomData->value = xmlSafeStringCharDup(cText, false); stateCustomData->value = xmlSafeStringCharDup(cText, false);
} }


saveState.customData.append(stateCustomData);
stateSave.customData.append(stateCustomData);
} }


// ------------------------------------------------------- // -------------------------------------------------------
@@ -614,7 +614,7 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)


else if (tag.compare("chunk", Qt::CaseInsensitive) == 0) else if (tag.compare("chunk", Qt::CaseInsensitive) == 0)
{ {
saveState.chunk = xmlSafeStringCharDup(text, false);
stateSave.chunk = xmlSafeStringCharDup(text, false);
} }
} }
} }
@@ -623,63 +623,63 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
#endif #endif


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// fillXmlStringFromSaveState
// fillXmlStringFromStateSave


#ifdef HAVE_JUCE_LATER #ifdef HAVE_JUCE_LATER
void fillXmlStringFromSaveState(String& content, const SaveState& saveState)
void fillXmlStringFromStateSave(String& content, const StateSave& stateSave)
{ {
{ {
String info(" <Info>\n"); String info(" <Info>\n");


info << " <Type>" << saveState.type << "</Type>\n";
info << " <Name>" << xmlSafeString(saveState.name, true) << "</Name>\n";
info << " <Type>" << stateSave.type << "</Type>\n";
info << " <Name>" << xmlSafeString(stateSave.name, true) << "</Name>\n";


switch (getPluginTypeFromString(saveState.type))
switch (getPluginTypeFromString(stateSave.type))
{ {
case PLUGIN_NONE: case PLUGIN_NONE:
break; break;
case PLUGIN_INTERNAL: case PLUGIN_INTERNAL:
info << " <Label>" << xmlSafeString(saveState.label, true) << "</Label>\n";
info << " <Label>" << xmlSafeString(stateSave.label, true) << "</Label>\n";
break; break;
case PLUGIN_LADSPA: case PLUGIN_LADSPA:
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <Label>" << xmlSafeString(saveState.label, true) << "</Label>\n";
info << " <UniqueID>" << saveState.uniqueId << "</UniqueID>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
info << " <Label>" << xmlSafeString(stateSave.label, true) << "</Label>\n";
info << " <UniqueID>" << stateSave.uniqueId << "</UniqueID>\n";
break; break;
case PLUGIN_DSSI: case PLUGIN_DSSI:
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <Label>" << xmlSafeString(saveState.label, true) << "</Label>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
info << " <Label>" << xmlSafeString(stateSave.label, true) << "</Label>\n";
break; break;
case PLUGIN_LV2: case PLUGIN_LV2:
info << " <Bundle>" << xmlSafeString(saveState.binary, true) << "</Bundle>\n";
info << " <URI>" << xmlSafeString(saveState.label, true) << "</URI>\n";
info << " <Bundle>" << xmlSafeString(stateSave.binary, true) << "</Bundle>\n";
info << " <URI>" << xmlSafeString(stateSave.label, true) << "</URI>\n";
break; break;
case PLUGIN_VST: case PLUGIN_VST:
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <UniqueID>" << saveState.uniqueId << "</UniqueID>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
info << " <UniqueID>" << stateSave.uniqueId << "</UniqueID>\n";
break; break;
case PLUGIN_VST3: case PLUGIN_VST3:
// TODO? // TODO?
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <UniqueID>" << saveState.uniqueId << "</UniqueID>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
info << " <UniqueID>" << stateSave.uniqueId << "</UniqueID>\n";
break; break;
case PLUGIN_AU: case PLUGIN_AU:
// TODO? // TODO?
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <UniqueID>" << saveState.uniqueId << "</UniqueID>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
info << " <UniqueID>" << stateSave.uniqueId << "</UniqueID>\n";
break; break;
case PLUGIN_JACK: case PLUGIN_JACK:
info << " <Binary>" << xmlSafeString(saveState.binary, true) << "</Binary>\n";
info << " <Binary>" << xmlSafeString(stateSave.binary, true) << "</Binary>\n";
break; break;
case PLUGIN_REWIRE: case PLUGIN_REWIRE:
info << " <Label>" << xmlSafeString(saveState.label, true) << "</Label>\n";
info << " <Label>" << xmlSafeString(stateSave.label, true) << "</Label>\n";
break; break;
case PLUGIN_FILE_CSD: case PLUGIN_FILE_CSD:
case PLUGIN_FILE_GIG: case PLUGIN_FILE_GIG:
case PLUGIN_FILE_SF2: case PLUGIN_FILE_SF2:
case PLUGIN_FILE_SFZ: case PLUGIN_FILE_SFZ:
info << " <Filename>" << xmlSafeString(saveState.binary, true) << "</Filename>\n";
info << " <Label>" << xmlSafeString(saveState.label, true) << "</Label>\n";
info << " <Filename>" << xmlSafeString(stateSave.binary, true) << "</Filename>\n";
info << " <Label>" << xmlSafeString(stateSave.label, true) << "</Label>\n";
break; break;
} }


@@ -693,28 +693,28 @@ void fillXmlStringFromSaveState(String& content, const SaveState& saveState)
{ {
String data; String data;


data << " <Active>" << (saveState.active ? "Yes" : "No") << "</Active>\n";
data << " <Active>" << (stateSave.active ? "Yes" : "No") << "</Active>\n";


if (saveState.dryWet != 1.0f)
data << " <DryWet>" << saveState.dryWet << "</DryWet>\n";
if (saveState.volume != 1.0f)
data << " <Volume>" << saveState.volume << "</Volume>\n";
if (saveState.balanceLeft != -1.0f)
data << " <Balance-Left>" << saveState.balanceLeft << "</Balance-Left>\n";
if (saveState.balanceRight != 1.0f)
data << " <Balance-Right>" << saveState.balanceRight << "</Balance-Right>\n";
if (saveState.panning != 0.0f)
data << " <Panning>" << saveState.panning << "</Panning>\n";
if (stateSave.dryWet != 1.0f)
data << " <DryWet>" << stateSave.dryWet << "</DryWet>\n";
if (stateSave.volume != 1.0f)
data << " <Volume>" << stateSave.volume << "</Volume>\n";
if (stateSave.balanceLeft != -1.0f)
data << " <Balance-Left>" << stateSave.balanceLeft << "</Balance-Left>\n";
if (stateSave.balanceRight != 1.0f)
data << " <Balance-Right>" << stateSave.balanceRight << "</Balance-Right>\n";
if (stateSave.panning != 0.0f)
data << " <Panning>" << stateSave.panning << "</Panning>\n";


if (saveState.ctrlChannel < 0)
if (stateSave.ctrlChannel < 0)
data << " <ControlChannel>N</ControlChannel>\n"; data << " <ControlChannel>N</ControlChannel>\n";
else else
data << " <ControlChannel>" << int(saveState.ctrlChannel+1) << "</ControlChannel>\n";
data << " <ControlChannel>" << int(stateSave.ctrlChannel+1) << "</ControlChannel>\n";


content << data; content << data;
} }


for (StateParameterItenerator it = saveState.parameters.begin(); it.valid(); it.next())
for (StateParameterItenerator it = stateSave.parameters.begin(); it.valid(); it.next())
{ {
StateParameter* const stateParameter(it.getValue()); StateParameter* const stateParameter(it.getValue());


@@ -740,29 +740,29 @@ void fillXmlStringFromSaveState(String& content, const SaveState& saveState)
content << parameter; content << parameter;
} }


if (saveState.currentProgramIndex >= 0 && saveState.currentProgramName != nullptr && saveState.currentProgramName[0] != '\0')
if (stateSave.currentProgramIndex >= 0 && stateSave.currentProgramName != nullptr && stateSave.currentProgramName[0] != '\0')
{ {
// ignore 'default' program // ignore 'default' program
if (saveState.currentProgramIndex > 0 || ! String(saveState.currentProgramName).equalsIgnoreCase("default"))
if (stateSave.currentProgramIndex > 0 || ! String(stateSave.currentProgramName).equalsIgnoreCase("default"))
{ {
String program("\n"); String program("\n");
program << " <CurrentProgramIndex>" << saveState.currentProgramIndex+1 << "</CurrentProgramIndex>\n";
program << " <CurrentProgramName>" << xmlSafeString(saveState.currentProgramName, true) << "</CurrentProgramName>\n";
program << " <CurrentProgramIndex>" << stateSave.currentProgramIndex+1 << "</CurrentProgramIndex>\n";
program << " <CurrentProgramName>" << xmlSafeString(stateSave.currentProgramName, true) << "</CurrentProgramName>\n";


content << program; content << program;
} }
} }


if (saveState.currentMidiBank >= 0 && saveState.currentMidiProgram >= 0)
if (stateSave.currentMidiBank >= 0 && stateSave.currentMidiProgram >= 0)
{ {
String midiProgram("\n"); String midiProgram("\n");
midiProgram << " <CurrentMidiBank>" << saveState.currentMidiBank+1 << "</CurrentMidiBank>\n";
midiProgram << " <CurrentMidiProgram>" << saveState.currentMidiProgram+1 << "</CurrentMidiProgram>\n";
midiProgram << " <CurrentMidiBank>" << stateSave.currentMidiBank+1 << "</CurrentMidiBank>\n";
midiProgram << " <CurrentMidiProgram>" << stateSave.currentMidiProgram+1 << "</CurrentMidiProgram>\n";


content << midiProgram; content << midiProgram;
} }


for (StateCustomDataItenerator it = saveState.customData.begin(); it.valid(); it.next())
for (StateCustomDataItenerator it = stateSave.customData.begin(); it.valid(); it.next())
{ {
StateCustomData* const stateCustomData(it.getValue()); StateCustomData* const stateCustomData(it.getValue());


@@ -788,10 +788,10 @@ void fillXmlStringFromSaveState(String& content, const SaveState& saveState)
content << customData; content << customData;
} }


if (saveState.chunk != nullptr && saveState.chunk[0] != '\0')
if (stateSave.chunk != nullptr && stateSave.chunk[0] != '\0')
{ {
String chunk("\n"" <Chunk>\n"); String chunk("\n"" <Chunk>\n");
chunk << saveState.chunk << "\n </Chunk>\n";
chunk << stateSave.chunk << "\n </Chunk>\n";


content << chunk; content << chunk;
} }
@@ -799,60 +799,60 @@ void fillXmlStringFromSaveState(String& content, const SaveState& saveState)
content << " </Data>\n"; content << " </Data>\n";
} }
#else #else
void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
void fillXmlStringFromStateSave(QString& content, const StateSave& stateSave)
{ {
{ {
QString info(" <Info>\n"); QString info(" <Info>\n");


info += QString(" <Type>%1</Type>\n").arg(saveState.type);
info += QString(" <Name>%1</Name>\n").arg(xmlSafeString(saveState.name, true));
info += QString(" <Type>%1</Type>\n").arg(stateSave.type);
info += QString(" <Name>%1</Name>\n").arg(xmlSafeString(stateSave.name, true));


switch (getPluginTypeFromString(saveState.type))
switch (getPluginTypeFromString(stateSave.type))
{ {
case PLUGIN_NONE: case PLUGIN_NONE:
break; break;
case PLUGIN_INTERNAL: case PLUGIN_INTERNAL:
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(stateSave.label, true));
break; break;
case PLUGIN_LADSPA: case PLUGIN_LADSPA:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(stateSave.label, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(stateSave.uniqueId);
break; break;
case PLUGIN_DSSI: case PLUGIN_DSSI:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(stateSave.label, true));
break; break;
case PLUGIN_LV2: case PLUGIN_LV2:
info += QString(" <Bundle>%1</Bundle>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <URI>%1</URI>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <Bundle>%1</Bundle>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <URI>%1</URI>\n").arg(xmlSafeString(stateSave.label, true));
break; break;
case PLUGIN_VST: case PLUGIN_VST:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(stateSave.uniqueId);
break; break;
case PLUGIN_VST3: case PLUGIN_VST3:
// TODO? // TODO?
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(stateSave.uniqueId);
break; break;
case PLUGIN_AU: case PLUGIN_AU:
// TODO? // TODO?
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(stateSave.uniqueId);
break; break;
case PLUGIN_JACK: case PLUGIN_JACK:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(stateSave.binary, true));
break; break;
case PLUGIN_REWIRE: case PLUGIN_REWIRE:
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(stateSave.label, true));
break; break;
case PLUGIN_FILE_CSD: case PLUGIN_FILE_CSD:
case PLUGIN_FILE_GIG: case PLUGIN_FILE_GIG:
case PLUGIN_FILE_SF2: case PLUGIN_FILE_SF2:
case PLUGIN_FILE_SFZ: case PLUGIN_FILE_SFZ:
info += QString(" <Filename>%1</Filename>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <Filename>%1</Filename>\n").arg(xmlSafeString(stateSave.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(stateSave.label, true));
break; break;
} }


@@ -866,28 +866,28 @@ void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
{ {
QString data; QString data;


data += QString(" <Active>%1</Active>\n").arg(saveState.active ? "Yes" : "No");
data += QString(" <Active>%1</Active>\n").arg(stateSave.active ? "Yes" : "No");


if (saveState.dryWet != 1.0f)
data += QString(" <DryWet>%1</DryWet>\n").arg(saveState.dryWet, 0, 'g', 7);
if (saveState.volume != 1.0f)
data += QString(" <Volume>%1</Volume>\n").arg(saveState.volume, 0, 'g', 7);
if (saveState.balanceLeft != -1.0f)
data += QString(" <Balance-Left>%1</Balance-Left>\n").arg(saveState.balanceLeft, 0, 'g', 7);
if (saveState.balanceRight != 1.0f)
data += QString(" <Balance-Right>%1</Balance-Right>\n").arg(saveState.balanceRight, 0, 'g', 7);
if (saveState.panning != 0.0f)
data += QString(" <Panning>%1</Panning>\n").arg(saveState.panning, 0, 'g', 7);
if (stateSave.dryWet != 1.0f)
data += QString(" <DryWet>%1</DryWet>\n").arg(stateSave.dryWet, 0, 'g', 7);
if (stateSave.volume != 1.0f)
data += QString(" <Volume>%1</Volume>\n").arg(stateSave.volume, 0, 'g', 7);
if (stateSave.balanceLeft != -1.0f)
data += QString(" <Balance-Left>%1</Balance-Left>\n").arg(stateSave.balanceLeft, 0, 'g', 7);
if (stateSave.balanceRight != 1.0f)
data += QString(" <Balance-Right>%1</Balance-Right>\n").arg(stateSave.balanceRight, 0, 'g', 7);
if (stateSave.panning != 0.0f)
data += QString(" <Panning>%1</Panning>\n").arg(stateSave.panning, 0, 'g', 7);


if (saveState.ctrlChannel < 0)
if (stateSave.ctrlChannel < 0)
data += QString(" <ControlChannel>N</ControlChannel>\n"); data += QString(" <ControlChannel>N</ControlChannel>\n");
else else
data += QString(" <ControlChannel>%1</ControlChannel>\n").arg(saveState.ctrlChannel+1);
data += QString(" <ControlChannel>%1</ControlChannel>\n").arg(stateSave.ctrlChannel+1);


content += data; content += data;
} }


for (StateParameterItenerator it = saveState.parameters.begin(); it.valid(); it.next())
for (StateParameterItenerator it = stateSave.parameters.begin(); it.valid(); it.next())
{ {
StateParameter* const stateParameter(it.getValue()); StateParameter* const stateParameter(it.getValue());


@@ -913,29 +913,29 @@ void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
content += parameter; content += parameter;
} }


if (saveState.currentProgramIndex >= 0 && saveState.currentProgramName != nullptr && saveState.currentProgramName[0] != '\0')
if (stateSave.currentProgramIndex >= 0 && stateSave.currentProgramName != nullptr && stateSave.currentProgramName[0] != '\0')
{ {
// ignore 'default' program // ignore 'default' program
if (saveState.currentProgramIndex > 0 || QString(saveState.currentProgramName).compare("default", Qt::CaseInsensitive) != 0)
if (stateSave.currentProgramIndex > 0 || QString(stateSave.currentProgramName).compare("default", Qt::CaseInsensitive) != 0)
{ {
QString program("\n"); QString program("\n");
program += QString(" <CurrentProgramIndex>%1</CurrentProgramIndex>\n").arg(saveState.currentProgramIndex+1);
program += QString(" <CurrentProgramName>%1</CurrentProgramName>\n").arg(xmlSafeString(saveState.currentProgramName, true));
program += QString(" <CurrentProgramIndex>%1</CurrentProgramIndex>\n").arg(stateSave.currentProgramIndex+1);
program += QString(" <CurrentProgramName>%1</CurrentProgramName>\n").arg(xmlSafeString(stateSave.currentProgramName, true));


content += program; content += program;
} }
} }


if (saveState.currentMidiBank >= 0 && saveState.currentMidiProgram >= 0)
if (stateSave.currentMidiBank >= 0 && stateSave.currentMidiProgram >= 0)
{ {
QString midiProgram("\n"); QString midiProgram("\n");
midiProgram += QString(" <CurrentMidiBank>%1</CurrentMidiBank>\n").arg(saveState.currentMidiBank+1);
midiProgram += QString(" <CurrentMidiProgram>%1</CurrentMidiProgram>\n").arg(saveState.currentMidiProgram+1);
midiProgram += QString(" <CurrentMidiBank>%1</CurrentMidiBank>\n").arg(stateSave.currentMidiBank+1);
midiProgram += QString(" <CurrentMidiProgram>%1</CurrentMidiProgram>\n").arg(stateSave.currentMidiProgram+1);


content += midiProgram; content += midiProgram;
} }


for (StateCustomDataItenerator it = saveState.customData.begin(); it.valid(); it.next())
for (StateCustomDataItenerator it = stateSave.customData.begin(); it.valid(); it.next())
{ {
StateCustomData* const stateCustomData(it.getValue()); StateCustomData* const stateCustomData(it.getValue());


@@ -957,10 +957,10 @@ void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
content += customData; content += customData;
} }


if (saveState.chunk != nullptr && saveState.chunk[0] != '\0')
if (stateSave.chunk != nullptr && stateSave.chunk[0] != '\0')
{ {
QString chunk("\n"" <Chunk>\n"); QString chunk("\n"" <Chunk>\n");
chunk += QString("%1\n").arg(saveState.chunk);
chunk += QString("%1\n").arg(stateSave.chunk);
chunk += " </Chunk>\n"; chunk += " </Chunk>\n";


content += chunk; content += chunk;


+ 8
- 8
source/utils/CarlaStateUtils.hpp View File

@@ -73,7 +73,7 @@ typedef LinkedList<StateCustomData*> StateCustomDataList;
typedef LinkedList<StateParameter*>::Itenerator StateParameterItenerator; typedef LinkedList<StateParameter*>::Itenerator StateParameterItenerator;
typedef LinkedList<StateCustomData*>::Itenerator StateCustomDataItenerator; typedef LinkedList<StateCustomData*>::Itenerator StateCustomDataItenerator;


struct SaveState {
struct StateSave {
const char* type; const char* type;
const char* name; const char* name;
const char* label; const char* label;
@@ -97,21 +97,21 @@ struct SaveState {
StateParameterList parameters; StateParameterList parameters;
StateCustomDataList customData; StateCustomDataList customData;


SaveState() noexcept;
~SaveState() noexcept;
StateSave() noexcept;
~StateSave() noexcept;
void reset() noexcept; void reset() noexcept;


CARLA_DECLARE_NON_COPY_STRUCT(SaveState)
CARLA_DECLARE_NON_COPY_STRUCT(StateSave)
}; };


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


#ifdef HAVE_JUCE_LATER #ifdef HAVE_JUCE_LATER
void fillSaveStateFromXmlNode(SaveState& saveState, const juce::XmlElement* const xmlElement);
void fillXmlStringFromSaveState(juce::String& content, const SaveState& saveState);
void fillStateSaveFromXmlElement(StateSave& stateSave, const juce::XmlElement* const xmlElement);
void fillXmlStringFromStateSave(juce::String& content, const StateSave& stateSave);
#else #else
void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode);
void fillXmlStringFromSaveState(QString& content, const SaveState& saveState);
void fillStateSaveFromXmlNode(StateSave& stateSave, const QDomNode& xmlNode);
void fillXmlStringFromStateSave(QString& content, const StateSave& stateSave);
#endif #endif


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


Loading…
Cancel
Save