|
|
@@ -1707,34 +1707,43 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons |
|
|
|
const bool isPlugin(getType() == kEngineTypePlugin); |
|
|
|
const EngineOptions& options(pData->options); |
|
|
|
|
|
|
|
MemoryOutputStream outSettings(1024); |
|
|
|
{ |
|
|
|
MemoryOutputStream outSettings(1024); |
|
|
|
|
|
|
|
// save appropriate engine settings |
|
|
|
outSettings << " <EngineSettings>\n"; |
|
|
|
outSettings << " <EngineSettings>\n"; |
|
|
|
|
|
|
|
//processMode |
|
|
|
//transportMode |
|
|
|
outSettings << " <ForceStereo>" << bool2str(options.forceStereo) << "</ForceStereo>\n"; |
|
|
|
outSettings << " <PreferPluginBridges>" << bool2str(options.preferPluginBridges) << "</PreferPluginBridges>\n"; |
|
|
|
outSettings << " <PreferUiBridges>" << bool2str(options.preferUiBridges) << "</PreferUiBridges>\n"; |
|
|
|
outSettings << " <UIsAlwaysOnTop>" << bool2str(options.uisAlwaysOnTop) << "</UIsAlwaysOnTop>\n"; |
|
|
|
|
|
|
|
outSettings << " <ForceStereo>" << bool2str(options.forceStereo) << "</ForceStereo>\n"; |
|
|
|
outSettings << " <PreferPluginBridges>" << bool2str(options.preferPluginBridges) << "</PreferPluginBridges>\n"; |
|
|
|
outSettings << " <PreferUiBridges>" << bool2str(options.preferUiBridges) << "</PreferUiBridges>\n"; |
|
|
|
outSettings << " <UIsAlwaysOnTop>" << bool2str(options.uisAlwaysOnTop) << "</UIsAlwaysOnTop>\n"; |
|
|
|
outSettings << " <MaxParameters>" << String(options.maxParameters) << "</MaxParameters>\n"; |
|
|
|
outSettings << " <UIBridgesTimeout>" << String(options.uiBridgesTimeout) << "</UIBridgesTimeout>\n"; |
|
|
|
|
|
|
|
outSettings << " <MaxParameters>" << String(options.maxParameters) << "</MaxParameters>\n"; |
|
|
|
outSettings << " <UIBridgesTimeout>" << String(options.uiBridgesTimeout) << "</UIBridgesTimeout>\n"; |
|
|
|
if (isPlugin) |
|
|
|
{ |
|
|
|
outSettings << " <LADSPA_PATH>" << xmlSafeString(options.pathLADSPA, true) << "</LADSPA_PATH>\n"; |
|
|
|
outSettings << " <DSSI_PATH>" << xmlSafeString(options.pathDSSI, true) << "</DSSI_PATH>\n"; |
|
|
|
outSettings << " <LV2_PATH>" << xmlSafeString(options.pathLV2, true) << "</LV2_PATH>\n"; |
|
|
|
outSettings << " <VST2_PATH>" << xmlSafeString(options.pathVST2, true) << "</VST2_PATH>\n"; |
|
|
|
outSettings << " <SF2_PATH>" << xmlSafeString(options.pathSF2, true) << "</SF2_PATH>\n"; |
|
|
|
outSettings << " <SFZ_PATH>" << xmlSafeString(options.pathSFZ, true) << "</SFZ_PATH>\n"; |
|
|
|
} |
|
|
|
|
|
|
|
if (isPlugin) |
|
|
|
{ |
|
|
|
outSettings << " <LADSPA_PATH>" << xmlSafeString(options.pathLADSPA, true) << "</LADSPA_PATH>\n"; |
|
|
|
outSettings << " <DSSI_PATH>" << xmlSafeString(options.pathDSSI, true) << "</DSSI_PATH>\n"; |
|
|
|
outSettings << " <LV2_PATH>" << xmlSafeString(options.pathLV2, true) << "</LV2_PATH>\n"; |
|
|
|
outSettings << " <VST2_PATH>" << xmlSafeString(options.pathVST2, true) << "</VST2_PATH>\n"; |
|
|
|
outSettings << " <SF2_PATH>" << xmlSafeString(options.pathSF2, true) << "</SF2_PATH>\n"; |
|
|
|
outSettings << " <SFZ_PATH>" << xmlSafeString(options.pathSFZ, true) << "</SFZ_PATH>\n"; |
|
|
|
outSettings << " </EngineSettings>\n"; |
|
|
|
outStream << outSettings; |
|
|
|
} |
|
|
|
|
|
|
|
outSettings << " </EngineSettings>\n"; |
|
|
|
outStream << outSettings; |
|
|
|
if (pData->timeInfo.bbt.valid && ! isPlugin) |
|
|
|
{ |
|
|
|
MemoryOutputStream outTransport(128); |
|
|
|
|
|
|
|
outTransport << "\n <Transport>\n"; |
|
|
|
// outTransport << " <BeatsPerBar>" << pData->timeInfo.bbt.beatsPerBar << "</BeatsPerBar>\n"; |
|
|
|
outTransport << " <BeatsPerMinute>" << pData->timeInfo.bbt.beatsPerMinute << "</BeatsPerMinute>\n"; |
|
|
|
outTransport << " </Transport>\n"; |
|
|
|
outStream << outTransport; |
|
|
|
} |
|
|
|
|
|
|
|
char strBuf[STR_MAX+1]; |
|
|
|
|
|
|
@@ -1939,14 +1948,9 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) |
|
|
|
|
|
|
|
const bool isPlugin(getType() == kEngineTypePlugin); |
|
|
|
|
|
|
|
// engine settings |
|
|
|
for (XmlElement* elem = xmlElement->getFirstChildElement(); elem != nullptr; elem = elem->getNextElement()) |
|
|
|
// load engine settings first of all |
|
|
|
if (XmlElement* const elem = isPreset ? nullptr : xmlElement->getChildByName("EngineSettings")) |
|
|
|
{ |
|
|
|
const String& tagName(elem->getTagName()); |
|
|
|
|
|
|
|
if (! tagName.equalsIgnoreCase("enginesettings")) |
|
|
|
continue; |
|
|
|
|
|
|
|
for (XmlElement* settElem = elem->getFirstChildElement(); settElem != nullptr; settElem = settElem->getNextElement()) |
|
|
|
{ |
|
|
|
const String& tag(settElem->getTagName()); |
|
|
@@ -2033,14 +2037,29 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) |
|
|
|
|
|
|
|
setOption(static_cast<EngineOption>(option), value, valueStr); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
if (pData->aboutToClose) |
|
|
|
return true; |
|
|
|
|
|
|
|
// now setup transport |
|
|
|
if (XmlElement* const elem = isPreset || isPlugin ? nullptr : xmlElement->getChildByName("Transport")) |
|
|
|
{ |
|
|
|
if (XmlElement* const bpmElem = elem->getChildByName("BeatsPerMinute")) |
|
|
|
{ |
|
|
|
const String bpmText(bpmElem->getAllSubText().trim()); |
|
|
|
const double bpm = bpmText.getDoubleValue(); |
|
|
|
|
|
|
|
// some sane limits |
|
|
|
if (bpm >= 20.0 && bpm < 400.0) |
|
|
|
pData->time.setBPM(bpm); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (pData->aboutToClose) |
|
|
|
return true; |
|
|
|
|
|
|
|
// handle plugins first |
|
|
|
// and we handle plugins |
|
|
|
for (XmlElement* elem = xmlElement->getFirstChildElement(); elem != nullptr; elem = elem->getNextElement()) |
|
|
|
{ |
|
|
|
const String& tagName(elem->getTagName()); |
|
|
@@ -2254,7 +2273,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) |
|
|
|
if (pData->aboutToClose) |
|
|
|
return true; |
|
|
|
|
|
|
|
// handle connections (internal) |
|
|
|
// and now we handle connections (internal) |
|
|
|
if (pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) |
|
|
|
{ |
|
|
|
const bool isUsingExternal(pData->graph.isUsingExternal()); |
|
|
@@ -2318,7 +2337,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) |
|
|
|
else |
|
|
|
loadExternalConnections = true; |
|
|
|
|
|
|
|
// handle connections |
|
|
|
// plus external connections too |
|
|
|
if (loadExternalConnections) |
|
|
|
{ |
|
|
|
const bool isUsingExternal(pData->options.processMode != ENGINE_PROCESS_MODE_PATCHBAY || |
|
|
|