diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 66c8dd6a7..4d811d926 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -683,12 +683,20 @@ bool CarlaEngine::removeAllPlugins() pData->thread.stopThread(500); + const uint curPluginCount(pData->curPluginCount); + #ifndef BUILD_BRIDGE if (pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) pData->graph.removeAllPlugins(); -#endif - const uint32_t curPluginCount(pData->curPluginCount); +# ifdef HAVE_LIBLO + if (isOscControlRegistered()) + { + for (int i=curPluginCount; --i >= 0;) + oscSend_control_remove_plugin(i); + } +# endif +#endif const bool lockWait(isRunning()); const ScopedActionLock sal(this, kEnginePostActionZeroCount, 0, 0, lockWait); diff --git a/source/backend/engine/CarlaEngineOscSend.cpp b/source/backend/engine/CarlaEngineOscSend.cpp index 7989ea751..31ea19ce7 100644 --- a/source/backend/engine/CarlaEngineOscSend.cpp +++ b/source/backend/engine/CarlaEngineOscSend.cpp @@ -33,7 +33,7 @@ void CarlaEngine::oscSend_control_add_plugin_start(const uint pluginId, const ch CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(pluginName != nullptr && pluginName[0] != '\0',); carla_debug("CarlaEngine::oscSend_control_add_plugin_start(%i, \"%s\")", pluginId, pluginName); @@ -48,7 +48,7 @@ void CarlaEngine::oscSend_control_add_plugin_end(const uint pluginId) const noex CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_add_plugin_end(%i)", pluginId); char targetPath[std::strlen(pData->oscData->path)+16]; @@ -62,7 +62,7 @@ void CarlaEngine::oscSend_control_remove_plugin(const uint pluginId) const noexc CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_remove_plugin(%i)", pluginId); char targetPath[std::strlen(pData->oscData->path)+15]; @@ -76,7 +76,7 @@ void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const Pl CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(type != PLUGIN_NONE,); carla_debug("CarlaEngine::oscSend_control_set_plugin_data(%i, %i:%s, %i:%s, %X, " P_INT64 ")", pluginId, type, PluginType2Str(type), category, PluginCategory2Str(category), hints, uniqueId); @@ -91,7 +91,7 @@ void CarlaEngine::oscSend_control_set_plugin_info2(const uint pluginId, const ch CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(realName != nullptr && realName[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(maker != nullptr,); @@ -109,7 +109,7 @@ void CarlaEngine::oscSend_control_set_audio_count(const uint pluginId, const uin CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_audio_count(%i, %i, %i)", pluginId, ins, outs); char targetPath[std::strlen(pData->oscData->path)+18]; @@ -123,7 +123,7 @@ void CarlaEngine::oscSend_control_set_midi_count(const uint pluginId, const uint CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_midi_count(%i, %i, %i)", pluginId, ins, outs); char targetPath[std::strlen(pData->oscData->path)+18]; @@ -137,7 +137,7 @@ void CarlaEngine::oscSend_control_set_parameter_count(const uint pluginId, const CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_parameter_count(%i, %i, %i)", pluginId, ins, outs); char targetPath[std::strlen(pData->oscData->path)+18]; @@ -151,7 +151,7 @@ void CarlaEngine::oscSend_control_set_program_count(const uint pluginId, const u CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_program_count(%i, %i)", pluginId, count); char targetPath[std::strlen(pData->oscData->path)+19]; @@ -165,7 +165,7 @@ void CarlaEngine::oscSend_control_set_midi_program_count(const uint pluginId, co CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_midi_program_count(%i, %i)", pluginId, count); char targetPath[std::strlen(pData->oscData->path)+24]; @@ -179,7 +179,7 @@ void CarlaEngine::oscSend_control_set_parameter_data(const uint pluginId, const CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(unit != nullptr,); carla_debug("CarlaEngine::oscSend_control_set_parameter_data(%i, %i, %i:%s, %X, \"%s\", \"%s\")", pluginId, index, type, ParameterType2Str(type), hints, name, unit); @@ -195,12 +195,12 @@ void CarlaEngine::oscSend_control_set_parameter_ranges1(const uint pluginId, con CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); - CARLA_SAFE_ASSERT_RETURN(def <= min && def >= max,); - CARLA_SAFE_ASSERT_RETURN(min < max,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); + CARLA_SAFE_ASSERT(def >= min && def <= max); + CARLA_SAFE_ASSERT(min < max); carla_debug("CarlaEngine::oscSend_control_set_parameter_ranges1(%i, %i, %f, %f, %f)", pluginId, index, def, min, max, def); - 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, "/set_parameter_ranges1"); try_lo_send(pData->oscData->target, targetPath, "iifff", static_cast(pluginId), static_cast(index), def, min, max); @@ -211,14 +211,14 @@ void CarlaEngine::oscSend_control_set_parameter_ranges2(const uint pluginId, con CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); - CARLA_SAFE_ASSERT_RETURN(step <= stepSmall && step >= stepLarge,); - CARLA_SAFE_ASSERT_RETURN(stepSmall <= stepLarge,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); + CARLA_SAFE_ASSERT(step >= stepSmall && step <= stepLarge); + CARLA_SAFE_ASSERT(stepSmall <= stepLarge); carla_debug("CarlaEngine::oscSend_control_set_parameter_ranges2(%i, %i, %f, %f, %f)", pluginId, index, step, stepSmall, stepLarge); - 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, "/set_parameter_ranges"); + std::strcat(targetPath, "/set_parameter_ranges2"); try_lo_send(pData->oscData->target, targetPath, "iifff", static_cast(pluginId), static_cast(index), step, stepSmall, stepLarge); } @@ -227,7 +227,7 @@ void CarlaEngine::oscSend_control_set_parameter_midi_cc(const uint pluginId, con CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(cc >= -1 && cc < MAX_MIDI_CONTROL,); carla_debug("CarlaEngine::oscSend_control_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc); @@ -242,7 +242,7 @@ void CarlaEngine::oscSend_control_set_parameter_midi_channel(const uint pluginId CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); carla_debug("CarlaEngine::oscSend_control_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel); @@ -257,7 +257,7 @@ void CarlaEngine::oscSend_control_set_parameter_value(const uint pluginId, const CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(index != PARAMETER_NULL,); carla_debug("CarlaEngine::oscSend_control_set_parameter_value(%i, %i:%s, %f)", pluginId, index, (index < 0) ? InternalParameterIndex2Str(static_cast(index)) : "(none)", value); @@ -272,7 +272,7 @@ void CarlaEngine::oscSend_control_set_default_value(const uint pluginId, const u CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_default_value(%i, %i, %f)", pluginId, index, value); char targetPath[std::strlen(pData->oscData->path)+19]; @@ -286,7 +286,7 @@ void CarlaEngine::oscSend_control_set_current_program(const uint pluginId, const CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_current_program(%i, %i)", pluginId, index); char targetPath[std::strlen(pData->oscData->path)+21]; @@ -300,7 +300,7 @@ void CarlaEngine::oscSend_control_set_current_midi_program(const uint pluginId, CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); carla_debug("CarlaEngine::oscSend_control_set_current_midi_program(%i, %i)", pluginId, index); char targetPath[std::strlen(pData->oscData->path)+26]; @@ -314,7 +314,7 @@ void CarlaEngine::oscSend_control_set_program_name(const uint pluginId, const ui CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(name != nullptr,); carla_debug("CarlaEngine::oscSend_control_set_program_name(%i, %i, \"%s\")", pluginId, index, name); @@ -329,7 +329,7 @@ void CarlaEngine::oscSend_control_set_midi_program_data(const uint pluginId, con CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); - CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); + CARLA_SAFE_ASSERT_RETURN(pluginId <= pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(name != nullptr,); carla_debug("CarlaEngine::oscSend_control_set_midi_program_data(%i, %i, %i, %i, \"%s\")", pluginId, index, bank, program, name); diff --git a/source/backend/plugin/CarlaPluginDSSI.cpp b/source/backend/plugin/CarlaPluginDSSI.cpp index 140d58e7d..962d4493a 100644 --- a/source/backend/plugin/CarlaPluginDSSI.cpp +++ b/source/backend/plugin/CarlaPluginDSSI.cpp @@ -1246,7 +1246,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_midi_program_count(pData->id, newCount); diff --git a/source/backend/plugin/CarlaPluginFluidSynth.cpp b/source/backend/plugin/CarlaPluginFluidSynth.cpp index 1603b8c1b..d786f4bef 100644 --- a/source/backend/plugin/CarlaPluginFluidSynth.cpp +++ b/source/backend/plugin/CarlaPluginFluidSynth.cpp @@ -951,7 +951,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_midi_program_count(pData->id, count); diff --git a/source/backend/plugin/CarlaPluginJuce.cpp b/source/backend/plugin/CarlaPluginJuce.cpp index bbf41f27f..c0b8fdbed 100644 --- a/source/backend/plugin/CarlaPluginJuce.cpp +++ b/source/backend/plugin/CarlaPluginJuce.cpp @@ -590,7 +590,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_program_count(pData->id, newCount); diff --git a/source/backend/plugin/CarlaPluginLV2.cpp b/source/backend/plugin/CarlaPluginLV2.cpp index 3e2005350..eae5993fd 100644 --- a/source/backend/plugin/CarlaPluginLV2.cpp +++ b/source/backend/plugin/CarlaPluginLV2.cpp @@ -2506,7 +2506,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_midi_program_count(pData->id, newCount); diff --git a/source/backend/plugin/CarlaPluginLinuxSampler.cpp b/source/backend/plugin/CarlaPluginLinuxSampler.cpp index 86cd4b641..e9f14acd1 100644 --- a/source/backend/plugin/CarlaPluginLinuxSampler.cpp +++ b/source/backend/plugin/CarlaPluginLinuxSampler.cpp @@ -720,7 +720,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_program_count(pData->id, count); diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 797640021..64096bbe6 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -1221,7 +1221,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_midi_program_count(pData->id, count); diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index d8216d82f..879471eb4 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -897,7 +897,7 @@ public: #if defined(HAVE_LIBLO) && ! defined(BUILD_BRIDGE) // Update OSC Names - if (pData->engine->isOscControlRegistered()) + if (pData->engine->isOscControlRegistered() && pData->id < pData->engine->getCurrentPluginCount()) { pData->engine->oscSend_control_set_program_count(pData->id, newCount); diff --git a/source/carla_backend.py b/source/carla_backend.py index 1fabfc872..ec90e1f47 100644 --- a/source/carla_backend.py +++ b/source/carla_backend.py @@ -20,6 +20,7 @@ # Imports (Global) from abc import ABCMeta, abstractmethod +from copy import deepcopy from ctypes import * from platform import architecture from sys import platform, maxsize @@ -2986,13 +2987,13 @@ class CarlaHostPlugin(CarlaHostMeta): return info = PluginStoreInfo() - info.pluginInfo = PyCarlaPluginInfo + info.pluginInfo = deepcopy(PyCarlaPluginInfo) info.pluginRealName = "" info.internalValues = [0.0, 1.0, 1.0, -1.0, 1.0, 0.0, -1.0] - info.audioCountInfo = PyCarlaPortCountInfo - info.midiCountInfo = PyCarlaPortCountInfo + info.audioCountInfo = deepcopy(PyCarlaPortCountInfo) + info.midiCountInfo = deepcopy(PyCarlaPortCountInfo) info.parameterCount = 0 - info.parameterCountInfo = PyCarlaPortCountInfo + info.parameterCountInfo = deepcopy(PyCarlaPortCountInfo) info.parameterInfo = [] info.parameterData = [] info.parameterRanges = [] @@ -3011,6 +3012,9 @@ class CarlaHostPlugin(CarlaHostMeta): def _set_pluginInfo(self, pluginId, info): self.fPluginsInfo[pluginId].pluginInfo = info + def _set_pluginInfoUpdate(self, pluginId, info): + self.fPluginsInfo[pluginId].pluginInfo.update(info) + def _set_pluginName(self, pluginId, name): self.fPluginsInfo[pluginId].pluginInfo['name'] = name @@ -3039,9 +3043,9 @@ class CarlaHostPlugin(CarlaHostMeta): # add placeholders for x in range(count): - self.fPluginsInfo[pluginId].parameterInfo.append(PyCarlaParameterInfo) - self.fPluginsInfo[pluginId].parameterData.append(PyParameterData) - self.fPluginsInfo[pluginId].parameterRanges.append(PyParameterRanges) + self.fPluginsInfo[pluginId].parameterInfo.append(deepcopy(PyCarlaParameterInfo)) + self.fPluginsInfo[pluginId].parameterData.append(deepcopy(PyParameterData)) + self.fPluginsInfo[pluginId].parameterRanges.append(deepcopy(PyParameterRanges)) self.fPluginsInfo[pluginId].parameterValues.append(0.0) def _set_programCount(self, pluginId, count): @@ -3062,7 +3066,7 @@ class CarlaHostPlugin(CarlaHostMeta): # add placeholders for x in range(count): - self.fPluginsInfo[pluginId].midiProgramData.append(PyMidiProgramData) + self.fPluginsInfo[pluginId].midiProgramData.append(deepcopy(PyMidiProgramData)) def _set_customDataCount(self, pluginId, count): self.fPluginsInfo[pluginId].customDataCount = count @@ -3086,6 +3090,10 @@ class CarlaHostPlugin(CarlaHostMeta): if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: self.fPluginsInfo[pluginId].parameterRanges[paramIndex] = ranges + def _set_parameterRangesUpdate(self, pluginId, paramIndex, ranges): + if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: + self.fPluginsInfo[pluginId].parameterRanges[paramIndex].update(ranges) + def _set_parameterValue(self, pluginId, paramIndex, value): if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: self.fPluginsInfo[pluginId].parameterValues[paramIndex] = value diff --git a/source/carla_host.py b/source/carla_host.py index dcd97f3ea..c51f9e2da 100644 --- a/source/carla_host.py +++ b/source/carla_host.py @@ -117,7 +117,10 @@ class HostWindow(QMainWindow): # to be filled with key-value pairs of current settings self.fSavedSettings = {} - if host.isPlugin: + if host.isControl: + self.fClientName = "Carla-Control" + self.fSessionManagerName = "Control" + elif host.isPlugin: self.fClientName = "Carla-Plugin" self.fSessionManagerName = "Plugin" elif LADISH_APP_NAME: @@ -150,9 +153,8 @@ class HostWindow(QMainWindow): # ---------------------------------------------------------------------------------------------------- # Set up GUI (engine stopped) - if self.host.isPlugin: + if self.host.isPlugin or self.host.isControl: self.ui.act_file_save.setVisible(False) - self.ui.act_file_save_as.setText(self.tr("Export as...")) self.ui.act_engine_start.setEnabled(False) self.ui.act_engine_start.setVisible(False) self.ui.act_engine_stop.setEnabled(False) @@ -162,6 +164,21 @@ class HostWindow(QMainWindow): self.ui.menu_Engine.setEnabled(False) self.ui.menu_Engine.setVisible(False) self.ui.menu_Engine.menuAction().setVisible(False) + + if self.host.isControl: + self.ui.act_file_new.setVisible(False) + self.ui.act_file_open.setVisible(False) + self.ui.act_file_save.setVisible(False) + self.ui.act_file_save_as.setVisible(False) + self.ui.act_plugin_add.setVisible(False) + self.ui.act_plugin_add2.setVisible(False) + self.ui.act_plugin_remove_all.setVisible(False) + self.ui.menu_Plugin.setEnabled(False) + self.ui.menu_Plugin.setVisible(False) + self.ui.menu_Plugin.menuAction().setVisible(False) + else: + self.ui.act_file_save_as.setText(self.tr("Export as...")) + else: self.ui.act_engine_start.setEnabled(True) @@ -424,7 +441,7 @@ class HostWindow(QMainWindow): self.startTimers() # Start in patchbay tab if using forced patchbay mode - if host.processModeForced and host.processMode == ENGINE_PROCESS_MODE_PATCHBAY: + if host.processModeForced and host.processMode == ENGINE_PROCESS_MODE_PATCHBAY and not host.isControl: self.ui.tabWidget.setCurrentIndex(1) # For NSM we wait for the open message @@ -612,7 +629,7 @@ class HostWindow(QMainWindow): self.ui.act_canvas_show_internal.blockSignals(True) self.ui.act_canvas_show_external.blockSignals(True) - if processMode == ENGINE_PROCESS_MODE_PATCHBAY and not self.host.isPlugin: + if processMode == ENGINE_PROCESS_MODE_PATCHBAY and not (self.host.isControl or self.host.isPlugin): self.ui.act_canvas_show_internal.setChecked(True) self.ui.act_canvas_show_internal.setVisible(True) self.ui.act_canvas_show_external.setChecked(False) @@ -626,7 +643,7 @@ class HostWindow(QMainWindow): self.ui.act_canvas_show_internal.blockSignals(False) self.ui.act_canvas_show_external.blockSignals(False) - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): canSave = (self.fProjectFilename and os.path.exists(self.fProjectFilename)) or not self.fSessionManagerName self.ui.act_file_save.setEnabled(canSave) self.ui.act_engine_start.setEnabled(False) @@ -650,7 +667,7 @@ class HostWindow(QMainWindow): self.ui.menu_PluginMacros.setEnabled(False) self.ui.menu_Canvas.setEnabled(False) - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): self.ui.act_file_save.setEnabled(False) self.ui.act_engine_start.setEnabled(True) self.ui.act_engine_stop.setEnabled(False) @@ -960,7 +977,7 @@ class HostWindow(QMainWindow): def slot_canvasRefresh(self): patchcanvas.clear() - if self.host.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK and self.host.isPlugin: + if self.host.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK and (self.host.isControl or self.host.isPlugin): return if self.host.is_engine_running(): @@ -1161,6 +1178,14 @@ class HostWindow(QMainWindow): # Settings def setEngineSettings(self): + # ---------------------------------------------------------------------------------------------------- + # do nothing if control + + if self.host.isControl: + return "Control" + + # ---------------------------------------------------------------------------------------------------- + settings = QSettings("falkTX", "Carla2") # ---------------------------------------------------------------------------------------------------- @@ -1250,7 +1275,7 @@ class HostWindow(QMainWindow): #settings.setValue("SplitterState", self.ui.splitter.saveState()) - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): settings.setValue("ShowTimePanel", self.ui.panelTime.isVisible()) settings.setValue("ShowToolbar", self.ui.toolBar.isEnabled()) @@ -1273,7 +1298,7 @@ class HostWindow(QMainWindow): if firstTime: self.restoreGeometry(settings.value("Geometry", "")) - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): self.ui.panelTime.restoreGeometry(settings.value("TimePanelGeometry", "")) showTimePanel = settings.value("ShowTimePanel", True, type=bool) @@ -1790,13 +1815,13 @@ class HostWindow(QMainWindow): QMainWindow.showEvent(self, event) # set our gui as parent for all plugins UIs - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): winIdStr = "%x" % self.winId() self.host.set_engine_option(ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr) def hideEvent(self, event): # disable parent - if not self.host.isPlugin: + if not (self.host.isControl or self.host.isPlugin): self.host.set_engine_option(ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0") QMainWindow.hideEvent(self, event) @@ -1892,7 +1917,7 @@ class HostWindow(QMainWindow): self.killTimers() self.saveSettings() - if self.host.is_engine_running() and not self.host.isPlugin: + if self.host.is_engine_running() and not (self.host.isControl or self.host.isPlugin): self.slot_engineStop(True) QMainWindow.closeEvent(self, event)