Browse Source

Better handling of LV2 temporary state, for clone and rename

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.2.0-RC1
falkTX 4 years ago
parent
commit
1e29ecdd12
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
13 changed files with 88 additions and 43 deletions
  1. +10
    -8
      source/backend/CarlaPlugin.hpp
  2. +1
    -1
      source/backend/CarlaStandalone.cpp
  3. +5
    -4
      source/backend/engine/CarlaEngine.cpp
  4. +2
    -2
      source/backend/engine/CarlaEngineBridge.cpp
  5. +1
    -1
      source/backend/engine/CarlaEngineNative.cpp
  6. +8
    -5
      source/backend/plugin/CarlaPlugin.cpp
  7. +2
    -2
      source/backend/plugin/CarlaPluginBridge.cpp
  8. +6
    -5
      source/backend/plugin/CarlaPluginFluidSynth.cpp
  9. +1
    -1
      source/backend/plugin/CarlaPluginJack.cpp
  10. +47
    -13
      source/backend/plugin/CarlaPluginLV2.cpp
  11. +1
    -1
      source/backend/plugin/CarlaPluginNative.cpp
  12. +1
    -0
      source/utils/CarlaStateUtils.cpp
  13. +3
    -0
      source/utils/CarlaStateUtils.hpp

+ 10
- 8
source/backend/CarlaPlugin.hpp View File

@@ -401,8 +401,17 @@ public:


/*! /*!
* Tell the plugin to prepare for save. * Tell the plugin to prepare for save.
* @param temporary Wherever we are saving into a temporary location
* (for duplication, renaming or similar)
*/ */
virtual void prepareForSave();
virtual void prepareForSave(bool temporary);

/*!
* Call LV2 restore.
* @param temporary Wherever we are saving into a temporary location
* (for duplication, renaming or similar)
*/
virtual void restoreLV2State(bool temporary) noexcept;


/*! /*!
* Reset all possible parameters. * Reset all possible parameters.
@@ -981,13 +990,6 @@ protected:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Internal helper functions // Internal helper functions


public:
// FIXME: remove public exception on 2.1 release
/*!
* Call LV2 restore.
*/
virtual void restoreLV2State() noexcept;

protected: protected:
/*! /*!
* Allow engine to signal that plugin will be deleted soon. * Allow engine to signal that plugin will be deleted soon.


+ 1
- 1
source/backend/CarlaStandalone.cpp View File

@@ -2121,7 +2121,7 @@ void carla_prepare_for_save(CarlaHostHandle handle, uint pluginId)
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,);


if (const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId)) if (const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId))
plugin->prepareForSave();
plugin->prepareForSave(false);
} }


void carla_reset_parameters(CarlaHostHandle handle, uint pluginId) void carla_reset_parameters(CarlaHostHandle handle, uint pluginId)


+ 5
- 4
source/backend/engine/CarlaEngine.cpp View File

@@ -694,7 +694,8 @@ bool CarlaEngine::addPlugin(const BinaryType btype,
"http://sfztools.github.io/sfizz:sfzfile", "http://sfztools.github.io/sfizz:sfzfile",
filename, filename,
false); false);
plugin->restoreLV2State();

plugin->restoreLV2State(true);
} }
#endif #endif


@@ -2214,7 +2215,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons
if (plugin->getHints() & PLUGIN_IS_BRIDGE) if (plugin->getHints() & PLUGIN_IS_BRIDGE)
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "false", false); plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "false", false);
#endif #endif
plugin->prepareForSave();
plugin->prepareForSave(false);
} }
} }
} }
@@ -2774,7 +2775,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
lsState << "0 0 0 0 1 0 GIG\n"; lsState << "0 0 0 0 1 0 GIG\n";


plugin->setCustomData(LV2_ATOM__String, "http://linuxsampler.org/schema#state-string", lsState.toRawUTF8(), true); plugin->setCustomData(LV2_ATOM__String, "http://linuxsampler.org/schema#state-string", lsState.toRawUTF8(), true);
plugin->restoreLV2State();
plugin->restoreLV2State(true);


plugin->setDryWet(stateSave.dryWet, true, true); plugin->setDryWet(stateSave.dryWet, true, true);
plugin->setVolume(stateSave.volume, true, true); plugin->setVolume(stateSave.volume, true, true);
@@ -2827,7 +2828,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
stateSave.binary, stateSave.binary,
false); false);


plugin->restoreLV2State();
plugin->restoreLV2State(true);


plugin->setDryWet(stateSave.dryWet, true, true); plugin->setDryWet(stateSave.dryWet, true, true);
plugin->setVolume(stateSave.volume, true, true); plugin->setVolume(stateSave.volume, true, true);


+ 2
- 2
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -990,7 +990,7 @@ public:
return; return;
} }


plugin->prepareForSave();
plugin->prepareForSave(false);


for (uint32_t i=0, count=plugin->getCustomDataCount(); i<count; ++i) for (uint32_t i=0, count=plugin->getCustomDataCount(); i<count; ++i)
{ {
@@ -1064,7 +1064,7 @@ public:


case kPluginBridgeNonRtClientRestoreLV2State: case kPluginBridgeNonRtClientRestoreLV2State:
if (plugin->isEnabled()) if (plugin->isEnabled())
plugin->restoreLV2State();
plugin->restoreLV2State(false);
break; break;


case kPluginBridgeNonRtClientShowUI: case kPluginBridgeNonRtClientShowUI:


+ 1
- 1
source/backend/engine/CarlaEngineNative.cpp View File

@@ -2255,7 +2255,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);


if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId))
plugin->prepareForSave();
plugin->prepareForSave(false);
} }
else if (std::strcmp(msg, "reset_parameters") == 0) else if (std::strcmp(msg, "reset_parameters") == 0)
{ {


+ 8
- 5
source/backend/plugin/CarlaPlugin.cpp View File

@@ -439,7 +439,7 @@ void CarlaPlugin::getParameterCountInfo(uint32_t& ins, uint32_t& outs) const noe
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void CarlaPlugin::prepareForSave()
void CarlaPlugin::prepareForSave(bool)
{ {
} }


@@ -508,7 +508,10 @@ void CarlaPlugin::randomizeParameters() noexcept
const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave)
{ {
if (callPrepareForSave) if (callPrepareForSave)
prepareForSave();
{
pData->stateSave.temporary = true;
prepareForSave(true);
}


pData->stateSave.clear(); pData->stateSave.clear();


@@ -902,7 +905,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave)
if (std::strcmp(customData.type, CUSTOM_DATA_TYPE_PROPERTY) == 0) if (std::strcmp(customData.type, CUSTOM_DATA_TYPE_PROPERTY) == 0)
continue; continue;


restoreLV2State();
restoreLV2State(stateSave.temporary);
break; break;
} }
} }
@@ -2564,9 +2567,9 @@ void CarlaPlugin::setPatchbayNodeId(const uint32_t nodeId) noexcept


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


void CarlaPlugin::restoreLV2State() noexcept
void CarlaPlugin::restoreLV2State(const bool temporary) noexcept
{ {
carla_stderr2("Warning: restoreLV2State() called for non-implemented type");
carla_stderr2("Warning: restoreLV2State(%s) called for non-implemented type", bool2str(temporary));
} }


void CarlaPlugin::prepareForDeletion() noexcept void CarlaPlugin::prepareForDeletion() noexcept


+ 2
- 2
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -606,7 +606,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void prepareForSave() noexcept override
void prepareForSave(bool) noexcept override
{ {
fSaved = false; fSaved = false;


@@ -1946,7 +1946,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Internal helper functions // Internal helper functions


void restoreLV2State() noexcept override
void restoreLV2State(bool) noexcept override
{ {
const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex);




+ 6
- 5
source/backend/plugin/CarlaPluginFluidSynth.cpp View File

@@ -378,13 +378,14 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void prepareForSave() override
void prepareForSave(bool) override
{ {
char strBuf[STR_MAX+1]; char strBuf[STR_MAX+1];
std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i", fCurMidiProgs[0], fCurMidiProgs[1], fCurMidiProgs[2], fCurMidiProgs[3],
fCurMidiProgs[4], fCurMidiProgs[5], fCurMidiProgs[6], fCurMidiProgs[7],
fCurMidiProgs[8], fCurMidiProgs[9], fCurMidiProgs[10], fCurMidiProgs[11],
fCurMidiProgs[12], fCurMidiProgs[13], fCurMidiProgs[14], fCurMidiProgs[15]);
std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i",
fCurMidiProgs[0], fCurMidiProgs[1], fCurMidiProgs[2], fCurMidiProgs[3],
fCurMidiProgs[4], fCurMidiProgs[5], fCurMidiProgs[6], fCurMidiProgs[7],
fCurMidiProgs[8], fCurMidiProgs[9], fCurMidiProgs[10], fCurMidiProgs[11],
fCurMidiProgs[12], fCurMidiProgs[13], fCurMidiProgs[14], fCurMidiProgs[15]);


CarlaPlugin::setCustomData(CUSTOM_DATA_TYPE_STRING, "midiPrograms", strBuf, false); CarlaPlugin::setCustomData(CUSTOM_DATA_TYPE_STRING, "midiPrograms", strBuf, false);
} }


+ 1
- 1
source/backend/plugin/CarlaPluginJack.cpp View File

@@ -676,7 +676,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void prepareForSave() noexcept override
void prepareForSave(bool) noexcept override
{ {
#ifdef HAVE_LIBLO #ifdef HAVE_LIBLO
if (fInfo.setupLabel.length() == 6) if (fInfo.setupLabel.length() == 6)


+ 47
- 13
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -1321,20 +1321,24 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void prepareForSave() override
void prepareForSave(const bool temporary) override
{ {
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);


if (fExt.state != nullptr && fExt.state->save != nullptr) if (fExt.state != nullptr && fExt.state->save != nullptr)
{ {
const File tmpDir(handleStateMapToAbsolutePath(false, false, true, "."));

if (tmpDir.exists())
// move temporary stuff to main state dir on full save
if (! temporary)
{ {
const File stateDir(handleStateMapToAbsolutePath(true, false, false, "."));
const File tmpDir(handleStateMapToAbsolutePath(false, false, true, "."));


if (stateDir.isNotNull())
tmpDir.moveFileTo(stateDir);
if (tmpDir.exists())
{
const File stateDir(handleStateMapToAbsolutePath(true, false, false, "."));

if (stateDir.isNotNull())
tmpDir.moveFileTo(stateDir);
}
} }


fExt.state->save(fHandle, carla_lv2_state_store, this, LV2_STATE_IS_POD, fStateFeatures); fExt.state->save(fHandle, carla_lv2_state_store, this, LV2_STATE_IS_POD, fStateFeatures);
@@ -1349,8 +1353,27 @@ public:


void setName(const char* const newName) override void setName(const char* const newName) override
{ {
const File tmpDir1(handleStateMapToAbsolutePath(false, false, true, "."));

CarlaPlugin::setName(newName); CarlaPlugin::setName(newName);


if (tmpDir1.exists())
{
const File tmpDir2(handleStateMapToAbsolutePath(false, false, true, "."));

carla_stdout("dir1 %s, dir2 %s",
tmpDir1.getFullPathName().toRawUTF8(),
tmpDir2.getFullPathName().toRawUTF8());

if (tmpDir2.isNotNull())
{
if (tmpDir2.exists())
tmpDir2.deleteRecursively();

tmpDir1.moveFileTo(tmpDir2);
}
}

if (fLv2Options.windowTitle != nullptr && pData->uiTitle.isEmpty()) if (fLv2Options.windowTitle != nullptr && pData->uiTitle.isEmpty())
setWindowTitle(nullptr); setWindowTitle(nullptr);
} }
@@ -4840,15 +4863,18 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Internal helper functions // Internal helper functions


void restoreLV2State() noexcept override
void restoreLV2State(const bool temporary) noexcept override
{ {
if (fExt.state == nullptr || fExt.state->restore == nullptr) if (fExt.state == nullptr || fExt.state->restore == nullptr)
return; return;


const File tmpDir(handleStateMapToAbsolutePath(false, false, true, "."));
if (! temporary)
{
const File tmpDir(handleStateMapToAbsolutePath(false, false, true, "."));


if (tmpDir.exists())
tmpDir.deleteRecursively();
if (tmpDir.exists())
tmpDir.deleteRecursively();
}


LV2_State_Status status = LV2_STATE_ERR_UNKNOWN; LV2_State_Status status = LV2_STATE_ERR_UNKNOWN;


@@ -4856,13 +4882,21 @@ public:
const ScopedSingleProcessLocker spl(this, !fHasThreadSafeRestore); const ScopedSingleProcessLocker spl(this, !fHasThreadSafeRestore);


try { try {
status = fExt.state->restore(fHandle, carla_lv2_state_retrieve, this, LV2_STATE_IS_POD, fStateFeatures);
status = fExt.state->restore(fHandle,
carla_lv2_state_retrieve,
this,
LV2_STATE_IS_POD,
temporary ? fFeatures : fStateFeatures);
} catch(...) {} } catch(...) {}


if (fHandle2 != nullptr) if (fHandle2 != nullptr)
{ {
try { try {
fExt.state->restore(fHandle, carla_lv2_state_retrieve, this, LV2_STATE_IS_POD, fStateFeatures);
fExt.state->restore(fHandle,
carla_lv2_state_retrieve,
this,
LV2_STATE_IS_POD,
temporary ? fFeatures : fStateFeatures);
} catch(...) {} } catch(...) {}
} }
} }


+ 1
- 1
source/backend/plugin/CarlaPluginNative.cpp View File

@@ -658,7 +658,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Set data (state) // Set data (state)


void prepareForSave() override
void prepareForSave(bool) override
{ {
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);


+ 1
- 0
source/utils/CarlaStateUtils.cpp View File

@@ -192,6 +192,7 @@ CarlaStateSave::CarlaStateSave() noexcept
binary(nullptr), binary(nullptr),
uniqueId(0), uniqueId(0),
options(0x0), options(0x0),
temporary(false),
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
active(false), active(false),
dryWet(1.0f), dryWet(1.0f),


+ 3
- 0
source/utils/CarlaStateUtils.hpp View File

@@ -73,6 +73,9 @@ struct CarlaStateSave {
int64_t uniqueId; int64_t uniqueId;
uint options; uint options;


// saved during clone, rename or similar
bool temporary;

#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
bool active; bool active;
float dryWet; float dryWet;


Loading…
Cancel
Save