Browse Source

Final fix for state loading; update desktop files

tags/1.9.4
falkTX 12 years ago
parent
commit
6897dd5a93
3 changed files with 102 additions and 115 deletions
  1. +2
    -2
      data/carla-control.desktop
  2. +4
    -3
      data/carla.desktop
  3. +96
    -110
      source/backend/plugin/CarlaPlugin.cpp

+ 2
- 2
data/carla-control.desktop View File

@@ -1,7 +1,7 @@
[Desktop Entry]
Name=Carla Control
GenericName=Carla Control
Comment=Multi-Plugin Audio Host (OSC Control)
GenericName=Carla OSC Control
Comment=Audio Plugin Host (OSC Control)
Exec=carla-control
Icon=carla-control
Terminal=false


+ 4
- 3
data/carla.desktop View File

@@ -1,9 +1,10 @@
[Desktop Entry]
Name=Carla
GenericName=Carla
Comment=Multi-Plugin Audio Host
Exec=carla
GenericName=Carla Plugin Host
Comment=Audio Plugin Host
Exec=carla %u
Icon=carla
Terminal=false
Type=Application
Categories=AudioVideo;AudioEditing;Qt;
#MimeType=

+ 96
- 110
source/backend/plugin/CarlaPlugin.cpp View File

@@ -24,10 +24,6 @@
#include <QtCore/QTextStream>
#include <QtCore/QSettings>

#ifdef WANT_LV2
# include "lv2/atom.h"
#endif

CARLA_BACKEND_START_NAMESPACE

// -------------------------------------------------------------------
@@ -789,27 +785,26 @@ struct ParamSymbol {

void CarlaPlugin::loadSaveState(const SaveState& saveState)
{
bool hasChunk = (saveState.chunk != nullptr && (fOptions & PLUGIN_OPTION_USE_CHUNKS) != 0);
char strBuf[STR_MAX+1];
const bool usesMultiProgs(type() == PLUGIN_SF2 || (type() == PLUGIN_INTERNAL && (fHints & PLUGIN_IS_SYNTH) != 0));

// ---------------------------------------------------------------------
// Part 1 - set custom data (except binary/chunks)
// Part 1 - PRE-set custom data (only that which reload programs)

for (NonRtList<StateCustomData*>::Itenerator it = saveState.customData.begin(); it.valid(); it.next())
{
const StateCustomData* const stateCustomData(*it);
const char* const key(stateCustomData->key);

bool isChunk = (std::strcmp(stateCustomData->type, CUSTOM_DATA_CHUNK) == 0);
bool wantData = false;

#ifdef WANT_LV2
if (! isChunk)
isChunk = (std::strcmp(stateCustomData->type, LV2_ATOM__Chunk) == 0);
#endif
if (type() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
wantData = true;
else if (usesMultiProgs && std::strcmp(key, "midiPrograms") == 0)
wantData = true;

if (! isChunk)
if (wantData)
setCustomData(stateCustomData->type, stateCustomData->key, stateCustomData->value, true);
else
hasChunk = true;
}

// ---------------------------------------------------------------------
@@ -854,144 +849,135 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)
// ---------------------------------------------------------------------
// Part 3 - set midi program

const bool usesMultiProgs(type() == PLUGIN_SF2 || (type() == PLUGIN_INTERNAL && (fHints & PLUGIN_IS_SYNTH) != 0));

if (saveState.currentMidiBank >= 0 && saveState.currentMidiProgram >= 0 && ! usesMultiProgs)
setMidiProgramById(saveState.currentMidiBank, saveState.currentMidiProgram, true, true, true);

// ---------------------------------------------------------------------
// Part 4 - set parameter values (ONLY IF NO CHUNK)
// Part 4a - get plugin parameter symbols

if (! hasChunk)
{
// -----------------------------------------------------------------
// Part 4a - get plugin parameter symbols
NonRtList<ParamSymbol*> paramSymbols;

NonRtList<ParamSymbol*> paramSymbols;
if (type() == PLUGIN_LADSPA || type() == PLUGIN_LV2)
if (type() == PLUGIN_LADSPA || type() == PLUGIN_LV2)
{
for (uint32_t i=0; i < kData->param.count; ++i)
{
for (uint32_t i=0; i < kData->param.count; ++i)
{
getParameterSymbol(i, strBuf);
getParameterSymbol(i, strBuf);

if (*strBuf != '\0')
{
ParamSymbol* const paramSymbol(new ParamSymbol(i, strBuf));
paramSymbols.append(paramSymbol);
}
if (*strBuf != '\0')
{
ParamSymbol* const paramSymbol(new ParamSymbol(i, strBuf));
paramSymbols.append(paramSymbol);
}
}
}

// -----------------------------------------------------------------
// Part 4b - set parameter values (carefully)
// ---------------------------------------------------------------------
// Part 4b - set parameter values (carefully)

const float sampleRate(kData->engine->getSampleRate());
const float sampleRate(kData->engine->getSampleRate());

for (NonRtList<StateParameter*>::Itenerator it = saveState.parameters.begin(); it.valid(); it.next())
{
StateParameter* const stateParameter(*it);
for (NonRtList<StateParameter*>::Itenerator it = saveState.parameters.begin(); it.valid(); it.next())
{
StateParameter* const stateParameter(*it);

int32_t index = -1;
int32_t index = -1;

if (type() == PLUGIN_LADSPA)
if (type() == PLUGIN_LADSPA)
{
// Try to set by symbol, otherwise use index
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
{
// Try to set by symbol, otherwise use index
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
{
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
{
ParamSymbol* const paramSymbol(*it);
ParamSymbol* const paramSymbol(*it);

if (std::strcmp(stateParameter->symbol, paramSymbol->symbol) == 0)
{
index = paramSymbol->index;
break;
}
if (std::strcmp(stateParameter->symbol, paramSymbol->symbol) == 0)
{
index = paramSymbol->index;
break;
}
if (index == -1)
index = stateParameter->index;
}
else
if (index == -1)
index = stateParameter->index;
}
else if (type() == PLUGIN_LV2)
else
index = stateParameter->index;
}
else if (type() == PLUGIN_LV2)
{
// Symbol only
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
{
// Symbol only
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
{
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
{
ParamSymbol* const paramSymbol(*it);
ParamSymbol* const paramSymbol(*it);

if (std::strcmp(stateParameter->symbol, paramSymbol->symbol) == 0)
{
index = paramSymbol->index;
break;
}
if (std::strcmp(stateParameter->symbol, paramSymbol->symbol) == 0)
{
index = paramSymbol->index;
break;
}
if (index == -1)
carla_stderr("Failed to find LV2 parameter symbol for '%s')", stateParameter->symbol);
}
else
carla_stderr("LV2 Plugin parameter '%s' has no symbol", stateParameter->name);
if (index == -1)
carla_stderr("Failed to find LV2 parameter symbol for '%s')", stateParameter->symbol);
}
else
{
// Index only
index = stateParameter->index;
}

// Now set parameter
if (index >= 0 && index < static_cast<int32_t>(kData->param.count))
{
if (kData->param.data[index].hints & PARAMETER_USES_SAMPLERATE)
stateParameter->value *= sampleRate;

setParameterValue(index, stateParameter->value, true, true, true);
#ifndef BUILD_BRIDGE
setParameterMidiCC(index, stateParameter->midiCC, true, true);
setParameterMidiChannel(index, stateParameter->midiChannel, true, true);
#endif
}
else
carla_stderr("Could not set parameter data for '%s'", stateParameter->name);
carla_stderr("LV2 Plugin parameter '%s' has no symbol", stateParameter->name);
}

// clear
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
else
{
ParamSymbol* const paramSymbol(*it);
paramSymbol->free();
delete paramSymbol;
// Index only
index = stateParameter->index;
}

paramSymbols.clear();
// Now set parameter
if (index >= 0 && index < static_cast<int32_t>(kData->param.count))
{
if (kData->param.data[index].hints & PARAMETER_USES_SAMPLERATE)
stateParameter->value *= sampleRate;

setParameterValue(index, stateParameter->value, true, true, true);
#ifndef BUILD_BRIDGE
setParameterMidiCC(index, stateParameter->midiCC, true, true);
setParameterMidiChannel(index, stateParameter->midiChannel, true, true);
#endif
}
else
carla_stderr("Could not set parameter data for '%s'", stateParameter->name);
}
else

// clear
for (NonRtList<ParamSymbol*>::Itenerator it = paramSymbols.begin(); it.valid(); it.next())
{
// ---------------------------------------------------------------------
// Part 4 - set chunk data
ParamSymbol* const paramSymbol(*it);
paramSymbol->free();
delete paramSymbol;
}

for (NonRtList<StateCustomData*>::Itenerator it = saveState.customData.begin(); it.valid(); it.next())
{
const StateCustomData* const stateCustomData(*it);
paramSymbols.clear();

bool isChunk = (std::strcmp(stateCustomData->type, CUSTOM_DATA_CHUNK) == 0);
// ---------------------------------------------------------------------
// Part 5 - set custom data

#ifdef WANT_LV2
if (! isChunk)
isChunk = (std::strcmp(stateCustomData->type, LV2_ATOM__Chunk) == 0);
#endif
for (NonRtList<StateCustomData*>::Itenerator it = saveState.customData.begin(); it.valid(); it.next())
{
const StateCustomData* const stateCustomData(*it);
const char* const key(stateCustomData->key);

if (isChunk)
setCustomData(stateCustomData->type, stateCustomData->key, stateCustomData->value, true);
}
if (type() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
continue;
if (usesMultiProgs && std::strcmp(key, "midiPrograms") == 0)
continue;

if (saveState.chunk != nullptr && (fOptions & PLUGIN_OPTION_USE_CHUNKS) != 0)
setChunkData(saveState.chunk);
setCustomData(stateCustomData->type, stateCustomData->key, stateCustomData->value, true);
}

// ---------------------------------------------------------------------
// Part 6 - set chunk

if (saveState.chunk != nullptr && (fOptions & PLUGIN_OPTION_USE_CHUNKS) != 0)
setChunkData(saveState.chunk);

// ---------------------------------------------------------------------
// Part 6 - set internal stuff



Loading…
Cancel
Save