Browse Source

Bridges related stuff

tags/1.9.4
falkTX 12 years ago
parent
commit
86aaef63bd
18 changed files with 129 additions and 83 deletions
  1. +1
    -1
      source/backend/engine/CarlaEngine.cpp
  2. +10
    -4
      source/backend/engine/CarlaEngineBridge.cpp
  3. +40
    -29
      source/backend/plugin/BridgePlugin.cpp
  4. +8
    -12
      source/backend/plugin/CarlaPlugin.cpp
  5. +23
    -1
      source/backend/plugin/CarlaPluginInternal.cpp
  6. +2
    -2
      source/backend/plugin/CarlaPluginInternal.hpp
  7. +14
    -6
      source/backend/plugin/DssiPlugin.cpp
  8. +1
    -1
      source/backend/plugin/FluidSynthPlugin.cpp
  9. +1
    -1
      source/backend/plugin/JucePlugin.cpp
  10. +1
    -1
      source/backend/plugin/LadspaPlugin.cpp
  11. +1
    -1
      source/backend/plugin/Lv2Plugin.cpp
  12. +2
    -2
      source/backend/plugin/NativePlugin.cpp
  13. +1
    -1
      source/backend/plugin/ReWirePlugin.cpp
  14. +2
    -7
      source/backend/plugin/VstPlugin.cpp
  15. +4
    -1
      source/bridges/CarlaBridgePlugin.cpp
  16. +2
    -0
      source/carla_skin.py
  17. +1
    -1
      source/discovery/carla-discovery.cpp
  18. +15
    -12
      source/utils/CarlaBridgeUtils.hpp

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

@@ -2445,7 +2445,7 @@ void CarlaEngine::oscSend_bridge_parameter_data(const uint32_t index, const int3
CARLA_SAFE_ASSERT_RETURN(unit != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_parameter_data(%i, %i, %i:%s, %X, \"%s\", \"%s\")", index, rindex, type, ParameterType2Str(type), hints, name, unit);

char targetPath[std::strlen(pData->oscData->path)+23];
char targetPath[std::strlen(pData->oscData->path)+24];
std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_parameter_data");
try_lo_send(pData->oscData->target, targetPath, "iiiiss", static_cast<int32_t>(index), static_cast<int32_t>(rindex), static_cast<int32_t>(type), static_cast<int32_t>(hints), name, unit);


+ 10
- 4
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -408,7 +408,8 @@ public:
break;
}

case kPluginBridgeOpcodeSetParameter: {
case kPluginBridgeOpcodeSetParameterRt:
case kPluginBridgeOpcodeSetParameterNonRt:{
const int32_t index(fShmControl.readInt());
const float value(fShmControl.readFloat());

@@ -416,10 +417,15 @@ public:

if (plugin != nullptr && plugin->isEnabled())
{
plugin->setParameterValueByRealIndex(index, value, false, false, false);
if (index == PARAMETER_ACTIVE)
{
plugin->setActive((value > 0.0f), false, false);
break;
}

CARLA_SAFE_ASSERT_BREAK(index >= 0);

//if (index >= 0)
// plugin->postponeRtEvent(kPluginPostRtEventParameterChange, index, 0, value);
plugin->setParameterValue(static_cast<uint32_t>(index), value, (opcode == kPluginBridgeOpcodeSetParameterNonRt), false, false);
}
break;
}


+ 40
- 29
source/backend/plugin/BridgePlugin.cpp View File

@@ -148,7 +148,7 @@ struct BridgeAudioPool {

struct BridgeControl : public RingBufferControl<StackBuffer> {
CarlaString filename;
CarlaRecursiveMutex lock;
CarlaMutex lock;
BridgeShmControl* data;
shm_t shm;

@@ -323,6 +323,10 @@ public:
{
carla_debug("BridgePlugin::~BridgePlugin()");

// close UI
if (pData->hints & PLUGIN_HAS_CUSTOM_UI)
pData->transientTryCounter = 0;

pData->singleMutex.lock();
pData->masterMutex.lock();

@@ -520,12 +524,14 @@ public:
const float fixedValue(pData->param.getFixedValue(parameterId, value));
fParams[parameterId].value = fixedValue;

const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
{
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter);
fShmControl.writeInt(static_cast<int32_t>(parameterId));
fShmControl.writeFloat(value);
fShmControl.commitWrite();
fShmControl.writeOpcode(sendGui ? kPluginBridgeOpcodeSetParameterNonRt : kPluginBridgeOpcodeSetParameterRt);
fShmControl.writeInt(static_cast<int32_t>(parameterId));
fShmControl.writeFloat(value);
fShmControl.commitWrite();
}

CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback);
}
@@ -534,11 +540,13 @@ public:
{
CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast<int32_t>(pData->prog.count),);

const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
{
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetProgram);
fShmControl.writeInt(index);
fShmControl.commitWrite();
fShmControl.writeOpcode(kPluginBridgeOpcodeSetProgram);
fShmControl.writeInt(index);
fShmControl.commitWrite();
}

CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback);
}
@@ -547,11 +555,13 @@ public:
{
CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count),);

const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
{
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetMidiProgram);
fShmControl.writeInt(index);
fShmControl.commitWrite();
fShmControl.writeOpcode(kPluginBridgeOpcodeSetMidiProgram);
fShmControl.writeInt(index);
fShmControl.commitWrite();
}

CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback);
}
@@ -769,9 +779,9 @@ public:
void activate() noexcept override
{
{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter);
fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameterNonRt);
fShmControl.writeInt(PARAMETER_ACTIVE);
fShmControl.writeFloat(1.0f);
fShmControl.commitWrite();
@@ -790,9 +800,9 @@ public:
void deactivate() noexcept override
{
{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter);
fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameterNonRt);
fShmControl.writeInt(PARAMETER_ACTIVE);
fShmControl.writeFloat(0.0f);
fShmControl.commitWrite();
@@ -852,7 +862,7 @@ public:
data2 = static_cast<char>(note.note);
data3 = static_cast<char>(note.velo);

const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent);
fShmControl.writeLong(0);
@@ -988,7 +998,7 @@ public:

if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F)
{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent);
fShmControl.writeLong(event.time);
@@ -1083,7 +1093,7 @@ public:
data[j] = static_cast<char>(midiEvent.data[j]);

{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent);
fShmControl.writeLong(event.time);
@@ -1176,7 +1186,7 @@ public:
// Run plugin

{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeProcess);
fShmControl.commitWrite();
@@ -1263,7 +1273,7 @@ public:

void bufferSizeChanged(const uint32_t newBufferSize) override
{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

resizeAudioPool(newBufferSize);

@@ -1274,7 +1284,7 @@ public:

void sampleRateChanged(const double newSampleRate) override
{
const CarlaRecursiveMutexLocker _crml(fShmControl.lock);
const CarlaMutexLocker _cml(fShmControl.lock);

fShmControl.writeOpcode(kPluginBridgeOpcodeSetSampleRate);
fShmControl.writeFloat(static_cast<float>(newSampleRate));
@@ -1406,11 +1416,11 @@ public:

CARLA_SAFE_ASSERT_INT2(ins+outs <= static_cast<int32_t>(pData->engine->getOptions().maxParameters), ins+outs, pData->engine->getOptions().maxParameters);

const uint32_t count(static_cast<uint32_t>(carla_min<int32_t>(ins+outs, static_cast<int32_t>(pData->engine->getOptions().maxParameters), 0)));
const uint32_t count(carla_fixValue<uint32_t>(0, pData->engine->getOptions().maxParameters, static_cast<uint32_t>(ins+outs)));

if (count > 0)
{
pData->param.createNew(count, false);
pData->param.createNew(count, false, true);
fParams = new BridgeParamInfo[count];
}
break;
@@ -1466,9 +1476,10 @@ public:

if (index < static_cast<int32_t>(pData->param.count))
{
pData->param.data[index].index = index;
pData->param.data[index].rindex = rindex;
pData->param.data[index].hints = static_cast<uint>(hints);
pData->param.data[index].type = static_cast<ParameterType>(type);
pData->param.data[index].index = index;
pData->param.data[index].rindex = rindex;
pData->param.data[index].hints = static_cast<uint>(hints);
fParams[index].name = name;
fParams[index].unit = unit;
}


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

@@ -1124,11 +1124,15 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu
#ifdef BUILD_BRIDGE
if (! gIsLoadingProject)
{
CARLA_ASSERT(! sendGui); // this should never happen
//CARLA_ASSERT(! sendGui); // this should never happen
}
#endif

#ifndef BUILD_BRIDGE
#ifdef BUILD_BRIDGE
if (sendGui == sendOsc && sendOsc == sendCallback && ! sendCallback) {
//pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(parameterId), 1, value);
}
#else
if (sendGui && (pData->hints & PLUGIN_HAS_CUSTOM_UI) != 0)
uiParameterChange(parameterId, value);

@@ -1138,14 +1142,6 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu

if (sendCallback)
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, static_cast<int>(parameterId), 0, value, nullptr);

#ifdef BUILD_BRIDGE
return;

// unused
(void)sendGui;
(void)sendOsc;
#endif
}

void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept
@@ -1598,8 +1594,8 @@ void CarlaPlugin::registerToOscClient() noexcept

for (uint32_t i=0; i < pData->param.count; ++i)
{
carla_fill<char>(bufName, STR_MAX, '\0');
carla_fill<char>(bufUnit, STR_MAX, '\0');
carla_zeroChar(bufName, STR_MAX);
carla_zeroChar(bufUnit, STR_MAX);

getParameterName(i, bufName);
getParameterUnit(i, bufUnit);


+ 23
- 1
source/backend/plugin/CarlaPluginInternal.cpp View File

@@ -219,7 +219,7 @@ PluginParameterData::~PluginParameterData() noexcept
CARLA_ASSERT(special == nullptr);
}

void PluginParameterData::createNew(const uint32_t newCount, const bool withSpecial)
void PluginParameterData::createNew(const uint32_t newCount, const bool withSpecial, const bool doReset)
{
CARLA_ASSERT_INT(count == 0, count);
CARLA_SAFE_ASSERT_RETURN(data == nullptr,);
@@ -233,6 +233,28 @@ void PluginParameterData::createNew(const uint32_t newCount, const bool withSpec

if (withSpecial)
special = new SpecialParameterType[newCount];

if (! doReset)
return;

for (uint32_t i=0; i < newCount; ++i)
{
data[i].type = PARAMETER_UNKNOWN;
data[i].hints = 0x0;
data[i].index = PARAMETER_NULL;
data[i].rindex = PARAMETER_NULL;
data[i].midiCC = -1;
data[i].midiChannel = 0;
ranges[i].def = 0.0f;
ranges[i].min = 0.0f;
ranges[i].max = 0.0f;
ranges[i].step = 0.0f;
ranges[i].stepSmall = 0.0f;
ranges[i].stepLarge = 0.0f;

if (withSpecial)
special[i] = PARAMETER_SPECIAL_NULL;
}
}

void PluginParameterData::clear() noexcept


+ 2
- 2
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -72,7 +72,7 @@ const unsigned int PLUGIN_EXTRA_HINT_USES_MULTI_PROGS = 0x08;
* so events have to be postponned to be executed later, on a separate thread.
*/
enum PluginPostRtEventType {
kPluginPostRtEventNull,
kPluginPostRtEventNull = 0,
kPluginPostRtEventDebug,
kPluginPostRtEventParameterChange, // param, SP (*), value (SP: if 1, don't report change to Callback and OSC)
kPluginPostRtEventProgramChange, // index
@@ -183,7 +183,7 @@ struct PluginParameterData {

PluginParameterData() noexcept;
~PluginParameterData() noexcept;
void createNew(const uint32_t newCount, const bool withSpecial);
void createNew(const uint32_t newCount, const bool withSpecial, const bool doReset);
void clear() noexcept;
float getFixedValue(const uint32_t parameterId, const float& value) const noexcept;



+ 14
- 6
source/backend/plugin/DssiPlugin.cpp View File

@@ -510,7 +510,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, true);
pData->param.createNew(params, true, false);

fParamBuffers = new float[params];
FLOAT_CLEAR(fParamBuffers, params);
@@ -1997,23 +1997,31 @@ private:

static LinkedList<const char*> sMultiSynthList;

static bool addUniqueMultiSynth(const char* const label)
static bool addUniqueMultiSynth(const char* const label) noexcept
{
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0', false);

const char* dlabel = nullptr;

try {
dlabel = carla_strdup(label);
} catch(...) { return false; }

for (LinkedList<const char*>::Itenerator it = sMultiSynthList.begin(); it.valid(); it.next())
{
const char* const itLabel(it.getValue());

if (std::strcmp(label, itLabel) == 0)
if (std::strcmp(dlabel, itLabel) == 0)
{
delete[] dlabel;
return false;
}
}

sMultiSynthList.append(carla_strdup(label));
return true;
return sMultiSynthList.append(dlabel);
}

static void removeUniqueMultiSynth(const char* const label)
static void removeUniqueMultiSynth(const char* const label) noexcept
{
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0',);



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

@@ -555,7 +555,7 @@ public:
params = FluidSynthParametersMax;

pData->audioOut.createNew(aOuts);
pData->param.createNew(params, false);
pData->param.createNew(params, false, false);

const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;


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

@@ -351,7 +351,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, false);
pData->param.createNew(params, false, false);
needsCtrlIn = true;
}



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

@@ -496,7 +496,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, true);
pData->param.createNew(params, true, false);

fParamBuffers = new float[params];
FLOAT_CLEAR(fParamBuffers, params);


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

@@ -1428,7 +1428,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, true);
pData->param.createNew(params, true, false);
fParamBuffers = new float[params];
FLOAT_CLEAR(fParamBuffers, params);
}


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

@@ -175,7 +175,7 @@ public:
carla_debug("NativePlugin::~NativePlugin()");

// close UI
if (pData->hints & PLUGIN_HAS_UI)
if (pData->hints & PLUGIN_HAS_CUSTOM_UI)
{
if (fIsUiVisible && fDescriptor != nullptr && fDescriptor->ui_show != nullptr && fHandle != nullptr)
fDescriptor->ui_show(fHandle, false);
@@ -826,7 +826,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, true);
pData->param.createNew(params, true, false);
}

const uint portNameSize(pData->engine->getMaxPortNameSize());


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

@@ -552,7 +552,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, false);
pData->param.createNew(params, false, true);
needsCtrlIn = true;
}



+ 2
- 7
source/backend/plugin/VstPlugin.cpp View File

@@ -560,7 +560,7 @@ public:

if (params > 0)
{
pData->param.createNew(params, false);
pData->param.createNew(params, false, false);
needsCtrlIn = true;
}

@@ -1854,12 +1854,7 @@ protected:

case audioMasterGetNumAutomatableParameters:
// Deprecated in VST SDK 2.4
if (fEffect->numParams <= 0)
ret = 0;
else if (fEffect->numParams > static_cast<int32_t>(pData->engine->getOptions().maxParameters))
ret = static_cast<intptr_t>(pData->engine->getOptions().maxParameters);
else
ret = fEffect->numParams;
ret = carla_fixValue<intptr_t>(0, static_cast<intptr_t>(pData->engine->getOptions().maxParameters), fEffect->numParams);
break;

case audioMasterGetParameterQuantization:


+ 4
- 1
source/bridges/CarlaBridgePlugin.cpp View File

@@ -377,7 +377,10 @@ protected:
{
case ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED:
if (isOscControlRegistered())
sendOscControl(value1, value3);
{
CARLA_SAFE_ASSERT_RETURN(value1 >= 0,);
fEngine->oscSend_bridge_parameter_value(static_cast<uint32_t>(value1), value3);
}
break;

case ENGINE_CALLBACK_UI_STATE_CHANGED:


+ 2
- 0
source/carla_skin.py View File

@@ -776,8 +776,10 @@ class PluginSlot_BasicFX(AbstractPluginSlot):
paramRanges = gCarla.host.get_parameter_ranges(self.fPluginId, i)

if paramData['type'] != PARAMETER_INPUT:
print("NOT input", paramData['type'])
continue
if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
print("NOT enabled", paramData['hints'])
continue

paramName = paramInfo['name'].split("/", 1)[0].split(" (", 1)[0].strip()


+ 1
- 1
source/discovery/carla-discovery.cpp View File

@@ -207,7 +207,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t
break;

case DECLARE_VST_DEPRECATED(audioMasterGetNumAutomatableParameters):
ret = carla_min<intptr_t>(effect->numParams, MAX_DEFAULT_PARAMETERS, 0);
ret = carla_fixValue<intptr_t>(0, MAX_DEFAULT_PARAMETERS, effect->numParams);
break;

case DECLARE_VST_DEPRECATED(audioMasterGetParameterQuantization):


+ 15
- 12
source/utils/CarlaBridgeUtils.hpp View File

@@ -52,16 +52,17 @@ enum PluginBridgeInfoType {
};

enum PluginBridgeOpcode {
kPluginBridgeOpcodeNull = 0,
kPluginBridgeOpcodeSetAudioPool = 1, // long
kPluginBridgeOpcodeSetBufferSize = 2, // int
kPluginBridgeOpcodeSetSampleRate = 3, // float
kPluginBridgeOpcodeSetParameter = 4, // int, float
kPluginBridgeOpcodeSetProgram = 5, // int
kPluginBridgeOpcodeSetMidiProgram = 6, // int
kPluginBridgeOpcodeMidiEvent = 7, // long, int, char[] (long = timeFrame, int = size max 4)
kPluginBridgeOpcodeProcess = 8,
kPluginBridgeOpcodeQuit = 9
kPluginBridgeOpcodeNull = 0,
kPluginBridgeOpcodeSetAudioPool = 1, // long
kPluginBridgeOpcodeSetBufferSize = 2, // int
kPluginBridgeOpcodeSetSampleRate = 3, // float
kPluginBridgeOpcodeSetParameterRt = 4, // int, float
kPluginBridgeOpcodeSetParameterNonRt = 5, // int, float
kPluginBridgeOpcodeSetProgram = 6, // int
kPluginBridgeOpcodeSetMidiProgram = 7, // int
kPluginBridgeOpcodeMidiEvent = 8, // long, int, char[] (long = timeFrame, int = size max 4)
kPluginBridgeOpcodeProcess = 9,
kPluginBridgeOpcodeQuit = 10
};

const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host call, tells host GUI is now hidden
@@ -174,8 +175,10 @@ const char* PluginBridgeOpcode2str(const PluginBridgeOpcode opcode) noexcept
return "kPluginBridgeOpcodeSetBufferSize";
case kPluginBridgeOpcodeSetSampleRate:
return "kPluginBridgeOpcodeSetSampleRate";
case kPluginBridgeOpcodeSetParameter:
return "kPluginBridgeOpcodeSetParameter";
case kPluginBridgeOpcodeSetParameterRt:
return "kPluginBridgeOpcodeSetParameterRt";
case kPluginBridgeOpcodeSetParameterNonRt:
return "kPluginBridgeOpcodeSetParameterNonRt";
case kPluginBridgeOpcodeSetProgram:
return "kPluginBridgeOpcodeSetProgram";
case kPluginBridgeOpcodeSetMidiProgram:


Loading…
Cancel
Save