Signed-off-by: falkTX <falktx@falktx.com>tags/v2.2.0-RC1
@@ -20,6 +20,8 @@ | |||||
#include "CarlaBackend.h" | #include "CarlaBackend.h" | ||||
#include <memory> | |||||
namespace water { | namespace water { | ||||
class MemoryOutputStream; | class MemoryOutputStream; | ||||
class XmlDocument; | class XmlDocument; | ||||
@@ -27,6 +29,8 @@ class XmlDocument; | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
typedef std::shared_ptr<CarlaPlugin> CarlaPluginPtr; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
/*! | /*! | ||||
@@ -704,7 +708,7 @@ public: | |||||
* Deactivate this client. | * Deactivate this client. | ||||
* Client must be activated before calling this function. | * Client must be activated before calling this function. | ||||
*/ | */ | ||||
virtual void deactivate() noexcept; | |||||
virtual void deactivate(bool willClose) noexcept; | |||||
/*! | /*! | ||||
* Check if the client is activated. | * Check if the client is activated. | ||||
@@ -925,7 +929,7 @@ public: | |||||
* Add new engine client. | * Add new engine client. | ||||
* @note This function must only be called within a plugin class. | * @note This function must only be called within a plugin class. | ||||
*/ | */ | ||||
virtual CarlaEngineClient* addClient(CarlaPlugin* plugin); | |||||
virtual CarlaEngineClient* addClient(CarlaPluginPtr plugin); | |||||
/*! | /*! | ||||
* Get the current CPU load estimated by the engine. | * Get the current CPU load estimated by the engine. | ||||
@@ -1024,12 +1028,12 @@ public: | |||||
/*! | /*! | ||||
* Get plugin with id @a id. | * Get plugin with id @a id. | ||||
*/ | */ | ||||
CarlaPlugin* getPlugin(uint id) const noexcept; | |||||
CarlaPluginPtr getPlugin(uint id) const noexcept; | |||||
/*! | /*! | ||||
* Get plugin with id @a id, faster unchecked version. | * Get plugin with id @a id, faster unchecked version. | ||||
*/ | */ | ||||
CarlaPlugin* getPluginUnchecked(uint id) const noexcept; | |||||
CarlaPluginPtr getPluginUnchecked(uint id) const noexcept; | |||||
/*! | /*! | ||||
* Get a unique plugin name within the engine. | * Get a unique plugin name within the engine. | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin Host | * Carla Plugin Host | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -20,6 +20,8 @@ | |||||
#include "CarlaBackend.h" | #include "CarlaBackend.h" | ||||
#include <memory> | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Avoid including extra libs here | // Avoid including extra libs here | ||||
@@ -35,6 +37,8 @@ CARLA_BACKEND_START_NAMESPACE | |||||
} /* Fix editor indentation */ | } /* Fix editor indentation */ | ||||
#endif | #endif | ||||
typedef std::shared_ptr<CarlaPlugin> CarlaPluginPtr; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
/*! | /*! | ||||
@@ -943,21 +947,22 @@ public: | |||||
const uint options; // see PluginOptions | const uint options; // see PluginOptions | ||||
}; | }; | ||||
static CarlaPlugin* newNative(const Initializer& init); | |||||
static CarlaPlugin* newBridge(const Initializer& init, BinaryType btype, PluginType ptype, const char* bridgeBinary); | |||||
static CarlaPluginPtr newNative(const Initializer& init); | |||||
static CarlaPluginPtr newBridge(const Initializer& init, | |||||
BinaryType btype, PluginType ptype, const char* bridgeBinary); | |||||
static CarlaPlugin* newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* rdfDescriptor); | |||||
static CarlaPlugin* newDSSI(const Initializer& init); | |||||
static CarlaPlugin* newLV2(const Initializer& init); | |||||
static CarlaPlugin* newVST2(const Initializer& init); | |||||
static CarlaPlugin* newVST3(const Initializer& init); | |||||
static CarlaPlugin* newAU(const Initializer& init); | |||||
static CarlaPluginPtr newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* rdfDescriptor); | |||||
static CarlaPluginPtr newDSSI(const Initializer& init); | |||||
static CarlaPluginPtr newLV2(const Initializer& init); | |||||
static CarlaPluginPtr newVST2(const Initializer& init); | |||||
static CarlaPluginPtr newVST3(const Initializer& init); | |||||
static CarlaPluginPtr newAU(const Initializer& init); | |||||
static CarlaPlugin* newJuce(const Initializer& init, const char* format); | |||||
static CarlaPlugin* newFluidSynth(const Initializer& init, PluginType ptype, bool use16Outs); | |||||
static CarlaPlugin* newSFZero(const Initializer& init); | |||||
static CarlaPluginPtr newJuce(const Initializer& init, const char* format); | |||||
static CarlaPluginPtr newFluidSynth(const Initializer& init, PluginType ptype, bool use16Outs); | |||||
static CarlaPluginPtr newSFZero(const Initializer& init); | |||||
static CarlaPlugin* newJackApp(const Initializer& init); | |||||
static CarlaPluginPtr newJackApp(const Initializer& init); | |||||
#endif | #endif | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -980,6 +985,11 @@ public: | |||||
virtual void restoreLV2State() noexcept; | virtual void restoreLV2State() noexcept; | ||||
protected: | protected: | ||||
/*! | |||||
* Allow engine to signal that plugin will be deleted soon. | |||||
*/ | |||||
virtual void prepareForDeletion() noexcept; | |||||
/*! | /*! | ||||
* Give plugin bridges a change to update their custom data sets. | * Give plugin bridges a change to update their custom data sets. | ||||
*/ | */ | ||||
@@ -1025,6 +1035,7 @@ protected: | |||||
CARLA_DECLARE_NON_COPY_CLASS(ScopedSingleProcessLocker) | CARLA_DECLARE_NON_COPY_CLASS(ScopedSingleProcessLocker) | ||||
}; | }; | ||||
friend class CarlaEngine; | |||||
friend class CarlaEngineBridge; | friend class CarlaEngineBridge; | ||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaPlugin) | CARLA_DECLARE_NON_COPY_CLASS(CarlaPlugin) | ||||
}; | }; | ||||
@@ -58,6 +58,10 @@ static void carla_juce_cleanup(); | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
using CarlaBackend::CarlaPluginPtr; | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
uint carla_get_engine_driver_count() | uint carla_get_engine_driver_count() | ||||
{ | { | ||||
carla_debug("carla_get_engine_driver_count()"); | carla_debug("carla_get_engine_driver_count()"); | ||||
@@ -1166,7 +1170,7 @@ bool carla_load_plugin_state(CarlaHostHandle handle, uint pluginId, const char* | |||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr | ||||
&& handle->engine->isRunning(), "Engine is not running", false); | && handle->engine->isRunning(), "Engine is not running", false); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | ||||
carla_debug("carla_load_plugin_state(%p, %i, \"%s\")", handle, pluginId, filename); | carla_debug("carla_load_plugin_state(%p, %i, \"%s\")", handle, pluginId, filename); | ||||
@@ -1179,7 +1183,7 @@ bool carla_save_plugin_state(CarlaHostHandle handle, uint pluginId, const char* | |||||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | ||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr, "Engine is not initialized", false); | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr, "Engine is not initialized", false); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | ||||
carla_debug("carla_save_plugin_state(%p, %i, \"%s\")", handle, pluginId, filename); | carla_debug("carla_save_plugin_state(%p, %i, \"%s\")", handle, pluginId, filename); | ||||
@@ -1192,7 +1196,7 @@ bool carla_export_plugin_lv2(CarlaHostHandle handle, uint pluginId, const char* | |||||
CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false); | ||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr, "Engine is not initialized", false); | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine != nullptr, "Engine is not initialized", false); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(plugin != nullptr, "could not find requested plugin", false); | ||||
carla_debug("carla_export_plugin_lv2(%p, %i, \"%s\")", handle, pluginId, lv2path); | carla_debug("carla_export_plugin_lv2(%p, %i, \"%s\")", handle, pluginId, lv2path); | ||||
@@ -1238,7 +1242,7 @@ const CarlaPluginInfo* carla_get_plugin_info(CarlaHostHandle handle, uint plugin | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_plugin_info(%p, %i)", handle, pluginId); | carla_debug("carla_get_plugin_info(%p, %i)", handle, pluginId); | ||||
@@ -1281,7 +1285,7 @@ const CarlaPortCountInfo* carla_get_audio_port_count_info(CarlaHostHandle handle | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_audio_port_count_info(%p, %i)", handle, pluginId); | carla_debug("carla_get_audio_port_count_info(%p, %i)", handle, pluginId); | ||||
@@ -1298,7 +1302,7 @@ const CarlaPortCountInfo* carla_get_midi_port_count_info(CarlaHostHandle handle, | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_midi_port_count_info(%p, %i)", handle, pluginId); | carla_debug("carla_get_midi_port_count_info(%p, %i)", handle, pluginId); | ||||
@@ -1315,7 +1319,7 @@ const CarlaPortCountInfo* carla_get_parameter_count_info(CarlaHostHandle handle, | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_parameter_count_info(%p, %i)", handle, pluginId); | carla_debug("carla_get_parameter_count_info(%p, %i)", handle, pluginId); | ||||
@@ -1364,7 +1368,7 @@ const CarlaParameterInfo* carla_get_parameter_info(CarlaHostHandle handle, uint | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_parameter_info(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_parameter_info(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1434,7 +1438,7 @@ const CarlaScalePointInfo* carla_get_parameter_scalepoint_info(CarlaHostHandle h | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retInfo); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retInfo); | ||||
carla_debug("carla_get_parameter_scalepoint_info(%p, %i, %i, %i)", handle, pluginId, parameterId, scalePointId); | carla_debug("carla_get_parameter_scalepoint_info(%p, %i, %i, %i)", handle, pluginId, parameterId, scalePointId); | ||||
@@ -1470,7 +1474,7 @@ const ParameterData* carla_get_parameter_data(CarlaHostHandle handle, uint plugi | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retParamData); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retParamData); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retParamData); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retParamData); | ||||
carla_debug("carla_get_parameter_data(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_parameter_data(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1502,7 +1506,7 @@ const ParameterRanges* carla_get_parameter_ranges(CarlaHostHandle handle, uint p | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retParamRanges); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retParamRanges); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retParamRanges); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retParamRanges); | ||||
carla_debug("carla_get_parameter_ranges(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_parameter_ranges(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1534,7 +1538,7 @@ const MidiProgramData* carla_get_midi_program_data(CarlaHostHandle handle, uint | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retMidiProgData); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retMidiProgData); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retMidiProgData); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retMidiProgData); | ||||
carla_debug("carla_get_midi_program_data(%p, %i, %i)", handle, pluginId, midiProgramId); | carla_debug("carla_get_midi_program_data(%p, %i, %i)", handle, pluginId, midiProgramId); | ||||
@@ -1582,7 +1586,7 @@ const CustomData* carla_get_custom_data(CarlaHostHandle handle, uint pluginId, u | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retCustomData); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, &retCustomData); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retCustomData); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, &retCustomData); | ||||
carla_debug("carla_get_custom_data(%p, %i, %i)", handle, pluginId, customDataId); | carla_debug("carla_get_custom_data(%p, %i, %i)", handle, pluginId, customDataId); | ||||
@@ -1604,7 +1608,7 @@ const char* carla_get_custom_data_value(CarlaHostHandle handle, uint pluginId, c | |||||
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', gNullCharPtr); | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_custom_data_value(%p, %i, %s, %s)", handle, pluginId, type, key); | carla_debug("carla_get_custom_data_value(%p, %i, %s, %s)", handle, pluginId, type, key); | ||||
@@ -1636,7 +1640,7 @@ const char* carla_get_chunk_data(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_chunk_data(%p, %i)", handle, pluginId); | carla_debug("carla_get_chunk_data(%p, %i)", handle, pluginId); | ||||
@@ -1658,7 +1662,7 @@ uint32_t carla_get_parameter_count(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | ||||
carla_debug("carla_get_parameter_count(%p, %i)", handle, pluginId); | carla_debug("carla_get_parameter_count(%p, %i)", handle, pluginId); | ||||
@@ -1669,7 +1673,7 @@ uint32_t carla_get_program_count(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | ||||
carla_debug("carla_get_program_count(%p, %i)", handle, pluginId); | carla_debug("carla_get_program_count(%p, %i)", handle, pluginId); | ||||
@@ -1680,7 +1684,7 @@ uint32_t carla_get_midi_program_count(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | ||||
carla_debug("carla_get_midi_program_count(%p, %i)", handle, pluginId); | carla_debug("carla_get_midi_program_count(%p, %i)", handle, pluginId); | ||||
@@ -1691,7 +1695,7 @@ uint32_t carla_get_custom_data_count(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0); | ||||
carla_debug("carla_get_custom_data_count(%p, %i)", handle, pluginId); | carla_debug("carla_get_custom_data_count(%p, %i)", handle, pluginId); | ||||
@@ -1704,7 +1708,7 @@ const char* carla_get_parameter_text(CarlaHostHandle handle, uint pluginId, uint | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_parameter_text(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_parameter_text(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1723,7 +1727,7 @@ const char* carla_get_program_name(CarlaHostHandle handle, uint pluginId, uint32 | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, nullptr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, nullptr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_program_name(%p, %i, %i)", handle, pluginId, programId); | carla_debug("carla_get_program_name(%p, %i, %i)", handle, pluginId, programId); | ||||
@@ -1742,7 +1746,7 @@ const char* carla_get_midi_program_name(CarlaHostHandle handle, uint pluginId, u | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_midi_program_name(%p, %i, %i)", handle, pluginId, midiProgramId); | carla_debug("carla_get_midi_program_name(%p, %i, %i)", handle, pluginId, midiProgramId); | ||||
@@ -1761,7 +1765,7 @@ const char* carla_get_real_plugin_name(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, gNullCharPtr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, gNullCharPtr); | ||||
carla_debug("carla_get_real_plugin_name(%p, %i)", handle, pluginId); | carla_debug("carla_get_real_plugin_name(%p, %i)", handle, pluginId); | ||||
@@ -1780,7 +1784,7 @@ int32_t carla_get_current_program_index(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, -1); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, -1); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, -1); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, -1); | ||||
carla_debug("carla_get_current_program_index(%p, %i)", handle, pluginId); | carla_debug("carla_get_current_program_index(%p, %i)", handle, pluginId); | ||||
@@ -1791,7 +1795,7 @@ int32_t carla_get_current_midi_program_index(CarlaHostHandle handle, uint plugin | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, -1); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, -1); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, -1); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, -1); | ||||
carla_debug("carla_get_current_midi_program_index(%p, %i)", handle, pluginId); | carla_debug("carla_get_current_midi_program_index(%p, %i)", handle, pluginId); | ||||
@@ -1804,7 +1808,7 @@ float carla_get_default_parameter_value(CarlaHostHandle handle, uint pluginId, u | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0.0f); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | ||||
carla_debug("carla_get_default_parameter_value(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_default_parameter_value(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1817,7 +1821,7 @@ float carla_get_current_parameter_value(CarlaHostHandle handle, uint pluginId, u | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr, 0.0f); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < plugin->getParameterCount(), 0.0f); | CARLA_SAFE_ASSERT_RETURN(parameterId < plugin->getParameterCount(), 0.0f); | ||||
@@ -1833,7 +1837,7 @@ float carla_get_internal_parameter_value(CarlaHostHandle handle, uint pluginId, | |||||
#endif | #endif | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId != CB::PARAMETER_NULL && parameterId > CB::PARAMETER_MAX, 0.0f); | CARLA_SAFE_ASSERT_RETURN(parameterId != CB::PARAMETER_NULL && parameterId > CB::PARAMETER_MAX, 0.0f); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, 0.0f); | ||||
carla_debug("carla_get_internal_parameter_value(%p, %i, %i)", handle, pluginId, parameterId); | carla_debug("carla_get_internal_parameter_value(%p, %i, %i)", handle, pluginId, parameterId); | ||||
@@ -1869,11 +1873,11 @@ CARLA_BACKEND_START_NAMESPACE | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
// defined in CarlaPluginInternal.cpp | // defined in CarlaPluginInternal.cpp | ||||
const void* carla_render_inline_display_internal(CarlaPlugin* plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_internal(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height); | |||||
#endif | #endif | ||||
// defined in CarlaPluginLV2.cpp | // defined in CarlaPluginLV2.cpp | ||||
const void* carla_render_inline_display_lv2(CarlaPlugin* plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_lv2(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height); | |||||
CARLA_BACKEND_END_NAMESPACE | CARLA_BACKEND_END_NAMESPACE | ||||
@@ -1883,7 +1887,7 @@ const CarlaInlineDisplayImageSurface* carla_render_inline_display(CarlaHostHandl | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr && handle->engine->isRunning(), nullptr); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr && handle->engine->isRunning(), nullptr); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, nullptr); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr, nullptr); | ||||
carla_debug("carla_render_inline_display(%p, %i, %i, %i)", handle, pluginId, width, height); | carla_debug("carla_render_inline_display(%p, %i, %i, %i)", handle, pluginId, width, height); | ||||
@@ -1910,7 +1914,7 @@ void carla_set_active(CarlaHostHandle handle, uint pluginId, bool onOff) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_active(%p, %i, %s)", handle, pluginId, bool2str(onOff)); | carla_debug("carla_set_active(%p, %i, %s)", handle, pluginId, bool2str(onOff)); | ||||
@@ -1922,7 +1926,7 @@ void carla_set_drywet(CarlaHostHandle handle, uint pluginId, float value) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_drywet(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | carla_debug("carla_set_drywet(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | ||||
@@ -1933,7 +1937,7 @@ void carla_set_volume(CarlaHostHandle handle, uint pluginId, float value) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_volume(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | carla_debug("carla_set_volume(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | ||||
@@ -1944,7 +1948,7 @@ void carla_set_balance_left(CarlaHostHandle handle, uint pluginId, float value) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_balance_left(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | carla_debug("carla_set_balance_left(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | ||||
@@ -1955,7 +1959,7 @@ void carla_set_balance_right(CarlaHostHandle handle, uint pluginId, float value) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_balance_right(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | carla_debug("carla_set_balance_right(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | ||||
@@ -1966,7 +1970,7 @@ void carla_set_panning(CarlaHostHandle handle, uint pluginId, float value) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_panning(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | carla_debug("carla_set_panning(%p, %i, %f)", handle, pluginId, static_cast<double>(value)); | ||||
@@ -1978,7 +1982,7 @@ void carla_set_ctrl_channel(CarlaHostHandle handle, uint pluginId, int8_t channe | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS,); | CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_ctrl_channel(%p, %i, %i)", handle, pluginId, channel); | carla_debug("carla_set_ctrl_channel(%p, %i, %i)", handle, pluginId, channel); | ||||
@@ -1990,7 +1994,7 @@ void carla_set_option(CarlaHostHandle handle, uint pluginId, uint option, bool y | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_option(%p, %i, %i, %s)", handle, pluginId, option, bool2str(yesNo)); | carla_debug("carla_set_option(%p, %i, %i, %s)", handle, pluginId, option, bool2str(yesNo)); | ||||
@@ -2003,7 +2007,7 @@ void carla_set_parameter_value(CarlaHostHandle handle, uint pluginId, uint32_t p | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_parameter_value(%p, %i, %i, %f)", handle, pluginId, parameterId, static_cast<double>(value)); | carla_debug("carla_set_parameter_value(%p, %i, %i, %f)", handle, pluginId, parameterId, static_cast<double>(value)); | ||||
@@ -2019,7 +2023,7 @@ void carla_set_parameter_midi_channel(CarlaHostHandle handle, uint pluginId, uin | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_parameter_midi_channel(%p, %i, %i, %i)", handle, pluginId, parameterId, channel); | carla_debug("carla_set_parameter_midi_channel(%p, %i, %i, %i)", handle, pluginId, parameterId, channel); | ||||
@@ -2033,7 +2037,7 @@ void carla_set_parameter_mapped_control_index(CarlaHostHandle handle, uint plugi | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(index >= CB::CONTROL_INDEX_NONE && index <= CB::CONTROL_INDEX_MAX_ALLOWED,); | CARLA_SAFE_ASSERT_RETURN(index >= CB::CONTROL_INDEX_NONE && index <= CB::CONTROL_INDEX_MAX_ALLOWED,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_parameter_mapped_control_index(%p, %i, %i, %i)", handle, pluginId, parameterId, index); | carla_debug("carla_set_parameter_mapped_control_index(%p, %i, %i, %i)", handle, pluginId, parameterId, index); | ||||
@@ -2046,7 +2050,7 @@ void carla_set_parameter_mapped_range(CarlaHostHandle handle, uint pluginId, uin | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_parameter_mapped_range(%p, %i, %i, %f, %f)", | carla_debug("carla_set_parameter_mapped_range(%p, %i, %i, %f, %f)", | ||||
@@ -2071,7 +2075,7 @@ void carla_set_program(CarlaHostHandle handle, uint pluginId, uint32_t programId | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_program(%p, %i, %i)", handle, pluginId, programId); | carla_debug("carla_set_program(%p, %i, %i)", handle, pluginId, programId); | ||||
@@ -2084,7 +2088,7 @@ void carla_set_midi_program(CarlaHostHandle handle, uint pluginId, uint32_t midi | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_midi_program(%p, %i, %i)", handle, pluginId, midiProgramId); | carla_debug("carla_set_midi_program(%p, %i, %i)", handle, pluginId, midiProgramId); | ||||
@@ -2102,7 +2106,7 @@ void carla_set_custom_data(CarlaHostHandle handle, uint pluginId, const char* ty | |||||
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_custom_data(%p, %i, \"%s\", \"%s\", \"%s\")", handle, pluginId, type, key, value); | carla_debug("carla_set_custom_data(%p, %i, \"%s\", \"%s\", \"%s\")", handle, pluginId, type, key, value); | ||||
@@ -2114,7 +2118,7 @@ void carla_set_chunk_data(CarlaHostHandle handle, uint pluginId, const char* chu | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(chunkData != nullptr && chunkData[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(chunkData != nullptr && chunkData[0] != '\0',); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_set_chunk_data(%p, %i, \"%s\")", handle, pluginId, chunkData); | carla_debug("carla_set_chunk_data(%p, %i, \"%s\")", handle, pluginId, chunkData); | ||||
@@ -2134,7 +2138,7 @@ void carla_prepare_for_save(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_prepare_for_save(%p, %i)", handle, pluginId); | carla_debug("carla_prepare_for_save(%p, %i)", handle, pluginId); | ||||
@@ -2145,7 +2149,7 @@ void carla_reset_parameters(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_reset_parameters(%p, %i)", handle, pluginId); | carla_debug("carla_reset_parameters(%p, %i)", handle, pluginId); | ||||
@@ -2156,7 +2160,7 @@ void carla_randomize_parameters(CarlaHostHandle handle, uint pluginId) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_randomize_parameters(%p, %i)", handle, pluginId); | carla_debug("carla_randomize_parameters(%p, %i)", handle, pluginId); | ||||
@@ -2168,7 +2172,7 @@ void carla_send_midi_note(CarlaHostHandle handle, uint pluginId, uint8_t channel | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr && handle->engine->isRunning(),); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr && handle->engine->isRunning(),); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_send_midi_note(%p, %i, %i, %i, %i)", handle, pluginId, channel, note, velocity); | carla_debug("carla_send_midi_note(%p, %i, %i, %i, %i)", handle, pluginId, channel, note, velocity); | ||||
@@ -2181,7 +2185,7 @@ void carla_set_custom_ui_title_format(CarlaHostHandle handle, uint pluginId, con | |||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(format != nullptr && format[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(format != nullptr && format[0] != '\0',); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_randomize_parameters(%p, %i, %s)", handle, pluginId, format); | carla_debug("carla_randomize_parameters(%p, %i, %s)", handle, pluginId, format); | ||||
@@ -2192,7 +2196,7 @@ void carla_show_custom_ui(CarlaHostHandle handle, uint pluginId, bool yesNo) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); | ||||
CarlaPlugin* const plugin = handle->engine->getPlugin(pluginId); | |||||
const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId); | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("carla_show_custom_ui(%p, %i, %s)", handle, pluginId, bool2str(yesNo)); | carla_debug("carla_show_custom_ui(%p, %i, %s)", handle, pluginId, bool2str(yesNo)); | ||||
@@ -364,7 +364,7 @@ void CarlaEngine::idle() noexcept | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -382,9 +382,11 @@ void CarlaEngine::idle() noexcept | |||||
#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE) | #if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE) | ||||
pData->osc.idle(); | pData->osc.idle(); | ||||
#endif | #endif | ||||
pData->deletePluginsAsNeeded(); | |||||
} | } | ||||
CarlaEngineClient* CarlaEngine::addClient(CarlaPlugin* const plugin) | |||||
CarlaEngineClient* CarlaEngine::addClient(CarlaPluginPtr plugin) | |||||
{ | { | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
return new CarlaEngineClientForStandalone(*this, pData->graph, plugin); | return new CarlaEngineClientForStandalone(*this, pData->graph, plugin); | ||||
@@ -464,7 +466,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||||
uint id; | uint id; | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CarlaPlugin* oldPlugin = nullptr; | |||||
CarlaPluginPtr oldPlugin; | |||||
if (pData->nextPluginId < pData->curPluginCount) | if (pData->nextPluginId < pData->curPluginCount) | ||||
{ | { | ||||
@@ -501,7 +503,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||||
options | options | ||||
}; | }; | ||||
CarlaPlugin* plugin = nullptr; | |||||
CarlaPluginPtr plugin; | |||||
CarlaString bridgeBinary(pData->options.binaryDir); | CarlaString bridgeBinary(pData->options.binaryDir); | ||||
if (bridgeBinary.isNotEmpty()) | if (bridgeBinary.isNotEmpty()) | ||||
@@ -670,7 +672,6 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||||
if (! canRun) | if (! canRun) | ||||
{ | { | ||||
delete plugin; | |||||
return false; | return false; | ||||
} | } | ||||
@@ -692,7 +693,8 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||||
const float oldDryWet = oldPlugin->getInternalParameterValue(PARAMETER_DRYWET); | const float oldDryWet = oldPlugin->getInternalParameterValue(PARAMETER_DRYWET); | ||||
const float oldVolume = oldPlugin->getInternalParameterValue(PARAMETER_VOLUME); | const float oldVolume = oldPlugin->getInternalParameterValue(PARAMETER_VOLUME); | ||||
delete oldPlugin; | |||||
oldPlugin->prepareForDeletion(); | |||||
pData->pluginsToDelete.push_back(oldPlugin); | |||||
if (plugin->getHints() & PLUGIN_CAN_DRYWET) | if (plugin->getHints() & PLUGIN_CAN_DRYWET) | ||||
plugin->setDryWet(oldDryWet, true, true); | plugin->setDryWet(oldDryWet, true, true); | ||||
@@ -741,12 +743,14 @@ bool CarlaEngine::removePlugin(const uint id) | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data"); | ||||
#else | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(id == 0, "Invalid engine internal data"); | |||||
#endif | #endif | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | ||||
carla_debug("CarlaEngine::removePlugin(%i)", id); | carla_debug("CarlaEngine::removePlugin(%i)", id); | ||||
CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[id].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to remove"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to remove"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | ||||
@@ -769,10 +773,12 @@ bool CarlaEngine::removePlugin(const uint id) | |||||
*/ | */ | ||||
#else | #else | ||||
pData->curPluginCount = 0; | pData->curPluginCount = 0; | ||||
carla_zeroStructs(pData->plugins, 1); | |||||
pData->plugins[0].plugin = nullptr; | |||||
carla_zeroStruct(pData->plugins[0].peaks); | |||||
#endif | #endif | ||||
delete plugin; | |||||
plugin->prepareForDeletion(); | |||||
pData->pluginsToDelete.push_back(plugin); | |||||
callback(true, true, ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0, 0.0f, nullptr); | callback(true, true, ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0, 0.0f, nullptr); | ||||
return true; | return true; | ||||
@@ -793,7 +799,7 @@ bool CarlaEngine::removeAllPlugins() | |||||
const ScopedThreadStopper sts(this); | const ScopedThreadStopper sts(this); | ||||
const uint curPluginCount(pData->curPluginCount); | |||||
const uint curPluginCount = pData->curPluginCount; | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) | if (pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) | ||||
@@ -809,13 +815,11 @@ bool CarlaEngine::removeAllPlugins() | |||||
const uint id = curPluginCount - i - 1; | const uint id = curPluginCount - i - 1; | ||||
EnginePluginData& pluginData(pData->plugins[id]); | EnginePluginData& pluginData(pData->plugins[id]); | ||||
if (pluginData.plugin != nullptr) | |||||
{ | |||||
delete pluginData.plugin; | |||||
pluginData.plugin = nullptr; | |||||
} | |||||
pluginData.plugin->prepareForDeletion(); | |||||
pData->pluginsToDelete.push_back(pluginData.plugin); | |||||
carla_zeroFloats(pluginData.peaks, 4); | |||||
pluginData.plugin = nullptr; | |||||
carla_zeroStruct(pluginData.peaks); | |||||
callback(true, true, ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0, 0.0f, nullptr); | callback(true, true, ENGINE_CALLBACK_PLUGIN_REMOVED, id, 0, 0, 0, 0.0f, nullptr); | ||||
callback(true, false, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | callback(true, false, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | ||||
@@ -835,7 +839,7 @@ bool CarlaEngine::renamePlugin(const uint id, const char* const newName) | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(newName != nullptr && newName[0] != '\0', "Invalid plugin name"); | CARLA_SAFE_ASSERT_RETURN_ERR(newName != nullptr && newName[0] != '\0', "Invalid plugin name"); | ||||
carla_debug("CarlaEngine::renamePlugin(%i, \"%s\")", id, newName); | carla_debug("CarlaEngine::renamePlugin(%i, \"%s\")", id, newName); | ||||
CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[id].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to rename"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to rename"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | ||||
@@ -862,7 +866,7 @@ bool CarlaEngine::clonePlugin(const uint id) | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | ||||
carla_debug("CarlaEngine::clonePlugin(%i)", id); | carla_debug("CarlaEngine::clonePlugin(%i)", id); | ||||
CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[id].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to clone"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to clone"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | ||||
@@ -882,7 +886,7 @@ bool CarlaEngine::clonePlugin(const uint id) | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pluginCountBefore+1 == pData->curPluginCount, "No new plugin found"); | CARLA_SAFE_ASSERT_RETURN_ERR(pluginCountBefore+1 == pData->curPluginCount, "No new plugin found"); | ||||
if (CarlaPlugin* const newPlugin = pData->plugins[pluginCountBefore].plugin) | |||||
if (const CarlaPluginPtr newPlugin = pData->plugins[pluginCountBefore].plugin) | |||||
newPlugin->loadStateSave(plugin->getStateSave()); | newPlugin->loadStateSave(plugin->getStateSave()); | ||||
return true; | return true; | ||||
@@ -905,7 +909,7 @@ bool CarlaEngine::replacePlugin(const uint id) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | CARLA_SAFE_ASSERT_RETURN_ERR(id < pData->curPluginCount, "Invalid plugin Id"); | ||||
CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[id].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to replace"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to replace"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | ||||
@@ -926,8 +930,8 @@ bool CarlaEngine::switchPlugins(const uint idA, const uint idB) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(idB < pData->curPluginCount, "Invalid plugin Id"); | CARLA_SAFE_ASSERT_RETURN_ERR(idB < pData->curPluginCount, "Invalid plugin Id"); | ||||
carla_debug("CarlaEngine::switchPlugins(%i)", idA, idB); | carla_debug("CarlaEngine::switchPlugins(%i)", idA, idB); | ||||
CarlaPlugin* const pluginA(pData->plugins[idA].plugin); | |||||
CarlaPlugin* const pluginB(pData->plugins[idB].plugin); | |||||
CarlaPluginPtr pluginA = pData->plugins[idA].plugin; | |||||
CarlaPluginPtr pluginB = pData->plugins[idB].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pluginA != nullptr, "Could not find plugin to switch"); | CARLA_SAFE_ASSERT_RETURN_ERR(pluginA != nullptr, "Could not find plugin to switch"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pluginA != nullptr, "Could not find plugin to switch"); | CARLA_SAFE_ASSERT_RETURN_ERR(pluginA != nullptr, "Could not find plugin to switch"); | ||||
@@ -958,7 +962,7 @@ void CarlaEngine::touchPluginParameter(const uint, const uint32_t, const bool) n | |||||
{ | { | ||||
} | } | ||||
CarlaPlugin* CarlaEngine::getPlugin(const uint id) const noexcept | |||||
CarlaPluginPtr CarlaEngine::getPlugin(const uint id) const noexcept | |||||
{ | { | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data"); | ||||
@@ -970,7 +974,7 @@ CarlaPlugin* CarlaEngine::getPlugin(const uint id) const noexcept | |||||
return pData->plugins[id].plugin; | return pData->plugins[id].plugin; | ||||
} | } | ||||
CarlaPlugin* CarlaEngine::getPluginUnchecked(const uint id) const noexcept | |||||
CarlaPluginPtr CarlaEngine::getPluginUnchecked(const uint id) const noexcept | |||||
{ | { | ||||
return pData->plugins[id].plugin; | return pData->plugins[id].plugin; | ||||
} | } | ||||
@@ -1150,7 +1154,7 @@ bool CarlaEngine::loadFile(const char* const filename) | |||||
{ | { | ||||
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr)) | if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr)) | ||||
{ | { | ||||
if (CarlaPlugin* const plugin = getPlugin(curPluginId)) | |||||
if (const CarlaPluginPtr plugin = getPlugin(curPluginId)) | |||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); | plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -1163,7 +1167,7 @@ bool CarlaEngine::loadFile(const char* const filename) | |||||
{ | { | ||||
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile", 0, nullptr)) | if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile", 0, nullptr)) | ||||
{ | { | ||||
if (CarlaPlugin* const plugin = getPlugin(curPluginId)) | |||||
if (const CarlaPluginPtr plugin = getPlugin(curPluginId)) | |||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); | plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -1185,13 +1189,16 @@ bool CarlaEngine::loadFile(const char* const filename) | |||||
else | else | ||||
nicerName += baseName; | nicerName += baseName; | ||||
//nicerName | |||||
if (addPlugin(PLUGIN_INTERNAL, nullptr, nicerName, "zynaddsubfx", 0, nullptr)) | if (addPlugin(PLUGIN_INTERNAL, nullptr, nicerName, "zynaddsubfx", 0, nullptr)) | ||||
{ | { | ||||
callback(true, true, ENGINE_CALLBACK_UI_STATE_CHANGED, curPluginId, 0, 0, 0, 0.0f, nullptr); | callback(true, true, ENGINE_CALLBACK_UI_STATE_CHANGED, curPluginId, 0, 0, 0, 0.0f, nullptr); | ||||
if (CarlaPlugin* const plugin = getPlugin(curPluginId)) | |||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2", filename, true); | |||||
if (const CarlaPluginPtr plugin = getPlugin(curPluginId)) | |||||
{ | |||||
const char* const ext = (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2"; | |||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, ext, filename, true); | |||||
} | |||||
return true; | return true; | ||||
} | } | ||||
return false; | return false; | ||||
@@ -1415,7 +1422,7 @@ void CarlaEngine::callback(const bool sendHost, const bool sendOSC, | |||||
{ | { | ||||
case ENGINE_CALLBACK_RELOAD_INFO: | case ENGINE_CALLBACK_RELOAD_INFO: | ||||
{ | { | ||||
CarlaPlugin* const plugin = pData->plugins[pluginId].plugin; | |||||
CarlaPluginPtr plugin = pData->plugins[pluginId].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
pData->osc.sendPluginInfo(plugin); | pData->osc.sendPluginInfo(plugin); | ||||
@@ -1424,7 +1431,7 @@ void CarlaEngine::callback(const bool sendHost, const bool sendOSC, | |||||
case ENGINE_CALLBACK_RELOAD_PARAMETERS: | case ENGINE_CALLBACK_RELOAD_PARAMETERS: | ||||
{ | { | ||||
CarlaPlugin* const plugin = pData->plugins[pluginId].plugin; | |||||
CarlaPluginPtr plugin = pData->plugins[pluginId].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
pData->osc.sendPluginPortCount(plugin); | pData->osc.sendPluginPortCount(plugin); | ||||
@@ -1439,7 +1446,7 @@ void CarlaEngine::callback(const bool sendHost, const bool sendOSC, | |||||
case ENGINE_CALLBACK_RELOAD_PROGRAMS: | case ENGINE_CALLBACK_RELOAD_PROGRAMS: | ||||
{ | { | ||||
CarlaPlugin* const plugin = pData->plugins[pluginId].plugin; | |||||
CarlaPluginPtr plugin = pData->plugins[pluginId].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
pData->osc.sendPluginProgramCount(plugin); | pData->osc.sendPluginProgramCount(plugin); | ||||
@@ -1461,7 +1468,7 @@ void CarlaEngine::callback(const bool sendHost, const bool sendOSC, | |||||
case ENGINE_CALLBACK_PLUGIN_ADDED: | case ENGINE_CALLBACK_PLUGIN_ADDED: | ||||
case ENGINE_CALLBACK_RELOAD_ALL: | case ENGINE_CALLBACK_RELOAD_ALL: | ||||
{ | { | ||||
CarlaPlugin* const plugin = pData->plugins[pluginId].plugin; | |||||
CarlaPluginPtr plugin = pData->plugins[pluginId].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
pData->osc.sendPluginInfo(plugin); | pData->osc.sendPluginInfo(plugin); | ||||
@@ -2023,7 +2030,7 @@ void CarlaEngine::bufferSizeChanged(const uint32_t newBufferSize) | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -2052,7 +2059,7 @@ void CarlaEngine::sampleRateChanged(const double newSampleRate) | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -2079,7 +2086,7 @@ void CarlaEngine::offlineModeChanged(const bool isOfflineNow) | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
plugin->offlineModeChanged(isOfflineNow); | plugin->offlineModeChanged(isOfflineNow); | ||||
@@ -2101,7 +2108,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons | |||||
// send initial prepareForSave first, giving time for bridges to act | // send initial prepareForSave first, giving time for bridges to act | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -2165,7 +2172,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -2188,7 +2195,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons | |||||
// tell bridges we're done saving | // tell bridges we're done saving | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | ||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | ||||
@@ -2639,7 +2646,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) | |||||
{ | { | ||||
const uint pluginId = pData->curPluginCount; | const uint pluginId = pData->curPluginCount; | ||||
if (CarlaPlugin* const plugin = pData->plugins[pluginId].plugin) | |||||
if (const CarlaPluginPtr plugin = pData->plugins[pluginId].plugin) | |||||
{ | { | ||||
callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | ||||
@@ -2789,7 +2796,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) | |||||
const uint pluginId = 0; | const uint pluginId = 0; | ||||
#endif | #endif | ||||
if (CarlaPlugin* const plugin = pData->plugins[pluginId].plugin) | |||||
if (const CarlaPluginPtr plugin = pData->plugins[pluginId].plugin) | |||||
{ | { | ||||
callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | ||||
@@ -2845,7 +2852,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) | |||||
// tell bridges we're done loading | // tell bridges we're done loading | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | ||||
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | ||||
@@ -67,7 +67,10 @@ class CarlaEngineBridgeClient : public CarlaEngineClientForSubclassing | |||||
{ | { | ||||
public: | public: | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CarlaEngineBridgeClient(const CarlaEngine& engine, EngineInternalGraph& egraph, CarlaPlugin* const plugin, LatencyChangedCallback* const cb) | |||||
CarlaEngineBridgeClient(const CarlaEngine& engine, | |||||
EngineInternalGraph& egraph, | |||||
const CarlaPluginPtr plugin, | |||||
LatencyChangedCallback* const cb) | |||||
: CarlaEngineClientForSubclassing(engine, egraph, plugin), | : CarlaEngineClientForSubclassing(engine, egraph, plugin), | ||||
fLatencyCallback(cb) {} | fLatencyCallback(cb) {} | ||||
#else | #else | ||||
@@ -294,7 +297,7 @@ public: | |||||
fShmNonRtServerControl.commitWrite(); | fShmNonRtServerControl.commitWrite(); | ||||
} | } | ||||
CarlaEngineClient* addClient(CarlaPlugin* const plugin) override | |||||
CarlaEngineClient* addClient(const CarlaPluginPtr plugin) override | |||||
{ | { | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
return new CarlaEngineBridgeClient(*this, pData->graph, plugin, this); | return new CarlaEngineBridgeClient(*this, pData->graph, plugin, this); | ||||
@@ -308,7 +311,7 @@ public: | |||||
void idle() noexcept override | void idle() noexcept override | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[0].plugin); | |||||
const CarlaPluginPtr plugin = pData->plugins[0].plugin; | |||||
if (plugin == nullptr) | if (plugin == nullptr) | ||||
{ | { | ||||
@@ -702,7 +705,7 @@ public: | |||||
break; | break; | ||||
case ENGINE_CALLBACK_RELOAD_PARAMETERS: | case ENGINE_CALLBACK_RELOAD_PARAMETERS: | ||||
if (CarlaPlugin* const plugin = pData->plugins[0].plugin) | |||||
if (const CarlaPluginPtr plugin = pData->plugins[0].plugin) | |||||
{ | { | ||||
if (const uint32_t count = std::min(pData->options.maxParameters, plugin->getParameterCount())) | if (const uint32_t count = std::min(pData->options.maxParameters, plugin->getParameterCount())) | ||||
{ | { | ||||
@@ -745,7 +748,7 @@ public: | |||||
void handleNonRtData() | void handleNonRtData() | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[0].plugin); | |||||
const CarlaPluginPtr plugin = pData->plugins[0].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
for (; fShmNonRtClientControl.isDataAvailableForReading();) | for (; fShmNonRtClientControl.isDataAvailableForReading();) | ||||
@@ -1135,7 +1138,7 @@ protected: | |||||
for (; fShmRtClientControl.isDataAvailableForReading();) | for (; fShmRtClientControl.isDataAvailableForReading();) | ||||
{ | { | ||||
const PluginBridgeRtClientOpcode opcode(fShmRtClientControl.readOpcode()); | const PluginBridgeRtClientOpcode opcode(fShmRtClientControl.readOpcode()); | ||||
CarlaPlugin* const plugin(pData->plugins[0].plugin); | |||||
const CarlaPluginPtr plugin = pData->plugins[0].plugin; | |||||
#ifdef DEBUG | #ifdef DEBUG | ||||
if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent) { | if (opcode != kPluginBridgeRtClientProcess && opcode != kPluginBridgeRtClientMidiEvent) { | ||||
@@ -87,7 +87,9 @@ static void _getUniquePortName(CarlaString& sname, const CarlaStringList& list) | |||||
// Carla Engine Client | // Carla Engine Client | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CarlaEngineClient::ProtectedData::ProtectedData(const CarlaEngine& eng, EngineInternalGraph& eg, CarlaPlugin* const p) noexcept | |||||
CarlaEngineClient::ProtectedData::ProtectedData(const CarlaEngine& eng, | |||||
EngineInternalGraph& eg, | |||||
const CarlaPluginPtr p) noexcept | |||||
#else | #else | ||||
CarlaEngineClient::ProtectedData::ProtectedData(const CarlaEngine& eng) noexcept | CarlaEngineClient::ProtectedData::ProtectedData(const CarlaEngine& eng) noexcept | ||||
#endif | #endif | ||||
@@ -106,6 +108,12 @@ CarlaEngineClient::ProtectedData::ProtectedData(const CarlaEngine& eng) noexcept | |||||
eventInList(), | eventInList(), | ||||
eventOutList() {} | eventOutList() {} | ||||
CarlaEngineClient::ProtectedData::~ProtectedData() | |||||
{ | |||||
carla_debug("CarlaEngineClient::ProtectedData::~ProtectedData()"); | |||||
CARLA_SAFE_ASSERT(plugin == nullptr); | |||||
} | |||||
void CarlaEngineClient::ProtectedData::addAudioPortName(const bool isInput, const char* const name) | void CarlaEngineClient::ProtectedData::addAudioPortName(const bool isInput, const char* const name) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | ||||
@@ -178,12 +186,20 @@ void CarlaEngineClient::activate() noexcept | |||||
pData->active = true; | pData->active = true; | ||||
} | } | ||||
void CarlaEngineClient::deactivate() noexcept | |||||
void CarlaEngineClient::deactivate(const bool willClose) noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT(pData->active); | CARLA_SAFE_ASSERT(pData->active); | ||||
carla_debug("CarlaEngineClient::deactivate()"); | |||||
carla_debug("CarlaEngineClient::deactivate(%s)", bool2str(willClose)); | |||||
pData->active = false; | pData->active = false; | ||||
if (willClose) | |||||
{ | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||||
pData->cvSourcePorts.setGraphAndPlugin(nullptr, nullptr); | |||||
#endif | |||||
pData->plugin = nullptr; | |||||
} | |||||
} | } | ||||
bool CarlaEngineClient::isActive() const noexcept | bool CarlaEngineClient::isActive() const noexcept | ||||
@@ -20,6 +20,7 @@ | |||||
#include "CarlaEngine.hpp" | #include "CarlaEngine.hpp" | ||||
#include "CarlaEnginePorts.hpp" | #include "CarlaEnginePorts.hpp" | ||||
#include "CarlaPlugin.hpp" | |||||
#include "CarlaStringList.hpp" | #include "CarlaStringList.hpp" | ||||
@@ -37,7 +38,7 @@ struct CarlaEngineClient::ProtectedData { | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CarlaEngineCVSourcePortsForStandalone cvSourcePorts; | CarlaEngineCVSourcePortsForStandalone cvSourcePorts; | ||||
EngineInternalGraph& egraph; | EngineInternalGraph& egraph; | ||||
CarlaPlugin* const plugin; | |||||
CarlaPluginPtr plugin; | |||||
#endif | #endif | ||||
CarlaStringList audioInList; | CarlaStringList audioInList; | ||||
@@ -48,10 +49,11 @@ struct CarlaEngineClient::ProtectedData { | |||||
CarlaStringList eventOutList; | CarlaStringList eventOutList; | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
ProtectedData(const CarlaEngine& eng, EngineInternalGraph& eg, CarlaPlugin* p) noexcept; | |||||
ProtectedData(const CarlaEngine& eng, EngineInternalGraph& eg, CarlaPluginPtr p) noexcept; | |||||
#else | #else | ||||
ProtectedData(const CarlaEngine& eng) noexcept; | ProtectedData(const CarlaEngine& eng) noexcept; | ||||
#endif | #endif | ||||
~ProtectedData(); | |||||
void addAudioPortName(bool isInput, const char* name); | void addAudioPortName(bool isInput, const char* name); | ||||
void addCVPortName(bool isInput, const char* name); | void addCVPortName(bool isInput, const char* name); | ||||
@@ -72,11 +74,14 @@ struct CarlaEngineClient::ProtectedData { | |||||
class CarlaEngineClientForStandalone : public CarlaEngineClient | class CarlaEngineClientForStandalone : public CarlaEngineClient | ||||
{ | { | ||||
public: | public: | ||||
CarlaEngineClientForStandalone(const CarlaEngine& engine, EngineInternalGraph& egraph, CarlaPlugin* const plugin) | |||||
CarlaEngineClientForStandalone(const CarlaEngine& engine, | |||||
EngineInternalGraph& egraph, | |||||
const CarlaPluginPtr plugin) | |||||
: CarlaEngineClient(new ProtectedData(engine, egraph, plugin)) {} | : CarlaEngineClient(new ProtectedData(engine, egraph, plugin)) {} | ||||
~CarlaEngineClientForStandalone() noexcept override | ~CarlaEngineClientForStandalone() noexcept override | ||||
{ | { | ||||
carla_debug("CarlaEngineClientForStandalone::~CarlaEngineClientForStandalone()"); | |||||
delete pData; | delete pData; | ||||
} | } | ||||
@@ -86,7 +91,7 @@ protected: | |||||
return pData->egraph.getPatchbayGraphOrNull(); | return pData->egraph.getPatchbayGraphOrNull(); | ||||
} | } | ||||
inline CarlaPlugin* getPlugin() const noexcept | |||||
inline CarlaPluginPtr getPlugin() const noexcept | |||||
{ | { | ||||
return pData->plugin; | return pData->plugin; | ||||
} | } | ||||
@@ -103,6 +108,7 @@ public: | |||||
~CarlaEngineClientForBridge() override | ~CarlaEngineClientForBridge() override | ||||
{ | { | ||||
carla_debug("CarlaEngineClientForBridge::~CarlaEngineClientForBridge()"); | |||||
delete pData; | delete pData; | ||||
} | } | ||||
@@ -967,7 +967,7 @@ void RackGraph::process(CarlaEngine::ProtectedData* const data, const float* inB | |||||
// process plugins | // process plugins | ||||
for (uint i=0; i < data->curPluginCount; ++i) | for (uint i=0; i < data->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin = data->plugins[i].plugin; | |||||
const CarlaPluginPtr plugin = data->plugins[i].plugin; | |||||
if (plugin == nullptr || ! plugin->isEnabled() || ! plugin->tryLock(isOffline)) | if (plugin == nullptr || ! plugin->isEnabled() || ! plugin->tryLock(isOffline)) | ||||
continue; | continue; | ||||
@@ -1450,7 +1450,7 @@ void removeNodeFromPatchbay(const bool sendHost, const bool sendOSC, CarlaEngine | |||||
class CarlaPluginInstance : public AudioProcessor | class CarlaPluginInstance : public AudioProcessor | ||||
{ | { | ||||
public: | public: | ||||
CarlaPluginInstance(CarlaEngine* const engine, CarlaPlugin* const plugin) | |||||
CarlaPluginInstance(CarlaEngine* const engine, const CarlaPluginPtr plugin) | |||||
: kEngine(engine), | : kEngine(engine), | ||||
fPlugin(plugin) | fPlugin(plugin) | ||||
{ | { | ||||
@@ -1641,7 +1641,7 @@ public: | |||||
private: | private: | ||||
CarlaEngine* const kEngine; | CarlaEngine* const kEngine; | ||||
CarlaPlugin* fPlugin; | |||||
CarlaPluginPtr fPlugin; | |||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginInstance) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginInstance) | ||||
}; | }; | ||||
@@ -1862,10 +1862,10 @@ void PatchbayGraph::setOffline(const bool offline) | |||||
graph.setNonRealtime(offline); | graph.setNonRealtime(offline); | ||||
} | } | ||||
void PatchbayGraph::addPlugin(CarlaPlugin* const plugin) | |||||
void PatchbayGraph::addPlugin(const CarlaPluginPtr plugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("PatchbayGraph::addPlugin(%p)", plugin); | |||||
carla_debug("PatchbayGraph::addPlugin(%p)", plugin.get()); | |||||
CarlaPluginInstance* const instance(new CarlaPluginInstance(kEngine, plugin)); | CarlaPluginInstance* const instance(new CarlaPluginInstance(kEngine, plugin)); | ||||
AudioProcessorGraph::Node* const node(graph.addNode(instance)); | AudioProcessorGraph::Node* const node(graph.addNode(instance)); | ||||
@@ -1882,7 +1882,7 @@ void PatchbayGraph::addPlugin(CarlaPlugin* const plugin) | |||||
addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(plugin->getId()), instance); | addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(plugin->getId()), instance); | ||||
} | } | ||||
void PatchbayGraph::replacePlugin(CarlaPlugin* const oldPlugin, CarlaPlugin* const newPlugin) | |||||
void PatchbayGraph::replacePlugin(const CarlaPluginPtr oldPlugin, const CarlaPluginPtr newPlugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(oldPlugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(oldPlugin != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(newPlugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(newPlugin != nullptr,); | ||||
@@ -1914,10 +1914,10 @@ void PatchbayGraph::replacePlugin(CarlaPlugin* const oldPlugin, CarlaPlugin* con | |||||
addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(newPlugin->getId()), instance); | addNodeToPatchbay(sendHost, sendOSC, kEngine, node, static_cast<int>(newPlugin->getId()), instance); | ||||
} | } | ||||
void PatchbayGraph::renamePlugin(CarlaPlugin* const plugin, const char* const newName) | |||||
void PatchbayGraph::renamePlugin(const CarlaPluginPtr plugin, const char* const newName) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("PatchbayGraph::renamePlugin(%p)", plugin, newName); | |||||
carla_debug("PatchbayGraph::renamePlugin(%p)", plugin.get(), newName); | |||||
AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | ||||
CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | ||||
@@ -1932,10 +1932,10 @@ void PatchbayGraph::renamePlugin(CarlaPlugin* const plugin, const char* const ne | |||||
newName); | newName); | ||||
} | } | ||||
void PatchbayGraph::reconfigureForCV(CarlaPlugin* const plugin, const uint portIndex, bool added) | |||||
void PatchbayGraph::reconfigureForCV(const CarlaPluginPtr plugin, const uint portIndex, bool added) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("PatchbayGraph::reconfigureForCV(%p, %u, %s)", plugin, portIndex, bool2str(added)); | |||||
carla_debug("PatchbayGraph::reconfigureForCV(%p, %u, %s)", plugin.get(), portIndex, bool2str(added)); | |||||
AudioProcessorGraph::Node* const node = graph.getNodeForId(plugin->getPatchbayNodeId()); | AudioProcessorGraph::Node* const node = graph.getNodeForId(plugin->getPatchbayNodeId()); | ||||
CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | ||||
@@ -1986,10 +1986,10 @@ void PatchbayGraph::reconfigureForCV(CarlaPlugin* const plugin, const uint portI | |||||
} | } | ||||
} | } | ||||
void PatchbayGraph::removePlugin(CarlaPlugin* const plugin) | |||||
void PatchbayGraph::removePlugin(const CarlaPluginPtr plugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("PatchbayGraph::removePlugin(%p)", plugin); | |||||
carla_debug("PatchbayGraph::removePlugin(%p)", plugin.get()); | |||||
AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | ||||
CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | CARLA_SAFE_ASSERT_RETURN(node != nullptr,); | ||||
@@ -2005,7 +2005,7 @@ void PatchbayGraph::removePlugin(CarlaPlugin* const plugin) | |||||
// Fix plugin Ids properties | // Fix plugin Ids properties | ||||
for (uint i=plugin->getId()+1, count=kEngine->getCurrentPluginCount(); i<count; ++i) | for (uint i=plugin->getId()+1, count=kEngine->getCurrentPluginCount(); i<count; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin2(kEngine->getPlugin(i)); | |||||
const CarlaPluginPtr plugin2 = kEngine->getPlugin(i); | |||||
CARLA_SAFE_ASSERT_BREAK(plugin2 != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin2 != nullptr); | ||||
if (AudioProcessorGraph::Node* const node2 = graph.getNodeForId(plugin2->getPatchbayNodeId())) | if (AudioProcessorGraph::Node* const node2 = graph.getNodeForId(plugin2->getPatchbayNodeId())) | ||||
@@ -2027,7 +2027,7 @@ void PatchbayGraph::removeAllPlugins() | |||||
for (uint i=0, count=kEngine->getCurrentPluginCount(); i<count; ++i) | for (uint i=0, count=kEngine->getCurrentPluginCount(); i<count; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(kEngine->getPlugin(i)); | |||||
const CarlaPluginPtr plugin = kEngine->getPlugin(i); | |||||
CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr); | ||||
AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | AudioProcessorGraph::Node* const node(graph.getNodeForId(plugin->getPatchbayNodeId())); | ||||
@@ -2717,25 +2717,25 @@ void EngineInternalGraph::processRack(CarlaEngine::ProtectedData* const data, co | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// used for internal patchbay mode | // used for internal patchbay mode | ||||
void EngineInternalGraph::addPlugin(CarlaPlugin* const plugin) | |||||
void EngineInternalGraph::addPlugin(const CarlaPluginPtr plugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | ||||
fPatchbay->addPlugin(plugin); | fPatchbay->addPlugin(plugin); | ||||
} | } | ||||
void EngineInternalGraph::replacePlugin(CarlaPlugin* const oldPlugin, CarlaPlugin* const newPlugin) | |||||
void EngineInternalGraph::replacePlugin(const CarlaPluginPtr oldPlugin, const CarlaPluginPtr newPlugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | ||||
fPatchbay->replacePlugin(oldPlugin, newPlugin); | fPatchbay->replacePlugin(oldPlugin, newPlugin); | ||||
} | } | ||||
void EngineInternalGraph::renamePlugin(CarlaPlugin* const plugin, const char* const newName) | |||||
void EngineInternalGraph::renamePlugin(const CarlaPluginPtr plugin, const char* const newName) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | ||||
fPatchbay->renamePlugin(plugin, newName); | fPatchbay->renamePlugin(plugin, newName); | ||||
} | } | ||||
void EngineInternalGraph::removePlugin(CarlaPlugin* const plugin) | |||||
void EngineInternalGraph::removePlugin(const CarlaPluginPtr plugin) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fPatchbay != nullptr,); | ||||
fPatchbay->removePlugin(plugin); | fPatchbay->removePlugin(plugin); | ||||
@@ -190,12 +190,12 @@ public: | |||||
void setSampleRate(double sampleRate); | void setSampleRate(double sampleRate); | ||||
void setOffline(bool offline); | void setOffline(bool offline); | ||||
void addPlugin(CarlaPlugin* plugin); | |||||
void replacePlugin(CarlaPlugin* oldPlugin, CarlaPlugin* newPlugin); | |||||
void renamePlugin(CarlaPlugin* plugin, const char* newName); | |||||
void reconfigureForCV(CarlaPlugin* const plugin, const uint portIndex, bool added); | |||||
void reconfigurePlugin(CarlaPlugin* plugin, bool portsAdded); | |||||
void removePlugin(CarlaPlugin* plugin); | |||||
void addPlugin(CarlaPluginPtr plugin); | |||||
void replacePlugin(CarlaPluginPtr oldPlugin, CarlaPluginPtr newPlugin); | |||||
void renamePlugin(CarlaPluginPtr plugin, const char* newName); | |||||
void reconfigureForCV(CarlaPluginPtr plugin, const uint portIndex, bool added); | |||||
void reconfigurePlugin(CarlaPluginPtr plugin, bool portsAdded); | |||||
void removePlugin(CarlaPluginPtr plugin); | |||||
void removeAllPlugins(); | void removeAllPlugins(); | ||||
bool connect(bool external, uint groupA, uint portA, uint groupB, uint portB); | bool connect(bool external, uint groupA, uint portA, uint groupB, uint portB); | ||||
@@ -404,6 +404,7 @@ CarlaEngine::ProtectedData::ProtectedData(CarlaEngine* const engine) noexcept | |||||
xruns(0), | xruns(0), | ||||
dspLoad(0.0f), | dspLoad(0.0f), | ||||
#endif | #endif | ||||
pluginsToDelete(), | |||||
events(), | events(), | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
graph(engine), | graph(engine), | ||||
@@ -416,7 +417,7 @@ CarlaEngine::ProtectedData::ProtectedData(CarlaEngine* const engine) noexcept | |||||
#endif | #endif | ||||
} | } | ||||
CarlaEngine::ProtectedData::~ProtectedData() noexcept | |||||
CarlaEngine::ProtectedData::~ProtectedData() | |||||
{ | { | ||||
CARLA_SAFE_ASSERT(curPluginCount == 0); | CARLA_SAFE_ASSERT(curPluginCount == 0); | ||||
CARLA_SAFE_ASSERT(maxPluginNumber == 0); | CARLA_SAFE_ASSERT(maxPluginNumber == 0); | ||||
@@ -425,6 +426,17 @@ CarlaEngine::ProtectedData::~ProtectedData() noexcept | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CARLA_SAFE_ASSERT(plugins == nullptr); | CARLA_SAFE_ASSERT(plugins == nullptr); | ||||
#endif | #endif | ||||
if (pluginsToDelete.size() != 0) | |||||
{ | |||||
for (std::vector<CarlaPluginPtr>::iterator it = pluginsToDelete.begin(); it != pluginsToDelete.end(); ++it) | |||||
{ | |||||
carla_stderr2("Plugin not yet deleted, name: '%s', usage count: '%u'", | |||||
(*it)->getName(), it->use_count()); | |||||
} | |||||
} | |||||
pluginsToDelete.clear(); | |||||
} | } | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -488,7 +500,6 @@ bool CarlaEngine::ProtectedData::init(const char* const clientName) | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
plugins = new EnginePluginData[maxPluginNumber]; | plugins = new EnginePluginData[maxPluginNumber]; | ||||
carla_zeroStructs(plugins, maxPluginNumber); | |||||
xruns = 0; | xruns = 0; | ||||
dspLoad = 0.0f; | dspLoad = 0.0f; | ||||
#endif | #endif | ||||
@@ -521,6 +532,8 @@ void CarlaEngine::ProtectedData::close() | |||||
maxPluginNumber = 0; | maxPluginNumber = 0; | ||||
nextPluginId = 0; | nextPluginId = 0; | ||||
deletePluginsAsNeeded(); | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
if (plugins != nullptr) | if (plugins != nullptr) | ||||
{ | { | ||||
@@ -550,6 +563,29 @@ void CarlaEngine::ProtectedData::initTime(const char* const features) | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
void CarlaEngine::ProtectedData::deletePluginsAsNeeded() | |||||
{ | |||||
for (bool stop;;) | |||||
{ | |||||
stop = true; | |||||
for (std::vector<CarlaPluginPtr>::iterator it = pluginsToDelete.begin(); it != pluginsToDelete.end(); ++it) | |||||
{ | |||||
if (it->use_count() == 1) | |||||
{ | |||||
stop = false; | |||||
pluginsToDelete.erase(it); | |||||
break; | |||||
} | |||||
} | |||||
if (stop) | |||||
break; | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
void CarlaEngine::ProtectedData::doPluginRemove(const uint pluginId) noexcept | void CarlaEngine::ProtectedData::doPluginRemove(const uint pluginId) noexcept | ||||
{ | { | ||||
@@ -560,17 +596,16 @@ void CarlaEngine::ProtectedData::doPluginRemove(const uint pluginId) noexcept | |||||
// move all plugins 1 spot backwards | // move all plugins 1 spot backwards | ||||
for (uint i=pluginId; i < curPluginCount; ++i) | for (uint i=pluginId; i < curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(plugins[i+1].plugin); | |||||
const CarlaPluginPtr plugin = plugins[i+1].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
plugin->setId(i); | plugin->setId(i); | ||||
plugins[i].plugin = plugin; | plugins[i].plugin = plugin; | ||||
carla_zeroFloats(plugins[i].peaks, 4); | |||||
carla_zeroStruct(plugins[i].peaks); | |||||
} | } | ||||
const uint id(curPluginCount); | |||||
const uint id = curPluginCount; | |||||
// reset last plugin (now removed) | // reset last plugin (now removed) | ||||
plugins[id].plugin = nullptr; | plugins[id].plugin = nullptr; | ||||
@@ -584,10 +619,10 @@ void CarlaEngine::ProtectedData::doPluginsSwitch(const uint idA, const uint idB) | |||||
CARLA_SAFE_ASSERT_RETURN(idA < curPluginCount,); | CARLA_SAFE_ASSERT_RETURN(idA < curPluginCount,); | ||||
CARLA_SAFE_ASSERT_RETURN(idB < curPluginCount,); | CARLA_SAFE_ASSERT_RETURN(idB < curPluginCount,); | ||||
CarlaPlugin* const pluginA(plugins[idA].plugin); | |||||
const CarlaPluginPtr pluginA = plugins[idA].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN(pluginA != nullptr,); | CARLA_SAFE_ASSERT_RETURN(pluginA != nullptr,); | ||||
CarlaPlugin* const pluginB(plugins[idB].plugin); | |||||
const CarlaPluginPtr pluginB = plugins[idB].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN(pluginB != nullptr,); | CARLA_SAFE_ASSERT_RETURN(pluginB != nullptr,); | ||||
pluginA->setId(idB); | pluginA->setId(idB); | ||||
@@ -33,6 +33,8 @@ | |||||
# include "water/memory/Atomic.h" | # include "water/memory/Atomic.h" | ||||
#endif | #endif | ||||
#include <vector> | |||||
// FIXME only use CARLA_PREVENT_HEAP_ALLOCATION for structs | // FIXME only use CARLA_PREVENT_HEAP_ALLOCATION for structs | ||||
// maybe separate macro | // maybe separate macro | ||||
@@ -96,10 +98,10 @@ public: | |||||
void processRack(CarlaEngine::ProtectedData* data, const float* inBuf[2], float* outBuf[2], uint32_t frames); | void processRack(CarlaEngine::ProtectedData* data, const float* inBuf[2], float* outBuf[2], uint32_t frames); | ||||
// used for internal patchbay mode | // used for internal patchbay mode | ||||
void addPlugin(CarlaPlugin* plugin); | |||||
void replacePlugin(CarlaPlugin* oldPlugin, CarlaPlugin* newPlugin); | |||||
void renamePlugin(CarlaPlugin* plugin, const char* newName); | |||||
void removePlugin(CarlaPlugin* plugin); | |||||
void addPlugin(CarlaPluginPtr plugin); | |||||
void replacePlugin(CarlaPluginPtr oldPlugin, CarlaPluginPtr newPlugin); | |||||
void renamePlugin(CarlaPluginPtr plugin, const char* newName); | |||||
void removePlugin(CarlaPluginPtr plugin); | |||||
void removeAllPlugins(); | void removeAllPlugins(); | ||||
bool isUsingExternalHost() const noexcept; | bool isUsingExternalHost() const noexcept; | ||||
@@ -208,8 +210,12 @@ struct EngineNextAction { | |||||
// EnginePluginData | // EnginePluginData | ||||
struct EnginePluginData { | struct EnginePluginData { | ||||
CarlaPlugin* plugin; | |||||
CarlaPluginPtr plugin; | |||||
float peaks[4]; | float peaks[4]; | ||||
EnginePluginData() | |||||
: plugin(nullptr), | |||||
peaks{0.0f, 0.0f, 0.0f, 0.0f} {} | |||||
}; | }; | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -258,6 +264,7 @@ struct CarlaEngine::ProtectedData { | |||||
float dspLoad; | float dspLoad; | ||||
#endif | #endif | ||||
float peaks[4]; | float peaks[4]; | ||||
std::vector<CarlaPluginPtr> pluginsToDelete; | |||||
EngineInternalEvents events; | EngineInternalEvents events; | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
@@ -280,6 +287,10 @@ struct CarlaEngine::ProtectedData { | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
void deletePluginsAsNeeded(); | |||||
// ------------------------------------------------------------------- | |||||
void doPluginRemove(uint pluginId) noexcept; | void doPluginRemove(uint pluginId) noexcept; | ||||
void doPluginsSwitch(uint idA, uint idB) noexcept; | void doPluginsSwitch(uint idA, uint idB) noexcept; | ||||
void doNextPluginAction() noexcept; | void doNextPluginAction() noexcept; | ||||
@@ -745,7 +745,7 @@ public: | |||||
return pData->cvs[ioffset].cvPort; | return pData->cvs[ioffset].cvPort; | ||||
} | } | ||||
void setGraphAndPlugin(PatchbayGraph* const graph, CarlaPlugin* const plugin) noexcept | |||||
void setGraphAndPlugin(PatchbayGraph* const graph, CarlaPluginPtr plugin) noexcept | |||||
{ | { | ||||
pData->graph = graph; | pData->graph = graph; | ||||
pData->plugin = plugin; | pData->plugin = plugin; | ||||
@@ -771,7 +771,7 @@ public: | |||||
CarlaEngineJackClient(const CarlaEngine& engine, | CarlaEngineJackClient(const CarlaEngine& engine, | ||||
EngineInternalGraph& egraph, | EngineInternalGraph& egraph, | ||||
CarlaRecursiveMutex& rmutex, | CarlaRecursiveMutex& rmutex, | ||||
CarlaPlugin* const plugin, | |||||
const CarlaPluginPtr plugin, | |||||
const CarlaString& mainClientName, | const CarlaString& mainClientName, | ||||
jack_client_t* const jackClient) | jack_client_t* const jackClient) | ||||
: CarlaEngineClientForSubclassing(engine, egraph, plugin), | : CarlaEngineClientForSubclassing(engine, egraph, plugin), | ||||
@@ -794,6 +794,7 @@ public: | |||||
fPreRenameConnections(), | fPreRenameConnections(), | ||||
fPreRenamePluginId(), | fPreRenamePluginId(), | ||||
fPreRenamePluginIcon(), | fPreRenamePluginIcon(), | ||||
fReservedPluginPtr(), | |||||
#endif | #endif | ||||
fThreadSafeMetadataMutex(rmutex), | fThreadSafeMetadataMutex(rmutex), | ||||
fMainClientName(mainClientName) | fMainClientName(mainClientName) | ||||
@@ -913,9 +914,9 @@ public: | |||||
#endif | #endif | ||||
} | } | ||||
void deactivate() noexcept override | |||||
void deactivate(const bool willClose) noexcept override | |||||
{ | { | ||||
carla_debug("CarlaEngineJackClient::deactivate()"); | |||||
carla_debug("CarlaEngineJackClient::deactivate(%s)", bool2str(willClose)); | |||||
if (getProcessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | if (getProcessMode() == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | ||||
{ | { | ||||
@@ -926,7 +927,15 @@ public: | |||||
} catch(...) {} | } catch(...) {} | ||||
} | } | ||||
CarlaEngineClient::deactivate(); | |||||
if (willClose) | |||||
{ | |||||
fCVSourcePorts.setGraphAndPlugin(nullptr, nullptr); | |||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||||
fReservedPluginPtr = nullptr; | |||||
#endif | |||||
} | |||||
CarlaEngineClient::deactivate(willClose); | |||||
} | } | ||||
bool isOk() const noexcept override | bool isOk() const noexcept override | ||||
@@ -1071,7 +1080,7 @@ public: | |||||
} | } | ||||
fJackClient = nullptr; | fJackClient = nullptr; | ||||
CarlaEngineClient::deactivate(); | |||||
CarlaEngineClient::deactivate(true); | |||||
} | } | ||||
const char* getJackClientName() const noexcept | const char* getJackClientName() const noexcept | ||||
@@ -1150,6 +1159,11 @@ public: | |||||
fJackClient = newClient; | fJackClient = newClient; | ||||
} | } | ||||
void reservePluginPtr(CarlaPluginPtr* const pluginPtr) | |||||
{ | |||||
fReservedPluginPtr = pluginPtr; | |||||
} | |||||
void setNewPluginId(const uint id) const | void setNewPluginId(const uint id) const | ||||
{ | { | ||||
// NOTE: no fThreadSafeMetadataMutex lock here, assumed done from caller | // NOTE: no fThreadSafeMetadataMutex lock here, assumed done from caller | ||||
@@ -1190,6 +1204,8 @@ private: | |||||
CarlaString fPreRenamePluginId; | CarlaString fPreRenamePluginId; | ||||
CarlaString fPreRenamePluginIcon; | CarlaString fPreRenamePluginIcon; | ||||
CarlaScopedPointer<CarlaPluginPtr> fReservedPluginPtr; | |||||
template<typename T> | template<typename T> | ||||
bool _renamePorts(const LinkedList<T*>& t, const CarlaString& clientNamePrefix) | bool _renamePorts(const LinkedList<T*>& t, const CarlaString& clientNamePrefix) | ||||
{ | { | ||||
@@ -1885,11 +1901,13 @@ public: | |||||
} | } | ||||
#endif | #endif | ||||
CarlaEngineClient* addClient(CarlaPlugin* const plugin) override | |||||
CarlaEngineClient* addClient(CarlaPluginPtr plugin) override | |||||
{ | { | ||||
jack_client_t* client = nullptr; | jack_client_t* client = nullptr; | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
CarlaPluginPtr* pluginReserve = nullptr; | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
client = fClient; | client = fClient; | ||||
@@ -1937,13 +1955,14 @@ public: | |||||
} | } | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pluginReserve = new CarlaPluginPtr(plugin); | |||||
/* | /* | ||||
jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback_plugin, plugin); | |||||
jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback_plugin, plugin); | |||||
jackbridge_set_buffer_size_callback(fClient, carla_jack_bufsize_callback_plugin, pluginReserve); | |||||
jackbridge_set_sample_rate_callback(fClient, carla_jack_srate_callback_plugin, pluginReserve); | |||||
*/ | */ | ||||
jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, plugin); | |||||
jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, plugin); | |||||
jackbridge_on_shutdown(client, carla_jack_shutdown_callback_plugin, plugin); | |||||
jackbridge_set_latency_callback(client, carla_jack_latency_callback_plugin, pluginReserve); | |||||
jackbridge_set_process_callback(client, carla_jack_process_callback_plugin, pluginReserve); | |||||
jackbridge_on_shutdown(client, carla_jack_shutdown_callback_plugin, pluginReserve); | |||||
#else | #else | ||||
fClient = client; | fClient = client; | ||||
pData->bufferSize = jackbridge_get_buffer_size(client); | pData->bufferSize = jackbridge_get_buffer_size(client); | ||||
@@ -1962,7 +1981,16 @@ public: | |||||
} | } | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
return new CarlaEngineJackClient(*this, pData->graph, fThreadSafeMetadataMutex, plugin, fClientName, client); | |||||
CarlaEngineJackClient* const jclient = new CarlaEngineJackClient(*this, | |||||
pData->graph, | |||||
fThreadSafeMetadataMutex, | |||||
plugin, fClientName, client); | |||||
# ifndef BUILD_BRIDGE | |||||
if (pluginReserve != nullptr) | |||||
jclient->reservePluginPtr(pluginReserve); | |||||
# endif | |||||
return jclient; | |||||
#else | #else | ||||
return new CarlaEngineJackClient(*this, fThreadSafeMetadataMutex, fClientName, client); | return new CarlaEngineJackClient(*this, fThreadSafeMetadataMutex, fClientName, client); | ||||
#endif | #endif | ||||
@@ -1978,7 +2006,7 @@ public: | |||||
for (uint i=id; i < pData->curPluginCount; ++i) | for (uint i=id; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin = pData->plugins[i].plugin; | |||||
const CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | ||||
CarlaEngineJackClient* const client = dynamic_cast<CarlaEngineJackClient*>(plugin->getEngineClient()); | CarlaEngineJackClient* const client = dynamic_cast<CarlaEngineJackClient*>(plugin->getEngineClient()); | ||||
@@ -1995,10 +2023,10 @@ public: | |||||
if (! CarlaEngine::switchPlugins(idA, idB)) | if (! CarlaEngine::switchPlugins(idA, idB)) | ||||
return false; | return false; | ||||
CarlaPlugin* const newPluginA(pData->plugins[idA].plugin); | |||||
CarlaPluginPtr newPluginA = pData->plugins[idA].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN(newPluginA != nullptr, true); | CARLA_SAFE_ASSERT_RETURN(newPluginA != nullptr, true); | ||||
CarlaPlugin* const newPluginB(pData->plugins[idB].plugin); | |||||
CarlaPluginPtr newPluginB = pData->plugins[idB].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN(newPluginB != nullptr, true); | CARLA_SAFE_ASSERT_RETURN(newPluginB != nullptr, true); | ||||
CarlaEngineJackClient* const clientA = dynamic_cast<CarlaEngineJackClient*>(newPluginA->getEngineClient()); | CarlaEngineJackClient* const clientA = dynamic_cast<CarlaEngineJackClient*>(newPluginA->getEngineClient()); | ||||
@@ -2029,7 +2057,7 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(id < pData->curPluginCount, false); | CARLA_SAFE_ASSERT_RETURN(id < pData->curPluginCount, false); | ||||
CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0', false); | ||||
CarlaPlugin* const plugin(pData->plugins[id].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[id].plugin; | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to rename"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin != nullptr, "Could not find plugin to rename"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | CARLA_SAFE_ASSERT_RETURN_ERR(plugin->getId() == id, "Invalid engine internal data"); | ||||
@@ -2089,9 +2117,11 @@ public: | |||||
plugin->setEnabled(false); | plugin->setEnabled(false); | ||||
// set new client data | // set new client data | ||||
jackbridge_set_latency_callback(jackClient, carla_jack_latency_callback_plugin, plugin); | |||||
jackbridge_set_process_callback(jackClient, carla_jack_process_callback_plugin, plugin); | |||||
jackbridge_on_shutdown(jackClient, carla_jack_shutdown_callback_plugin, plugin); | |||||
CarlaPluginPtr* const pluginReserve = new CarlaPluginPtr(plugin); | |||||
client->reservePluginPtr(pluginReserve); | |||||
jackbridge_set_latency_callback(jackClient, carla_jack_latency_callback_plugin, pluginReserve); | |||||
jackbridge_set_process_callback(jackClient, carla_jack_process_callback_plugin, pluginReserve); | |||||
jackbridge_on_shutdown(jackClient, carla_jack_shutdown_callback_plugin, pluginReserve); | |||||
// NOTE: jack1 locks up here | // NOTE: jack1 locks up here | ||||
if (jackbridge_get_version_string() != nullptr) | if (jackbridge_get_version_string() != nullptr) | ||||
@@ -2736,7 +2766,7 @@ protected: | |||||
CARLA_SAFE_ASSERT_INT2_RETURN(nframes == pData->bufferSize, nframes, pData->bufferSize,); | CARLA_SAFE_ASSERT_INT2_RETURN(nframes == pData->bufferSize, nframes, pData->bufferSize,); | ||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
CarlaPlugin* const plugin(pData->plugins[0].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[0].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | ||||
{ | { | ||||
@@ -2829,7 +2859,7 @@ protected: | |||||
{ | { | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | ||||
{ | { | ||||
@@ -2943,8 +2973,11 @@ protected: | |||||
// set first byte | // set first byte | ||||
mdataTmp[0] = static_cast<uint8_t>(midiEvent.data[0] | (engineEvent.channel & MIDI_CHANNEL_BIT)); | mdataTmp[0] = static_cast<uint8_t>(midiEvent.data[0] | (engineEvent.channel & MIDI_CHANNEL_BIT)); | ||||
// copy rest | |||||
carla_copy<uint8_t>(mdataTmp+1, midiEvent.data+1, size-1U); | |||||
if (size > 1) | |||||
{ | |||||
// copy rest | |||||
carla_copy<uint8_t>(mdataTmp+1, midiEvent.data+1, size-1U); | |||||
} | |||||
// done | // done | ||||
mdataPtr = mdataTmp; | mdataPtr = mdataTmp; | ||||
@@ -3339,7 +3372,7 @@ protected: | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
if (CarlaPlugin* const plugin = pData->plugins[i].plugin) | |||||
if (CarlaPluginPtr plugin = pData->plugins[i].plugin) | |||||
{ | { | ||||
plugin->tryLock(true); | plugin->tryLock(true); | ||||
@@ -3794,7 +3827,7 @@ private: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes) | |||||
void processPlugin(CarlaPluginPtr& plugin, const uint32_t nframes) | |||||
{ | { | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
CarlaEngineJackClient* const client = (CarlaEngineJackClient*)plugin->getEngineClient(); | CarlaEngineJackClient* const client = (CarlaEngineJackClient*)plugin->getEngineClient(); | ||||
@@ -4230,7 +4263,10 @@ private: | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
static int JACKBRIDGE_API carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg) __attribute__((annotate("realtime"))) | static int JACKBRIDGE_API carla_jack_process_callback_plugin(jack_nframes_t nframes, void* arg) __attribute__((annotate("realtime"))) | ||||
{ | { | ||||
CarlaPlugin* const plugin((CarlaPlugin*)arg); | |||||
CarlaPluginPtr* const pluginPtr = static_cast<CarlaPluginPtr*>(arg); | |||||
CARLA_SAFE_ASSERT_RETURN(pluginPtr != nullptr, 0); | |||||
CarlaPluginPtr plugin = *pluginPtr; | |||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr && plugin->isEnabled(), 0); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr && plugin->isEnabled(), 0); | ||||
CarlaEngineJack* const engine((CarlaEngineJack*)plugin->getEngine()); | CarlaEngineJack* const engine((CarlaEngineJack*)plugin->getEngine()); | ||||
@@ -155,8 +155,9 @@ protected: | |||||
private: | private: | ||||
CarlaEngineNative* const fEngine; | CarlaEngineNative* const fEngine; | ||||
void _updateParamValues(CarlaPlugin* const plugin, const uint32_t pluginId, | |||||
const bool sendCallback, const bool sendPluginHost) const noexcept; | |||||
void _updateParamValues(const CarlaPluginPtr& plugin, | |||||
uint32_t pluginId, | |||||
bool sendCallback, bool sendPluginHost) const noexcept; | |||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineNativeUI) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineNativeUI) | ||||
}; | }; | ||||
@@ -446,7 +447,7 @@ protected: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
void uiServerSendPluginInfo(CarlaPlugin* const plugin) | |||||
void uiServerSendPluginInfo(const CarlaPluginPtr& plugin) | |||||
{ | { | ||||
char tmpBuf[STR_MAX+1]; | char tmpBuf[STR_MAX+1]; | ||||
carla_zeroChars(tmpBuf, STR_MAX+1); | carla_zeroChars(tmpBuf, STR_MAX+1); | ||||
@@ -518,16 +519,18 @@ protected: | |||||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),); | CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),); | ||||
} | } | ||||
std::snprintf(tmpBuf, STR_MAX, "AUDIO_COUNT_%i:%i:%i\n", pluginId, plugin->getAudioInCount(), plugin->getAudioOutCount()); | |||||
std::snprintf(tmpBuf, STR_MAX, "AUDIO_COUNT_%i:%i:%i\n", | |||||
pluginId, plugin->getAudioInCount(), plugin->getAudioOutCount()); | |||||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | ||||
std::snprintf(tmpBuf, STR_MAX, "MIDI_COUNT_%i:%i:%i\n", pluginId, plugin->getMidiInCount(), plugin->getMidiOutCount()); | |||||
std::snprintf(tmpBuf, STR_MAX, "MIDI_COUNT_%i:%i:%i\n", | |||||
pluginId, plugin->getMidiInCount(), plugin->getMidiOutCount()); | |||||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | ||||
fUiServer.flushMessages(); | fUiServer.flushMessages(); | ||||
} | } | ||||
void uiServerSendPluginParameters(CarlaPlugin* const plugin) | |||||
void uiServerSendPluginParameters(const CarlaPluginPtr& plugin) | |||||
{ | { | ||||
char tmpBuf[STR_MAX+1]; | char tmpBuf[STR_MAX+1]; | ||||
carla_zeroChars(tmpBuf, STR_MAX+1); | carla_zeroChars(tmpBuf, STR_MAX+1); | ||||
@@ -617,7 +620,7 @@ protected: | |||||
fUiServer.flushMessages(); | fUiServer.flushMessages(); | ||||
} | } | ||||
void uiServerSendPluginPrograms(CarlaPlugin* const plugin) | |||||
void uiServerSendPluginPrograms(const CarlaPluginPtr& plugin) | |||||
{ | { | ||||
char tmpBuf[STR_MAX+1]; | char tmpBuf[STR_MAX+1]; | ||||
carla_zeroChars(tmpBuf, STR_MAX+1); | carla_zeroChars(tmpBuf, STR_MAX+1); | ||||
@@ -645,7 +648,8 @@ protected: | |||||
fUiServer.flushMessages(); | fUiServer.flushMessages(); | ||||
count = plugin->getMidiProgramCount(); | count = plugin->getMidiProgramCount(); | ||||
std::snprintf(tmpBuf, STR_MAX, "MIDI_PROGRAM_COUNT_%i:%i:%i\n", pluginId, count, plugin->getCurrentMidiProgram()); | |||||
std::snprintf(tmpBuf, STR_MAX, "MIDI_PROGRAM_COUNT_%i:%i:%i\n", | |||||
pluginId, count, plugin->getCurrentMidiProgram()); | |||||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | ||||
for (uint32_t i=0; i<count; ++i) | for (uint32_t i=0; i<count; ++i) | ||||
@@ -665,7 +669,7 @@ protected: | |||||
fUiServer.flushMessages(); | fUiServer.flushMessages(); | ||||
} | } | ||||
void uiServerSendPluginProperties(CarlaPlugin* const plugin) | |||||
void uiServerSendPluginProperties(const CarlaPluginPtr& plugin) | |||||
{ | { | ||||
char tmpBuf[STR_MAX+1]; | char tmpBuf[STR_MAX+1]; | ||||
carla_zeroChars(tmpBuf, STR_MAX+1); | carla_zeroChars(tmpBuf, STR_MAX+1); | ||||
@@ -705,7 +709,7 @@ protected: | |||||
if (! fUiServer.isPipeRunning()) | if (! fUiServer.isPipeRunning()) | ||||
return; | return; | ||||
CarlaPlugin* plugin; | |||||
CarlaPluginPtr plugin; | |||||
switch (action) | switch (action) | ||||
{ | { | ||||
@@ -957,7 +961,7 @@ protected: | |||||
carla_zeroChars(strBufGroupName, STR_MAX+1); | carla_zeroChars(strBufGroupName, STR_MAX+1); | ||||
uint32_t rindex = index; | uint32_t rindex = index; | ||||
if (CarlaPlugin* const plugin = _getPluginForParameterIndex(rindex)) | |||||
if (const CarlaPluginPtr plugin = _getPluginForParameterIndex(rindex)) | |||||
{ | { | ||||
const ParameterData& paramData(plugin->getParameterData(rindex)); | const ParameterData& paramData(plugin->getParameterData(rindex)); | ||||
const ParameterRanges& paramRanges(plugin->getParameterRanges(rindex)); | const ParameterRanges& paramRanges(plugin->getParameterRanges(rindex)); | ||||
@@ -1029,7 +1033,7 @@ protected: | |||||
float getParameterValue(const uint32_t index) const | float getParameterValue(const uint32_t index) const | ||||
{ | { | ||||
uint32_t rindex = index; | uint32_t rindex = index; | ||||
if (CarlaPlugin* const plugin = _getPluginForParameterIndex(rindex)) | |||||
if (const CarlaPluginPtr plugin = _getPluginForParameterIndex(rindex)) | |||||
return plugin->getParameterValue(rindex); | return plugin->getParameterValue(rindex); | ||||
return fParameters[index]; | return fParameters[index]; | ||||
@@ -1041,7 +1045,7 @@ protected: | |||||
void setParameterValue(const uint32_t index, const float value) | void setParameterValue(const uint32_t index, const float value) | ||||
{ | { | ||||
uint32_t rindex = index; | uint32_t rindex = index; | ||||
if (CarlaPlugin* const plugin = _getPluginForParameterIndex(rindex)) | |||||
if (const CarlaPluginPtr plugin = _getPluginForParameterIndex(rindex)) | |||||
plugin->setParameterValueRT(rindex, value, false); | plugin->setParameterValueRT(rindex, value, false); | ||||
fParameters[index] = value; | fParameters[index] = value; | ||||
@@ -1055,7 +1059,7 @@ protected: | |||||
#if 0 | #if 0 | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin == nullptr || ! plugin->isEnabled()) | if (plugin == nullptr || ! plugin->isEnabled()) | ||||
continue; | continue; | ||||
@@ -1072,7 +1076,7 @@ protected: | |||||
#if 0 | #if 0 | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin == nullptr || ! plugin->isEnabled()) | if (plugin == nullptr || ! plugin->isEnabled()) | ||||
continue; | continue; | ||||
@@ -1283,7 +1287,7 @@ protected: | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -1301,7 +1305,7 @@ protected: | |||||
// hide all custom uis | // hide all custom uis | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -1320,7 +1324,7 @@ protected: | |||||
{ | { | ||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
{ | { | ||||
@@ -1365,7 +1369,7 @@ protected: | |||||
void uiSetParameterValue(const uint32_t index, const float value) | void uiSetParameterValue(const uint32_t index, const float value) | ||||
{ | { | ||||
uint32_t rindex = index; | uint32_t rindex = index; | ||||
if (CarlaPlugin* const plugin = _getPluginForParameterIndex(rindex)) | |||||
if (const CarlaPluginPtr plugin = _getPluginForParameterIndex(rindex)) | |||||
{ | { | ||||
if (plugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | if (plugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | ||||
plugin->uiParameterChange(rindex, value); | plugin->uiParameterChange(rindex, value); | ||||
@@ -1436,7 +1440,7 @@ protected: | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
const EnginePluginData& plugData(pData->plugins[i]); | const EnginePluginData& plugData(pData->plugins[i]); | ||||
const CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
const CarlaPluginPtr plugin = pData->plugins[i].plugin; | |||||
std::snprintf(tmpBuf, STR_MAX, "PEAKS_%i\n", i); | std::snprintf(tmpBuf, STR_MAX, "PEAKS_%i\n", i); | ||||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | ||||
@@ -1684,12 +1688,12 @@ private: | |||||
bool fOptionsForced; | bool fOptionsForced; | ||||
CarlaPlugin* _getPluginForParameterIndex(uint32_t& index) const noexcept | |||||
CarlaPluginPtr _getPluginForParameterIndex(uint32_t& index) const noexcept | |||||
{ | { | ||||
if (pData->curPluginCount == 0 || pData->plugins == nullptr) | if (pData->curPluginCount == 0 || pData->plugins == nullptr) | ||||
return nullptr; | return nullptr; | ||||
CarlaPlugin* plugin; | |||||
CarlaPluginPtr plugin; | |||||
for (uint32_t i=0; i<pData->curPluginCount; ++i) | for (uint32_t i=0; i<pData->curPluginCount; ++i) | ||||
{ | { | ||||
@@ -1718,7 +1722,7 @@ private: | |||||
if (pData->curPluginCount == 0 || pluginId >= pData->curPluginCount || pData->plugins == nullptr) | if (pData->curPluginCount == 0 || pluginId >= pData->curPluginCount || pData->plugins == nullptr) | ||||
return false; | return false; | ||||
CarlaPlugin* plugin; | |||||
CarlaPluginPtr plugin; | |||||
for (uint32_t i=0; i<pluginId; ++i) | for (uint32_t i=0; i<pluginId; ++i) | ||||
{ | { | ||||
@@ -1978,7 +1982,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->loadStateFromFile(filename); | plugin->loadStateFromFile(filename); | ||||
_updateParamValues(plugin, pluginId, false, true); | _updateParamValues(plugin, pluginId, false, true); | ||||
@@ -1992,7 +1996,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->saveStateToFile(filename); | plugin->saveStateToFile(filename); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_option") == 0) | else if (std::strcmp(msg, "set_option") == 0) | ||||
@@ -2004,7 +2008,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(option), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(option), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setOption(option, yesNo, false); | plugin->setOption(option, yesNo, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_active") == 0) | else if (std::strcmp(msg, "set_active") == 0) | ||||
@@ -2015,7 +2019,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(onOff), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(onOff), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setActive(onOff, true, false); | plugin->setActive(onOff, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_drywet") == 0) | else if (std::strcmp(msg, "set_drywet") == 0) | ||||
@@ -2026,7 +2030,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setDryWet(value, true, false); | plugin->setDryWet(value, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_volume") == 0) | else if (std::strcmp(msg, "set_volume") == 0) | ||||
@@ -2037,7 +2041,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setVolume(value, true, false); | plugin->setVolume(value, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_balance_left") == 0) | else if (std::strcmp(msg, "set_balance_left") == 0) | ||||
@@ -2048,7 +2052,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setBalanceLeft(value, true, false); | plugin->setBalanceLeft(value, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_balance_right") == 0) | else if (std::strcmp(msg, "set_balance_right") == 0) | ||||
@@ -2059,7 +2063,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setBalanceRight(value, true, false); | plugin->setBalanceRight(value, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_panning") == 0) | else if (std::strcmp(msg, "set_panning") == 0) | ||||
@@ -2070,7 +2074,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setPanning(value, true, false); | plugin->setPanning(value, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_ctrl_channel") == 0) | else if (std::strcmp(msg, "set_ctrl_channel") == 0) | ||||
@@ -2082,7 +2086,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel), true); | ||||
CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS, true); | CARLA_SAFE_ASSERT_RETURN(channel >= -1 && channel < MAX_MIDI_CHANNELS, true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setCtrlChannel(int8_t(channel), true, false); | plugin->setCtrlChannel(int8_t(channel), true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_parameter_value") == 0) | else if (std::strcmp(msg, "set_parameter_value") == 0) | ||||
@@ -2094,7 +2098,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->setParameterValue(parameterId, value, true, true, false); | plugin->setParameterValue(parameterId, value, true, true, false); | ||||
fEngine->setParameterValueFromUI(pluginId, parameterId, value); | fEngine->setParameterValueFromUI(pluginId, parameterId, value); | ||||
@@ -2109,7 +2113,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(channel), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(channel), true); | ||||
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, true); | CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS, true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setParameterMidiChannel(parameterId, static_cast<uint8_t>(channel), true, false); | plugin->setParameterMidiChannel(parameterId, static_cast<uint8_t>(channel), true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_parameter_mapped_control_index") == 0) | else if (std::strcmp(msg, "set_parameter_mapped_control_index") == 0) | ||||
@@ -2122,7 +2126,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(ctrl), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(ctrl), true); | ||||
CARLA_SAFE_ASSERT_RETURN(ctrl >= CONTROL_INDEX_NONE && ctrl <= CONTROL_INDEX_MAX_ALLOWED, true); | CARLA_SAFE_ASSERT_RETURN(ctrl >= CONTROL_INDEX_NONE && ctrl <= CONTROL_INDEX_MAX_ALLOWED, true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setParameterMappedControlIndex(parameterId, static_cast<int16_t>(ctrl), true, false); | plugin->setParameterMappedControlIndex(parameterId, static_cast<int16_t>(ctrl), true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_parameter_mapped_range") == 0) | else if (std::strcmp(msg, "set_parameter_mapped_range") == 0) | ||||
@@ -2135,7 +2139,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(minimum), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(minimum), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(maximum), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(maximum), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setParameterMappedRange(parameterId, minimum, maximum, true, false); | plugin->setParameterMappedRange(parameterId, minimum, maximum, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "set_parameter_touch") == 0) | else if (std::strcmp(msg, "set_parameter_touch") == 0) | ||||
@@ -2158,7 +2162,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->setProgram(index, true, true, false); | plugin->setProgram(index, true, true, false); | ||||
_updateParamValues(plugin, pluginId, true, true); | _updateParamValues(plugin, pluginId, true, true); | ||||
@@ -2172,7 +2176,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->setMidiProgram(index, true, true, false); | plugin->setMidiProgram(index, true, true, false); | ||||
_updateParamValues(plugin, pluginId, true, true); | _updateParamValues(plugin, pluginId, true, true); | ||||
@@ -2190,7 +2194,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key, true), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key, true), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value, false), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value, false), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->setCustomData(type, key, value, true); | plugin->setCustomData(type, key, value, true); | ||||
delete[] type; | delete[] type; | ||||
@@ -2204,7 +2208,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(cdata, false), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(cdata, false), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
std::vector<uint8_t> chunk(carla_getChunkFromBase64String(cdata)); | std::vector<uint8_t> chunk(carla_getChunkFromBase64String(cdata)); | ||||
#ifdef CARLA_PROPER_CPP11_SUPPORT | #ifdef CARLA_PROPER_CPP11_SUPPORT | ||||
@@ -2221,7 +2225,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->prepareForSave(); | plugin->prepareForSave(); | ||||
} | } | ||||
else if (std::strcmp(msg, "reset_parameters") == 0) | else if (std::strcmp(msg, "reset_parameters") == 0) | ||||
@@ -2230,7 +2234,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->resetParameters(); | plugin->resetParameters(); | ||||
_updateParamValues(plugin, pluginId, false, true); | _updateParamValues(plugin, pluginId, false, true); | ||||
@@ -2242,7 +2246,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
{ | { | ||||
plugin->randomizeParameters(); | plugin->randomizeParameters(); | ||||
_updateParamValues(plugin, pluginId, false, true); | _updateParamValues(plugin, pluginId, false, true); | ||||
@@ -2260,7 +2264,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_VALUE, true); | CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_VALUE, true); | ||||
CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE, true); | CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE, true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->sendMidiSingleNote(static_cast<uint8_t>(channel), static_cast<uint8_t>(note), static_cast<uint8_t>(velocity), true, true, false); | plugin->sendMidiSingleNote(static_cast<uint8_t>(channel), static_cast<uint8_t>(note), static_cast<uint8_t>(velocity), true, true, false); | ||||
} | } | ||||
else if (std::strcmp(msg, "show_custom_ui") == 0) | else if (std::strcmp(msg, "show_custom_ui") == 0) | ||||
@@ -2271,7 +2275,7 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); | ||||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | ||||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||||
if (const CarlaPluginPtr plugin = fEngine->getPlugin(pluginId)) | |||||
plugin->showCustomUI(yesNo); | plugin->showCustomUI(yesNo); | ||||
} | } | ||||
else | else | ||||
@@ -2291,7 +2295,8 @@ bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept | |||||
return true; | return true; | ||||
} | } | ||||
void CarlaEngineNativeUI::_updateParamValues(CarlaPlugin* const plugin, const uint32_t pluginId, | |||||
void CarlaEngineNativeUI::_updateParamValues(const CarlaPluginPtr& plugin, | |||||
const uint32_t pluginId, | |||||
const bool sendCallback, const bool sendPluginHost) const noexcept | const bool sendCallback, const bool sendPluginHost) const noexcept | ||||
{ | { | ||||
float value; | float value; | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin Host | * Carla Plugin Host | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin Host | * Carla Plugin Host | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -27,7 +27,10 @@ | |||||
#include "CarlaOscUtils.hpp" | #include "CarlaOscUtils.hpp" | ||||
#include "CarlaString.hpp" | #include "CarlaString.hpp" | ||||
#define CARLA_ENGINE_OSC_HANDLE_ARGS CarlaPlugin* const plugin, const int argc, const lo_arg* const* const argv, const char* const types | |||||
#include <memory> | |||||
#define CARLA_ENGINE_OSC_HANDLE_ARGS const CarlaPluginPtr& plugin, \ | |||||
const int argc, const lo_arg* const* const argv, const char* const types | |||||
#define CARLA_ENGINE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \ | #define CARLA_ENGINE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \ | ||||
/* check argument count */ \ | /* check argument count */ \ | ||||
@@ -54,6 +57,8 @@ | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
typedef std::shared_ptr<CarlaPlugin> CarlaPluginPtr; | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
class CarlaEngineOsc | class CarlaEngineOsc | ||||
@@ -96,15 +101,15 @@ public: | |||||
void sendCallback(EngineCallbackOpcode action, uint pluginId, | void sendCallback(EngineCallbackOpcode action, uint pluginId, | ||||
int value1, int value2, int value3, | int value1, int value2, int value3, | ||||
float valuef, const char* valueStr) const noexcept; | float valuef, const char* valueStr) const noexcept; | ||||
void sendPluginInfo(const CarlaPlugin* plugin) const noexcept; | |||||
void sendPluginPortCount(const CarlaPlugin* plugin) const noexcept; | |||||
void sendPluginParameterInfo(const CarlaPlugin* plugin, uint32_t index) const noexcept; | |||||
void sendPluginDataCount(const CarlaPlugin* plugin) const noexcept; | |||||
void sendPluginProgramCount(const CarlaPlugin* plugin) const noexcept; | |||||
void sendPluginProgram(const CarlaPlugin* plugin, uint32_t index) const noexcept; | |||||
void sendPluginMidiProgram(const CarlaPlugin* plugin, uint32_t index) const noexcept; | |||||
void sendPluginCustomData(const CarlaPlugin* plugin, uint32_t index) const noexcept; | |||||
void sendPluginInternalParameterValues(const CarlaPlugin* plugin) const noexcept; | |||||
void sendPluginInfo(const CarlaPluginPtr& plugin) const noexcept; | |||||
void sendPluginPortCount(const CarlaPluginPtr& plugin) const noexcept; | |||||
void sendPluginParameterInfo(const CarlaPluginPtr& plugin, uint32_t index) const noexcept; | |||||
void sendPluginDataCount(const CarlaPluginPtr& plugin) const noexcept; | |||||
void sendPluginProgramCount(const CarlaPluginPtr& plugin) const noexcept; | |||||
void sendPluginProgram(const CarlaPluginPtr& plugin, uint32_t index) const noexcept; | |||||
void sendPluginMidiProgram(const CarlaPluginPtr& plugin, uint32_t index) const noexcept; | |||||
void sendPluginCustomData(const CarlaPluginPtr& plugin, uint32_t index) const noexcept; | |||||
void sendPluginInternalParameterValues(const CarlaPluginPtr& plugin) const noexcept; | |||||
void sendPing() const noexcept; | void sendPing() const noexcept; | ||||
void sendResponse(int messageId, const char* error) const noexcept; | void sendResponse(int messageId, const char* error) const noexcept; | ||||
void sendExit() const noexcept; | void sendExit() const noexcept; | ||||
@@ -122,7 +122,7 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons | |||||
} | } | ||||
// Get plugin | // Get plugin | ||||
CarlaPlugin* const plugin(fEngine->getPluginUnchecked(pluginId)); | |||||
const CarlaPluginPtr plugin = fEngine->getPluginUnchecked(pluginId); | |||||
if (plugin == nullptr || plugin->getId() != pluginId) | if (plugin == nullptr || plugin->getId() != pluginId) | ||||
{ | { | ||||
@@ -239,7 +239,7 @@ int CarlaEngineOsc::handleMsgRegister(const bool isTCP, | |||||
for (uint i=0, count=fEngine->getCurrentPluginCount(); i < count; ++i) | for (uint i=0, count=fEngine->getCurrentPluginCount(); i < count; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(fEngine->getPluginUnchecked(i)); | |||||
const CarlaPluginPtr plugin = fEngine->getPluginUnchecked(i); | |||||
CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr); | ||||
fEngine->callback(false, true, ENGINE_CALLBACK_PLUGIN_ADDED, i, 0, 0, 0, 0.0f, plugin->getName()); | fEngine->callback(false, true, ENGINE_CALLBACK_PLUGIN_ADDED, i, 0, 0, 0, 0.0f, plugin->getName()); | ||||
@@ -47,7 +47,7 @@ void CarlaEngineOsc::sendCallback(const EngineCallbackOpcode action, const uint | |||||
valueStr != nullptr ? valueStr : kNullString); | valueStr != nullptr ? valueStr : kNullString); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginInfo(const CarlaPlugin* const plugin) const noexcept | |||||
void CarlaEngineOsc::sendPluginInfo(const CarlaPluginPtr& plugin) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
@@ -95,7 +95,7 @@ void CarlaEngineOsc::sendPluginInfo(const CarlaPlugin* const plugin) const noexc | |||||
bufRealName, bufLabel, bufMaker, bufCopyright); | bufRealName, bufLabel, bufMaker, bufCopyright); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginPortCount(const CarlaPlugin* const plugin) const noexcept | |||||
void CarlaEngineOsc::sendPluginPortCount(const CarlaPluginPtr& plugin) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
@@ -124,12 +124,12 @@ void CarlaEngineOsc::sendPluginPortCount(const CarlaPlugin* const plugin) const | |||||
static_cast<int32_t>(plugin->getParameterCount())); | static_cast<int32_t>(plugin->getParameterCount())); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginParameterInfo(const CarlaPlugin* const plugin, const uint32_t index) const noexcept | |||||
void CarlaEngineOsc::sendPluginParameterInfo(const CarlaPluginPtr& plugin, const uint32_t index) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | CARLA_SAFE_ASSERT_RETURN(plugin != nullptr,); | ||||
carla_debug("CarlaEngineOsc::sendPluginParameterInfo(%p, %u)", plugin, index); | |||||
carla_debug("CarlaEngineOsc::sendPluginParameterInfo(%p, %u)", plugin.get(), index); | |||||
char bufName[STR_MAX+1], bufUnit[STR_MAX+1], bufComment[STR_MAX+1], bufGroupName[STR_MAX+1]; | char bufName[STR_MAX+1], bufUnit[STR_MAX+1], bufComment[STR_MAX+1], bufGroupName[STR_MAX+1]; | ||||
carla_zeroChars(bufName, STR_MAX+1); | carla_zeroChars(bufName, STR_MAX+1); | ||||
@@ -190,7 +190,7 @@ void CarlaEngineOsc::sendPluginParameterInfo(const CarlaPlugin* const plugin, co | |||||
static_cast<double>(paramRanges.stepLarge)); | static_cast<double>(paramRanges.stepLarge)); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginDataCount(const CarlaPlugin* const plugin) const noexcept | |||||
void CarlaEngineOsc::sendPluginDataCount(const CarlaPluginPtr& plugin) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
@@ -209,7 +209,7 @@ void CarlaEngineOsc::sendPluginDataCount(const CarlaPlugin* const plugin) const | |||||
static_cast<int32_t>(plugin->getCurrentMidiProgram())); | static_cast<int32_t>(plugin->getCurrentMidiProgram())); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginProgramCount(const CarlaPlugin* const plugin) const noexcept | |||||
void CarlaEngineOsc::sendPluginProgramCount(const CarlaPluginPtr& plugin) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
@@ -225,11 +225,11 @@ void CarlaEngineOsc::sendPluginProgramCount(const CarlaPlugin* const plugin) con | |||||
static_cast<int32_t>(plugin->getMidiProgramCount())); | static_cast<int32_t>(plugin->getMidiProgramCount())); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginProgram(const CarlaPlugin* const plugin, const uint32_t index) const noexcept | |||||
void CarlaEngineOsc::sendPluginProgram(const CarlaPluginPtr& plugin, const uint32_t index) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
carla_stdout("CarlaEngineOsc::sendPluginProgram(%p, %u)", plugin, index); | |||||
carla_stdout("CarlaEngineOsc::sendPluginProgram(%p, %u)", plugin.get(), index); | |||||
char strBuf[STR_MAX+1]; | char strBuf[STR_MAX+1]; | ||||
carla_zeroChars(strBuf, STR_MAX+1); | carla_zeroChars(strBuf, STR_MAX+1); | ||||
@@ -243,11 +243,11 @@ void CarlaEngineOsc::sendPluginProgram(const CarlaPlugin* const plugin, const ui | |||||
static_cast<int32_t>(plugin->getId()), static_cast<int32_t>(index), strBuf); | static_cast<int32_t>(plugin->getId()), static_cast<int32_t>(index), strBuf); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginMidiProgram(const CarlaPlugin* const plugin, const uint32_t index) const noexcept | |||||
void CarlaEngineOsc::sendPluginMidiProgram(const CarlaPluginPtr& plugin, const uint32_t index) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
carla_stdout("CarlaEngineOsc::sendPluginProgram(%p, %u)", plugin, index); | |||||
carla_stdout("CarlaEngineOsc::sendPluginProgram(%p, %u)", plugin.get(), index); | |||||
const MidiProgramData& mpdata(plugin->getMidiProgramData(index)); | const MidiProgramData& mpdata(plugin->getMidiProgramData(index)); | ||||
CARLA_SAFE_ASSERT_RETURN(mpdata.name != nullptr,); | CARLA_SAFE_ASSERT_RETURN(mpdata.name != nullptr,); | ||||
@@ -261,11 +261,11 @@ void CarlaEngineOsc::sendPluginMidiProgram(const CarlaPlugin* const plugin, cons | |||||
static_cast<int32_t>(mpdata.bank), static_cast<int32_t>(mpdata.program), mpdata.name); | static_cast<int32_t>(mpdata.bank), static_cast<int32_t>(mpdata.program), mpdata.name); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginCustomData(const CarlaPlugin* const plugin, const uint32_t index) const noexcept | |||||
void CarlaEngineOsc::sendPluginCustomData(const CarlaPluginPtr& plugin, const uint32_t index) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
carla_stdout("CarlaEngineOsc::sendPluginCustomData(%p, %u)", plugin, index); | |||||
carla_stdout("CarlaEngineOsc::sendPluginCustomData(%p, %u)", plugin.get(), index); | |||||
const CustomData& cdata(plugin->getCustomData(index)); | const CustomData& cdata(plugin->getCustomData(index)); | ||||
CARLA_SAFE_ASSERT_RETURN(cdata.isValid(),); | CARLA_SAFE_ASSERT_RETURN(cdata.isValid(),); | ||||
@@ -279,7 +279,7 @@ void CarlaEngineOsc::sendPluginCustomData(const CarlaPlugin* const plugin, const | |||||
cdata.type, cdata.key, cdata.value); | cdata.type, cdata.key, cdata.value); | ||||
} | } | ||||
void CarlaEngineOsc::sendPluginInternalParameterValues(const CarlaPlugin* const plugin) const noexcept | |||||
void CarlaEngineOsc::sendPluginInternalParameterValues(const CarlaPluginPtr& plugin) const noexcept | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.path != nullptr && fControlDataTCP.path[0] != '\0',); | ||||
CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fControlDataTCP.target != nullptr,); | ||||
@@ -36,7 +36,7 @@ struct CarlaEngineCVSourcePorts::ProtectedData { | |||||
CarlaRecursiveMutex rmutex; | CarlaRecursiveMutex rmutex; | ||||
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | ||||
PatchbayGraph* graph; | PatchbayGraph* graph; | ||||
CarlaPlugin* plugin; | |||||
CarlaPluginPtr plugin; | |||||
#endif | #endif | ||||
water::Array<CarlaEngineEventCV> cvs; | water::Array<CarlaEngineEventCV> cvs; | ||||
@@ -76,7 +76,7 @@ public: | |||||
CarlaEngineCVSourcePortsForStandalone() : CarlaEngineCVSourcePorts() {} | CarlaEngineCVSourcePortsForStandalone() : CarlaEngineCVSourcePorts() {} | ||||
~CarlaEngineCVSourcePortsForStandalone() override {} | ~CarlaEngineCVSourcePortsForStandalone() override {} | ||||
inline void setGraphAndPlugin(PatchbayGraph* const graph, CarlaPlugin* const plugin) noexcept | |||||
inline void setGraphAndPlugin(PatchbayGraph* const graph, const CarlaPluginPtr plugin) noexcept | |||||
{ | { | ||||
pData->graph = graph; | pData->graph = graph; | ||||
pData->plugin = plugin; | pData->plugin = plugin; | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin Host | * Carla Plugin Host | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -73,7 +73,7 @@ void CarlaEngineThread::run() noexcept | |||||
for (uint i=0, count = kEngine->getCurrentPluginCount(); i < count; ++i) | for (uint i=0, count = kEngine->getCurrentPluginCount(); i < count; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(kEngine->getPluginUnchecked(i)); | |||||
const CarlaPluginPtr plugin = kEngine->getPluginUnchecked(i); | |||||
CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr && plugin->isEnabled()); | CARLA_SAFE_ASSERT_CONTINUE(plugin != nullptr && plugin->isEnabled()); | ||||
CARLA_SAFE_ASSERT_UINT2(i == plugin->getId(), i, plugin->getId()); | CARLA_SAFE_ASSERT_UINT2(i == plugin->getId(), i, plugin->getId()); | ||||
@@ -2547,6 +2547,15 @@ void CarlaPlugin::restoreLV2State() noexcept | |||||
carla_stderr2("Warning: restoreLV2State() called for non-implemented type"); | carla_stderr2("Warning: restoreLV2State() called for non-implemented type"); | ||||
} | } | ||||
void CarlaPlugin::prepareForDeletion() noexcept | |||||
{ | |||||
carla_debug("CarlaPlugin::prepareForDeletion"); | |||||
const CarlaMutexLocker cml(pData->masterMutex); | |||||
pData->client->deactivate(true); | |||||
} | |||||
void CarlaPlugin::waitForBridgeSaveSignal() noexcept | void CarlaPlugin::waitForBridgeSaveSignal() noexcept | ||||
{ | { | ||||
} | } | ||||
@@ -2571,7 +2580,7 @@ CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin) noexcept | |||||
plugin->pData->enabled = false; | plugin->pData->enabled = false; | ||||
if (plugin->pData->client->isActive()) | if (plugin->pData->client->isActive()) | ||||
plugin->pData->client->deactivate(); | |||||
plugin->pData->client->deactivate(false); | |||||
} | } | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla AU Plugin | * Carla AU Plugin | ||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2014-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -23,9 +23,10 @@ CARLA_BACKEND_START_NAMESPACE | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newAU(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newAU(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId); | |||||
carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", | |||||
init.engine, init.filename, init.name, init.label, init.uniqueId); | |||||
#if defined(CARLA_OS_MAC) | #if defined(CARLA_OS_MAC) | ||||
return newJuce(init, "AU"); | return newJuce(init, "AU"); | ||||
@@ -424,7 +424,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -2469,7 +2469,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool init(const char* const filename, | |||||
bool init(CarlaPluginPtr plugin, | |||||
const char* const filename, | |||||
const char* const name, | const char* const name, | ||||
const char* const label, | const char* const label, | ||||
const int64_t uniqueId, | const int64_t uniqueId, | ||||
@@ -2600,7 +2601,7 @@ public: | |||||
pData->name = pData->engine->getUniquePluginName("unknown"); | pData->name = pData->engine->getUniquePluginName("unknown"); | ||||
} | } | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -3047,9 +3048,12 @@ CARLA_BACKEND_END_NAMESPACE | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
CarlaPlugin* CarlaPlugin::newBridge(const Initializer& init, BinaryType btype, PluginType ptype, const char* bridgeBinary) | |||||
CarlaPluginPtr CarlaPlugin::newBridge(const Initializer& init, | |||||
BinaryType btype, PluginType ptype, const char* bridgeBinary) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newBridge({%p, \"%s\", \"%s\", \"%s\"}, %s, %s, \"%s\")", init.engine, init.filename, init.name, init.label, BinaryType2Str(btype), PluginType2Str(ptype), bridgeBinary); | |||||
carla_debug("CarlaPlugin::newBridge({%p, \"%s\", \"%s\", \"%s\"}, %s, %s, \"%s\")", | |||||
init.engine, init.filename, init.name, init.label, | |||||
BinaryType2Str(btype), PluginType2Str(ptype), bridgeBinary); | |||||
if (bridgeBinary == nullptr || bridgeBinary[0] == '\0') | if (bridgeBinary == nullptr || bridgeBinary[0] == '\0') | ||||
{ | { | ||||
@@ -3063,13 +3067,10 @@ CarlaPlugin* CarlaPlugin::newBridge(const Initializer& init, BinaryType btype, P | |||||
++bridgeBinary; | ++bridgeBinary; | ||||
#endif | #endif | ||||
CarlaPluginBridge* const plugin(new CarlaPluginBridge(init.engine, init.id, btype, ptype)); | |||||
std::shared_ptr<CarlaPluginBridge> plugin(new CarlaPluginBridge(init.engine, init.id, btype, ptype)); | |||||
if (! plugin->init(init.filename, init.name, init.label, init.uniqueId, init.options, bridgeBinary)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.label, init.uniqueId, init.options, bridgeBinary)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
@@ -118,7 +118,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -1655,7 +1655,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool init(const char* const filename, const char* const name, const char* const label, const uint options) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* const name, const char* const label, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -1723,7 +1724,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -1872,7 +1873,7 @@ CARLA_BACKEND_START_NAMESPACE | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, PluginType ptype, bool use16Outs) | |||||
CarlaPluginPtr CarlaPlugin::newFluidSynth(const Initializer& init, PluginType ptype, bool use16Outs) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", | carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", | ||||
init.engine, init.filename, init.name, init.label, init.uniqueId, bool2str(use16Outs)); | init.engine, init.filename, init.name, init.label, init.uniqueId, bool2str(use16Outs)); | ||||
@@ -1899,13 +1900,10 @@ CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, PluginType ptyp | |||||
} | } | ||||
#endif | #endif | ||||
CarlaPluginFluidSynth* const plugin(new CarlaPluginFluidSynth(init.engine, init.id, use16Outs)); | |||||
std::shared_ptr<CarlaPluginFluidSynth> plugin(new CarlaPluginFluidSynth(init.engine, init.id, use16Outs)); | |||||
if (! plugin->init(init.filename, init.name, init.label, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.label, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
#else | #else | ||||
@@ -722,7 +722,7 @@ CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||||
{ | { | ||||
// must not happen | // must not happen | ||||
carla_safe_assert("client->isActive()", __FILE__, __LINE__); | carla_safe_assert("client->isActive()", __FILE__, __LINE__); | ||||
client->deactivate(); | |||||
client->deactivate(true); | |||||
} | } | ||||
clearBuffers(); | clearBuffers(); | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin JACK | * Carla Plugin JACK | ||||
* Copyright (C) 2016-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2016-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -504,7 +504,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -1514,7 +1514,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool init(const char* const filename, const char* const name, const char* const label) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* const name, const char* const label) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -1657,7 +1658,7 @@ public: | |||||
if (pData->name == nullptr) | if (pData->name == nullptr) | ||||
pData->name = pData->engine->getUniquePluginName("unknown"); | pData->name = pData->engine->getUniquePluginName("unknown"); | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -1922,18 +1923,15 @@ CARLA_BACKEND_END_NAMESPACE | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
CarlaPlugin* CarlaPlugin::newJackApp(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newJackApp(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newJackApp({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label); | carla_debug("CarlaPlugin::newJackApp({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label); | ||||
#ifdef CARLA_OS_LINUX | #ifdef CARLA_OS_LINUX | ||||
CarlaPluginJack* const plugin(new CarlaPluginJack(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginJack> plugin(new CarlaPluginJack(init.engine, init.id)); | |||||
if (! plugin->init(init.filename, init.name, init.label)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.label)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
#else | #else | ||||
@@ -89,7 +89,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -1248,7 +1248,9 @@ protected: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
public: | public: | ||||
bool init(const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const uint options, const char* const format) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* const name, const char* const label, | |||||
const int64_t uniqueId, const uint options, const char* const format) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -1386,7 +1388,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -1482,18 +1484,16 @@ CARLA_BACKEND_END_NAMESPACE | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init, const char* const format) | |||||
CarlaPluginPtr CarlaPlugin::newJuce(const Initializer& init, const char* const format) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", init.engine, init.filename, init.name, init.label, init.uniqueId, format); | |||||
carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", | |||||
init.engine, init.filename, init.name, init.label, init.uniqueId, format); | |||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||
CarlaPluginJuce* const plugin(new CarlaPluginJuce(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginJuce> plugin(new CarlaPluginJuce(init.engine, init.id)); | |||||
if (! plugin->init(init.filename, init.name, init.label, init.uniqueId, init.options, format)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.label, init.uniqueId, init.options, format)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
#else | #else | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Plugin, LADSPA/DSSI implementation | * Carla Plugin, LADSPA/DSSI implementation | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -326,7 +326,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -2657,7 +2657,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool initLADSPA(const char* const filename, const char* name, const char* const label, const uint options, | |||||
bool initLADSPA(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* name, const char* const label, const uint options, | |||||
const LADSPA_RDF_Descriptor* const rdfDescriptor) | const LADSPA_RDF_Descriptor* const rdfDescriptor) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -2740,10 +2741,11 @@ public: | |||||
return false; | return false; | ||||
} | } | ||||
return init2(filename, name, options, rdfDescriptor); | |||||
return init2(plugin, filename, name, options, rdfDescriptor); | |||||
} | } | ||||
bool initDSSI(const char* const filename, const char* name, const char* const label, const uint options) | |||||
bool initDSSI(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* name, const char* const label, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -2845,10 +2847,11 @@ public: | |||||
return false; | return false; | ||||
} | } | ||||
return init2(filename, name, options, nullptr); | |||||
return init2(plugin, filename, name, options, nullptr); | |||||
} | } | ||||
bool init2(const char* const filename, const char* name, const uint options, | |||||
bool init2(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* name, const uint options, | |||||
const LADSPA_RDF_Descriptor* const rdfDescriptor) | const LADSPA_RDF_Descriptor* const rdfDescriptor) | ||||
{ | { | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -2885,7 +2888,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -3126,34 +3129,28 @@ private: | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* const rdfDescriptor) | |||||
CarlaPluginPtr CarlaPlugin::newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* const rdfDescriptor) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newLADSPA({%p, \"%s\", \"%s\", \"%s\", " P_INT64 ", %x}, %p)", | carla_debug("CarlaPlugin::newLADSPA({%p, \"%s\", \"%s\", \"%s\", " P_INT64 ", %x}, %p)", | ||||
init.engine, init.filename, init.name, init.label, init.uniqueId, init.options, rdfDescriptor); | init.engine, init.filename, init.name, init.label, init.uniqueId, init.options, rdfDescriptor); | ||||
CarlaPluginLADSPADSSI* const plugin(new CarlaPluginLADSPADSSI(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginLADSPADSSI> plugin(new CarlaPluginLADSPADSSI(init.engine, init.id)); | |||||
if (! plugin->initLADSPA(init.filename, init.name, init.label, init.options, rdfDescriptor)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->initLADSPA(plugin, init.filename, init.name, init.label, init.options, rdfDescriptor)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
CarlaPlugin* CarlaPlugin::newDSSI(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newDSSI(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newDSSI({%p, \"%s\", \"%s\", \"%s\", " P_INT64 ", %x})", | carla_debug("CarlaPlugin::newDSSI({%p, \"%s\", \"%s\", \"%s\", " P_INT64 ", %x})", | ||||
init.engine, init.filename, init.name, init.label, init.uniqueId, init.options); | init.engine, init.filename, init.name, init.label, init.uniqueId, init.options); | ||||
CarlaPluginLADSPADSSI* const plugin(new CarlaPluginLADSPADSSI(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginLADSPADSSI> plugin(new CarlaPluginLADSPADSSI(init.engine, init.id)); | |||||
if (! plugin->initDSSI(init.filename, init.name, init.label, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->initDSSI(plugin, init.filename, init.name, init.label, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla LV2 Plugin | * Carla LV2 Plugin | ||||
* Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -683,7 +683,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -5321,7 +5321,7 @@ public: | |||||
fInlineDisplayNeedsRedraw = true; | fInlineDisplayNeedsRedraw = true; | ||||
} | } | ||||
const LV2_Inline_Display_Image_Surface* renderInlineDisplay(const uint32_t width, const uint32_t height) | |||||
const LV2_Inline_Display_Image_Surface* renderInlineDisplay(const uint32_t width, const uint32_t height) const | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fExt.inlineDisplay != nullptr && fExt.inlineDisplay->render != nullptr, nullptr); | CARLA_SAFE_ASSERT_RETURN(fExt.inlineDisplay != nullptr && fExt.inlineDisplay->render != nullptr, nullptr); | ||||
CARLA_SAFE_ASSERT_RETURN(width > 0, nullptr); | CARLA_SAFE_ASSERT_RETURN(width > 0, nullptr); | ||||
@@ -5640,7 +5640,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
public: | public: | ||||
bool init(const char* const name, const char* const uri, const uint options) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const name, const char* const uri, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -5828,7 +5829,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -7380,27 +7381,25 @@ bool CarlaPipeServerLV2::msgReceived(const char* const msg) noexcept | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newLV2(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newLV2(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newLV2({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.name, init.label, init.uniqueId); | |||||
carla_debug("CarlaPlugin::newLV2({%p, \"%s\", \"%s\", " P_INT64 "})", | |||||
init.engine, init.name, init.label, init.uniqueId); | |||||
CarlaPluginLV2* const plugin(new CarlaPluginLV2(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginLV2> plugin(new CarlaPluginLV2(init.engine, init.id)); | |||||
if (! plugin->init(init.name, init.label, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.name, init.label, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
// used in CarlaStandalone.cpp | // used in CarlaStandalone.cpp | ||||
const void* carla_render_inline_display_lv2(CarlaPlugin* plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_lv2(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_lv2(CarlaPlugin* plugin, uint32_t width, uint32_t height) | |||||
const void* carla_render_inline_display_lv2(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height) | |||||
{ | { | ||||
CarlaPluginLV2* const lv2Plugin = (CarlaPluginLV2*)plugin; | |||||
const std::shared_ptr<CarlaPluginLV2>& lv2Plugin((const std::shared_ptr<CarlaPluginLV2>&)plugin); | |||||
return lv2Plugin->renderInlineDisplay(width, height); | return lv2Plugin->renderInlineDisplay(width, height); | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Native Plugin | * Carla Native Plugin | ||||
* Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -312,7 +312,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
CARLA_ASSERT(! fIsProcessing); | CARLA_ASSERT(! fIsProcessing); | ||||
@@ -2620,7 +2620,7 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
const NativeInlineDisplayImageSurface* renderInlineDisplay(const uint32_t width, const uint32_t height) | |||||
const NativeInlineDisplayImageSurface* renderInlineDisplay(const uint32_t width, const uint32_t height) const | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->hints & NATIVE_PLUGIN_HAS_INLINE_DISPLAY, nullptr); | CARLA_SAFE_ASSERT_RETURN(fDescriptor->hints & NATIVE_PLUGIN_HAS_INLINE_DISPLAY, nullptr); | ||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->render_inline_display, nullptr); | CARLA_SAFE_ASSERT_RETURN(fDescriptor->render_inline_display, nullptr); | ||||
@@ -2774,7 +2774,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool init(const char* const name, const char* const label, const uint options) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const name, const char* const label, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -2859,7 +2860,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -3037,27 +3038,25 @@ private: | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newNative(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newNative(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newNative({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId); | |||||
carla_debug("CarlaPlugin::newNative({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", | |||||
init.engine, init.filename, init.name, init.label, init.uniqueId); | |||||
CarlaPluginNative* const plugin(new CarlaPluginNative(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginNative> plugin(new CarlaPluginNative(init.engine, init.id)); | |||||
if (! plugin->init(init.name, init.label, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.name, init.label, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
// used in CarlaStandalone.cpp | // used in CarlaStandalone.cpp | ||||
const void* carla_render_inline_display_internal(CarlaPlugin* plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_internal(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height); | |||||
const void* carla_render_inline_display_internal(CarlaPlugin* plugin, uint32_t width, uint32_t height) | |||||
const void* carla_render_inline_display_internal(const CarlaPluginPtr& plugin, uint32_t width, uint32_t height) | |||||
{ | { | ||||
CarlaPluginNative* const nativePlugin = (CarlaPluginNative*)plugin; | |||||
const std::shared_ptr<CarlaPluginNative>& nativePlugin((const std::shared_ptr<CarlaPluginNative>&)plugin); | |||||
return nativePlugin->renderInlineDisplay(width, height); | return nativePlugin->renderInlineDisplay(width, height); | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla SFZero Plugin | * Carla SFZero Plugin | ||||
* Copyright (C) 2018-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2018-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -68,7 +68,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
if (pData->active) | if (pData->active) | ||||
{ | { | ||||
@@ -662,7 +662,8 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
bool init(const char* const filename, const char* const name, const char* const label, const uint options) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* const name, const char* const label, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -729,7 +730,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -770,7 +771,7 @@ private: | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newSFZero(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newSFZero(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPluginSFZero::newSFZero({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", | carla_debug("CarlaPluginSFZero::newSFZero({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", | ||||
init.engine, init.filename, init.name, init.label, init.uniqueId); | init.engine, init.filename, init.name, init.label, init.uniqueId); | ||||
@@ -784,13 +785,10 @@ CarlaPlugin* CarlaPlugin::newSFZero(const Initializer& init) | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
CarlaPluginSFZero* const plugin(new CarlaPluginSFZero(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginSFZero> plugin(new CarlaPluginSFZero(init.engine, init.id)); | |||||
if (! plugin->init(init.filename, init.name, init.label, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.label, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
@@ -128,7 +128,7 @@ public: | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
if (pData->client != nullptr && pData->client->isActive()) | if (pData->client != nullptr && pData->client->isActive()) | ||||
pData->client->deactivate(); | |||||
pData->client->deactivate(true); | |||||
CARLA_ASSERT(! fIsProcessing); | CARLA_ASSERT(! fIsProcessing); | ||||
@@ -2357,7 +2357,8 @@ protected: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
public: | public: | ||||
bool init(const char* const filename, const char* const name, const int64_t uniqueId, const uint options) | |||||
bool init(const CarlaPluginPtr plugin, | |||||
const char* const filename, const char* const name, const int64_t uniqueId, const uint options) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | ||||
@@ -2564,7 +2565,7 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
pData->client = pData->engine->addClient(this); | |||||
pData->client = pData->engine->addClient(plugin); | |||||
if (pData->client == nullptr || ! pData->client->isOk()) | if (pData->client == nullptr || ! pData->client->isOk()) | ||||
{ | { | ||||
@@ -2864,22 +2865,20 @@ CARLA_BACKEND_END_NAMESPACE | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
CarlaPlugin* CarlaPlugin::newVST2(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newVST2(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newVST2({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId); | |||||
carla_debug("CarlaPlugin::newVST2({%p, \"%s\", \"%s\", " P_INT64 "})", | |||||
init.engine, init.filename, init.name, init.uniqueId); | |||||
#ifdef USE_JUCE_FOR_VST2 | #ifdef USE_JUCE_FOR_VST2 | ||||
if (std::getenv("CARLA_DO_NOT_USE_JUCE_FOR_VST2") == nullptr) | if (std::getenv("CARLA_DO_NOT_USE_JUCE_FOR_VST2") == nullptr) | ||||
return newJuce(init, "VST2"); | return newJuce(init, "VST2"); | ||||
#endif | #endif | ||||
CarlaPluginVST2* const plugin(new CarlaPluginVST2(init.engine, init.id)); | |||||
std::shared_ptr<CarlaPluginVST2> plugin(new CarlaPluginVST2(init.engine, init.id)); | |||||
if (! plugin->init(init.filename, init.name, init.uniqueId, init.options)) | |||||
{ | |||||
delete plugin; | |||||
if (! plugin->init(plugin, init.filename, init.name, init.uniqueId, init.options)) | |||||
return nullptr; | return nullptr; | ||||
} | |||||
return plugin; | return plugin; | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla VST3 Plugin | * Carla VST3 Plugin | ||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2014-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -23,9 +23,10 @@ CARLA_BACKEND_START_NAMESPACE | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
CarlaPlugin* CarlaPlugin::newVST3(const Initializer& init) | |||||
CarlaPluginPtr CarlaPlugin::newVST3(const Initializer& init) | |||||
{ | { | ||||
carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId); | |||||
carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\", " P_INT64 "})", | |||||
init.engine, init.filename, init.name, init.uniqueId); | |||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||
return newJuce(init, "VST3"); | return newJuce(init, "VST3"); | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla LV2 Single Plugin | * Carla LV2 Single Plugin | ||||
* Copyright (C) 2017-2019 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2017-2020 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -145,6 +145,8 @@ public: | |||||
if (fPlugin != nullptr && fIsActive) | if (fPlugin != nullptr && fIsActive) | ||||
fPlugin->setActive(false, false, false); | fPlugin->setActive(false, false, false); | ||||
fPlugin = nullptr; | |||||
close(); | close(); | ||||
} | } | ||||
@@ -496,7 +498,7 @@ protected: | |||||
// ---------------------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------------------- | ||||
private: | private: | ||||
CarlaPlugin* fPlugin; | |||||
std::shared_ptr<CarlaPlugin> fPlugin; | |||||
CarlaString fUiName; | CarlaString fUiName; | ||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||