Browse Source

Pass uniqueId to plugin init calls; Midi-in for juce plug hosting

tags/1.9.4
falkTX 11 years ago
parent
commit
cb7c2460b0
28 changed files with 519 additions and 188 deletions
  1. +4
    -7
      source/backend/CarlaEngine.hpp
  2. +3
    -2
      source/backend/CarlaHost.h
  3. +2
    -1
      source/backend/CarlaPlugin.hpp
  4. +29
    -20
      source/backend/engine/CarlaEngine.cpp
  5. +79
    -77
      source/backend/engine/CarlaEngineNative.cpp
  6. +1
    -1
      source/backend/plugin/AuPlugin.cpp
  7. +1
    -1
      source/backend/plugin/BridgePlugin.cpp
  8. +2
    -2
      source/backend/plugin/CarlaPlugin.cpp
  9. +6
    -5
      source/backend/plugin/CarlaPluginThread.cpp
  10. +1
    -1
      source/backend/plugin/CsoundPlugin.cpp
  11. +3
    -4
      source/backend/plugin/DssiPlugin.cpp
  12. +1
    -1
      source/backend/plugin/FluidSynthPlugin.cpp
  13. +291
    -22
      source/backend/plugin/JucePlugin.cpp
  14. +3
    -3
      source/backend/plugin/LadspaPlugin.cpp
  15. +1
    -1
      source/backend/plugin/LinuxSamplerPlugin.cpp
  16. +8
    -7
      source/backend/plugin/Lv2Plugin.cpp
  17. +1
    -1
      source/backend/plugin/NativePlugin.cpp
  18. +1
    -1
      source/backend/plugin/ReWirePlugin.cpp
  19. +1
    -1
      source/backend/plugin/Vst3Plugin.cpp
  20. +8
    -5
      source/backend/plugin/VstPlugin.cpp
  21. +3
    -3
      source/backend/standalone/CarlaStandalone.cpp
  22. +4
    -3
      source/bridges/CarlaBridgePlugin.cpp
  23. +5
    -4
      source/carla_backend.py
  24. +2
    -1
      source/carla_host.py
  25. +24
    -5
      source/utils/CarlaPipeUtils.hpp
  26. +8
    -8
      source/utils/CarlaStateUtils.cpp
  27. +1
    -1
      source/utils/CarlaStateUtils.hpp
  28. +26
    -0
      source/utils/CarlaString.hpp

+ 4
- 7
source/backend/CarlaEngine.hpp View File

@@ -741,15 +741,12 @@ public:
/*! /*!
* Add new plugin. * Add new plugin.
*/ */
bool addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, const void* const extra = nullptr);
bool addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const void* const extra);


/*! /*!
* Add new plugin, using native binary type. * Add new plugin, using native binary type.
*/ */
bool addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, const void* const extra = nullptr)
{
return addPlugin(BINARY_NATIVE, ptype, filename, name, label, extra);
}
bool addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const void* const extra);


/*! /*!
* Remove plugin with id \a id. * Remove plugin with id \a id.
@@ -1124,7 +1121,7 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Bridge/Controller OSC stuff // Bridge/Controller OSC stuff


void oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const long uniqueId) const noexcept;
void oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept;
void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept; void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept;
void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const noexcept; void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const noexcept;
void oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs) const noexcept; void oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs) const noexcept;
@@ -1152,7 +1149,7 @@ public:
void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const noexcept; void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const noexcept;
void oscSend_control_add_plugin_end(const uint pluginId) const noexcept; void oscSend_control_add_plugin_end(const uint pluginId) const noexcept;
void oscSend_control_remove_plugin(const uint pluginId) const noexcept; void oscSend_control_remove_plugin(const uint pluginId) const noexcept;
void oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId) const noexcept;
void oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept;
void oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept; void oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept;
void oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const noexcept; void oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const noexcept;
void oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const noexcept; void oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const noexcept;


+ 3
- 2
source/backend/CarlaHost.h View File

@@ -128,7 +128,7 @@ typedef struct _CarlaPluginInfo {
* Plugin unique Id.\n * Plugin unique Id.\n
* This Id is dependant on the plugin type and may sometimes be 0. * This Id is dependant on the plugin type and may sometimes be 0.
*/ */
long uniqueId;
int64_t uniqueId;


#ifdef __cplusplus #ifdef __cplusplus
/*! /*!
@@ -628,9 +628,10 @@ CARLA_EXPORT const CarlaTransportInfo* carla_get_transport_info();
* @param filename Filename, if applicable * @param filename Filename, if applicable
* @param name Name of the plugin, can be NULL * @param name Name of the plugin, can be NULL
* @param label Plugin label, if applicable * @param label Plugin label, if applicable
* @param uniqueId Plugin unique Id, if applicable
* @param extraPtr Extra pointer, defined per plugin type * @param extraPtr Extra pointer, defined per plugin type
*/ */
CARLA_EXPORT bool carla_add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* name, const char* label, const void* extraPtr);
CARLA_EXPORT bool carla_add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* name, const char* label, int64_t uniqueId, const void* extraPtr);


/*! /*!
* Remove one plugin. * Remove one plugin.


+ 2
- 1
source/backend/CarlaPlugin.hpp View File

@@ -158,7 +158,7 @@ public:
* Get the plugin's native unique Id.\n * Get the plugin's native unique Id.\n
* May return 0 on plugin types that don't support Ids. * May return 0 on plugin types that don't support Ids.
*/ */
virtual long getUniqueId() const noexcept;
virtual int64_t getUniqueId() const noexcept;


/*! /*!
* Get the plugin's latency, in sample frames. * Get the plugin's latency, in sample frames.
@@ -827,6 +827,7 @@ public:
const char* const filename; const char* const filename;
const char* const name; const char* const name;
const char* const label; const char* const label;
const int64_t uniqueId;
}; };


static size_t getNativePluginCount() noexcept; static size_t getNativePluginCount() noexcept;


+ 29
- 20
source/backend/engine/CarlaEngine.cpp View File

@@ -704,7 +704,7 @@ CarlaEngineClient* CarlaEngine::addClient(CarlaPlugin* const)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Plugin management // Plugin management


bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, const void* const extra)
bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const void* const extra)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #10)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #10)");
CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId <= pData->maxPluginNumber, "Invalid engine internal data (err #11)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId <= pData->maxPluginNumber, "Invalid engine internal data (err #11)");
@@ -712,7 +712,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
CARLA_SAFE_ASSERT_RETURN_ERR(btype != BINARY_NONE, "Invalid plugin params (err #1)"); CARLA_SAFE_ASSERT_RETURN_ERR(btype != BINARY_NONE, "Invalid plugin params (err #1)");
CARLA_SAFE_ASSERT_RETURN_ERR(ptype != PLUGIN_NONE, "Invalid plugin params (err #2)"); CARLA_SAFE_ASSERT_RETURN_ERR(ptype != PLUGIN_NONE, "Invalid plugin params (err #2)");
CARLA_SAFE_ASSERT_RETURN_ERR((filename != nullptr && filename[0] != '\0') || (label != nullptr && label[0] != '\0'), "Invalid plugin params (err #3)"); CARLA_SAFE_ASSERT_RETURN_ERR((filename != nullptr && filename[0] != '\0') || (label != nullptr && label[0] != '\0'), "Invalid plugin params (err #3)");
carla_debug("CarlaEngine::addPlugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", %p)", btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), filename, name, label, extra);
carla_debug("CarlaEngine::addPlugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p)", btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), filename, name, label, uniqueId, extra);
CARLA_ENGINE_THREAD_SAFE_SECTION CARLA_ENGINE_THREAD_SAFE_SECTION


unsigned int id; unsigned int id;
@@ -745,7 +745,8 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
id, id,
filename, filename,
name, name,
label
label,
uniqueId
}; };


CarlaPlugin* plugin = nullptr; CarlaPlugin* plugin = nullptr;
@@ -815,7 +816,8 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
id, id,
"/usr/lib/dssi/dssi-vst.so", "/usr/lib/dssi/dssi-vst.so",
name, name,
(const char*)label2
(const char*)label2,
uniqueId
}; };


char* const oldVstPath(getenv("VST_PATH")); char* const oldVstPath(getenv("VST_PATH"));
@@ -956,6 +958,11 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
return true; return true;
} }


bool CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const void* const extra)
{
return addPlugin(BINARY_NATIVE, ptype, filename, name, label, uniqueId, extra);
}

bool CarlaEngine::removePlugin(const unsigned int id) bool CarlaEngine::removePlugin(const unsigned int id)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #14)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #14)");
@@ -1072,7 +1079,7 @@ bool CarlaEngine::clonePlugin(const unsigned int id)


const unsigned int pluginCountBefore(pData->curPluginCount); const unsigned int pluginCountBefore(pData->curPluginCount);


if (! addPlugin(plugin->getBinaryType(), plugin->getType(), plugin->getFilename(), plugin->getName(), label, plugin->getExtraStuff()))
if (! addPlugin(plugin->getBinaryType(), plugin->getType(), plugin->getFilename(), plugin->getName(), label, plugin->getUniqueId(), plugin->getExtraStuff()))
return false; return false;


CARLA_ASSERT(pluginCountBefore+1 == pData->curPluginCount); CARLA_ASSERT(pluginCountBefore+1 == pData->curPluginCount);
@@ -1278,23 +1285,23 @@ bool CarlaEngine::loadFile(const char* const filename)
// ------------------------------------------------------------------- // -------------------------------------------------------------------


if (extension == "csd") if (extension == "csd")
return addPlugin(PLUGIN_FILE_CSD, filename, baseName, baseName);
return addPlugin(PLUGIN_FILE_CSD, filename, baseName, baseName, 0, nullptr);


if (extension == "gig") if (extension == "gig")
return addPlugin(PLUGIN_FILE_GIG, filename, baseName, baseName);
return addPlugin(PLUGIN_FILE_GIG, filename, baseName, baseName, 0, nullptr);


if (extension == "sf2") if (extension == "sf2")
return addPlugin(PLUGIN_FILE_SF2, filename, baseName, baseName);
return addPlugin(PLUGIN_FILE_SF2, filename, baseName, baseName, 0, nullptr);


if (extension == "sfz") if (extension == "sfz")
return addPlugin(PLUGIN_FILE_SFZ, filename, baseName, baseName);
return addPlugin(PLUGIN_FILE_SFZ, filename, baseName, baseName, 0, nullptr);


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


if (extension == "aiff" || extension == "flac" || extension == "oga" || extension == "ogg" || extension == "w64" || extension == "wav") if (extension == "aiff" || extension == "flac" || extension == "oga" || extension == "ogg" || extension == "w64" || extension == "wav")
{ {
#ifdef WANT_AUDIOFILE #ifdef WANT_AUDIOFILE
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile"))
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
@@ -1312,7 +1319,7 @@ bool CarlaEngine::loadFile(const char* const filename)
{ {
#ifdef WANT_AUDIOFILE #ifdef WANT_AUDIOFILE
# ifdef HAVE_FFMPEG # ifdef HAVE_FFMPEG
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile"))
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "audiofile", 0, nullptr))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
@@ -1334,7 +1341,7 @@ bool CarlaEngine::loadFile(const char* const filename)
if (extension == "mid" || extension == "midi") if (extension == "mid" || extension == "midi")
{ {
#ifdef WANT_MIDIFILE #ifdef WANT_MIDIFILE
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile"))
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "midifile", 0, nullptr))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true); plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "file", filename, true);
@@ -1353,7 +1360,7 @@ bool CarlaEngine::loadFile(const char* const filename)
if (extension == "xmz" || extension == "xiz") if (extension == "xmz" || extension == "xiz")
{ {
#ifdef WANT_ZYNADDSUBFX #ifdef WANT_ZYNADDSUBFX
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "zynaddsubfx"))
if (addPlugin(PLUGIN_INTERNAL, nullptr, baseName, "zynaddsubfx", 0, nullptr))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2", filename, true); plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, (extension == "xmz") ? "CarlaAlternateFile1" : "CarlaAlternateFile2", filename, true);
@@ -1412,15 +1419,17 @@ bool CarlaEngine::loadProject(const char* const filename)
// check if using GIG, SF2 or SFZ 16outs // check if using GIG, SF2 or SFZ 16outs
static const char kUse16OutsSuffix[] = " (16 outs)"; static const char kUse16OutsSuffix[] = " (16 outs)";


const PluginType ptype(getPluginTypeFromString(saveState.type));

if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix)) if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix))
{ {
if (std::strcmp(saveState.type, "GIG") == 0 || std::strcmp(saveState.type, "SF2") == 0)
if (ptype == PLUGIN_FILE_GIG || ptype == PLUGIN_FILE_SF2)
extraStuff = "true"; extraStuff = "true";
} }


// TODO - proper find&load plugins // TODO - proper find&load plugins


if (addPlugin(getPluginTypeFromString(saveState.type), saveState.binary, saveState.name, saveState.label, extraStuff))
if (addPlugin(ptype, saveState.binary, saveState.name, saveState.label, saveState.uniqueId, extraStuff))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->loadSaveState(saveState); plugin->loadSaveState(saveState);
@@ -2214,17 +2223,17 @@ void CarlaEngine::restorePatchbayConnection(const char* const connSource, const
// Bridge/Controller OSC stuff // Bridge/Controller OSC stuff


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
void CarlaEngine::oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const long uniqueId) const noexcept
void CarlaEngine::oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
carla_debug("CarlaEngine::oscSend_bridge_plugin_info1(%i:%s, %X, %l)", category, PluginCategory2Str(category), hints, uniqueId);
carla_debug("CarlaEngine::oscSend_bridge_plugin_info1(%i:%s, %X, " P_INT64 ")", category, PluginCategory2Str(category), hints, uniqueId);


char targetPath[std::strlen(pData->oscData->path)+21]; char targetPath[std::strlen(pData->oscData->path)+21];
std::strcpy(targetPath, pData->oscData->path); std::strcpy(targetPath, pData->oscData->path);
std::strcat(targetPath, "/bridge_plugin_info1"); std::strcat(targetPath, "/bridge_plugin_info1");
try_lo_send(pData->oscData->target, targetPath, "iih", static_cast<int32_t>(category), static_cast<int32_t>(hints), static_cast<int64_t>(uniqueId));
try_lo_send(pData->oscData->target, targetPath, "iih", static_cast<int32_t>(category), static_cast<int32_t>(hints), uniqueId);
} }


void CarlaEngine::oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept void CarlaEngine::oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept
@@ -2557,14 +2566,14 @@ void CarlaEngine::oscSend_control_remove_plugin(const uint pluginId) const noexc
try_lo_send(pData->oscData->target, targetPath, "i", static_cast<int32_t>(pluginId)); try_lo_send(pData->oscData->target, targetPath, "i", static_cast<int32_t>(pluginId));
} }


void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId) const noexcept
void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(pData->oscData->path != nullptr && pData->oscData->path[0] != '\0',);
CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,); CARLA_SAFE_ASSERT_RETURN(pData->oscData->target != nullptr,);
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,);
CARLA_SAFE_ASSERT_RETURN(type != PLUGIN_NONE,); CARLA_SAFE_ASSERT_RETURN(type != PLUGIN_NONE,);
carla_debug("CarlaEngine::oscSend_control_set_plugin_data(%i, %i:%s, %i:%s, %X, %l)", pluginId, type, PluginType2Str(type), category, PluginCategory2Str(category), hints, uniqueId);
carla_debug("CarlaEngine::oscSend_control_set_plugin_data(%i, %i:%s, %i:%s, %X, " P_INT64 ")", pluginId, type, PluginType2Str(type), category, PluginCategory2Str(category), hints, uniqueId);


char targetPath[std::strlen(pData->oscData->path)+18]; char targetPath[std::strlen(pData->oscData->path)+18];
std::strcpy(targetPath, pData->oscData->path); std::strcpy(targetPath, pData->oscData->path);


+ 79
- 77
source/backend/engine/CarlaEngineNative.cpp View File

@@ -87,6 +87,8 @@ public:
protected: protected:
void msgReceived(const char* const msg) override void msgReceived(const char* const msg) override
{ {
bool ok = true;

if (std::strcmp(msg, "exiting") == 0) if (std::strcmp(msg, "exiting") == 0)
{ {
waitChildClose(); waitChildClose();
@@ -94,14 +96,15 @@ protected:
} }
else if (std::strcmp(msg, "set_engine_option") == 0) else if (std::strcmp(msg, "set_engine_option") == 0)
{ {
int option, value;
uint32_t option;
int32_t value;
const char* valueStr; const char* valueStr;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(option),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(option),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(value),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(value),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(valueStr),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(valueStr),);


fEngine->setOption((EngineOption)option, value, valueStr);
fEngine->setOption(static_cast<EngineOption>(option), value, valueStr);


delete[] valueStr; delete[] valueStr;
} }
@@ -111,7 +114,7 @@ protected:


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),);


fEngine->loadFile(filename);
ok = fEngine->loadFile(filename);


delete[] filename; delete[] filename;
} }
@@ -121,7 +124,7 @@ protected:


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),);


fEngine->loadProject(filename);
ok = fEngine->loadProject(filename);


delete[] filename; delete[] filename;
} }
@@ -131,30 +134,30 @@ protected:


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename),);


fEngine->saveProject(filename);
ok = fEngine->saveProject(filename);


delete[] filename; delete[] filename;
} }
else if (std::strcmp(msg, "patchbay_connect") == 0) else if (std::strcmp(msg, "patchbay_connect") == 0)
{ {
int portA, portB;
int32_t portA, portB;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(portA),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(portA),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(portB),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(portB),);


fEngine->patchbayConnect(portA, portB);
ok = fEngine->patchbayConnect(portA, portB);
} }
else if (std::strcmp(msg, "patchbay_disconnect") == 0) else if (std::strcmp(msg, "patchbay_disconnect") == 0)
{ {
uint connectionId;
uint32_t connectionId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(connectionId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(connectionId),);


fEngine->patchbayDisconnect(connectionId);
ok = fEngine->patchbayDisconnect(connectionId);
} }
else if (std::strcmp(msg, "patchbay_refresh") == 0) else if (std::strcmp(msg, "patchbay_refresh") == 0)
{ {
fEngine->patchbayRefresh();
ok = fEngine->patchbayRefresh();
} }
else if (std::strcmp(msg, "transport_play") == 0) else if (std::strcmp(msg, "transport_play") == 0)
{ {
@@ -166,24 +169,26 @@ protected:
} }
else if (std::strcmp(msg, "transport_relocate") == 0) else if (std::strcmp(msg, "transport_relocate") == 0)
{ {
long frame;
uint64_t frame;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsLong(frame),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsULong(frame),);


fEngine->transportRelocate((uint64_t)frame);
fEngine->transportRelocate(frame);
} }
else if (std::strcmp(msg, "add_plugin") == 0) else if (std::strcmp(msg, "add_plugin") == 0)
{ {
int btype, ptype;
uint32_t btype, ptype;
const char* filename = nullptr; const char* filename = nullptr;
const char* name; const char* name;
const char* label; const char* label;
int64_t uniqueId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(btype),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(ptype),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(btype),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(ptype),);
readNextLineAsString(filename); // can be null readNextLineAsString(filename); // can be null
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(name),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(name),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(label),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(label),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsLong(uniqueId),);


if (filename != nullptr && std::strcmp(filename, "(null)") == 0) if (filename != nullptr && std::strcmp(filename, "(null)") == 0)
{ {
@@ -197,72 +202,67 @@ protected:
name = nullptr; name = nullptr;
} }


const bool ok = fEngine->addPlugin((BinaryType)btype, (PluginType)ptype, filename, name, label);
ok = fEngine->addPlugin(static_cast<BinaryType>(btype), static_cast<PluginType>(ptype), filename, name, label, uniqueId, nullptr);


if (filename != nullptr) if (filename != nullptr)
delete[] filename; delete[] filename;
if (name != nullptr) if (name != nullptr)
delete[] name; delete[] name;
delete[] label; delete[] label;

if (! ok)
{
writeMsg("error\n", 6);
writeAndFixMsg(fEngine->getLastError());
}
} }
else if (std::strcmp(msg, "remove_plugin") == 0) else if (std::strcmp(msg, "remove_plugin") == 0)
{ {
uint pluginId;
uint32_t pluginId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);


fEngine->removePlugin(pluginId);
ok = fEngine->removePlugin(pluginId);
} }
else if (std::strcmp(msg, "remove_all_plugins") == 0) else if (std::strcmp(msg, "remove_all_plugins") == 0)
{ {
fEngine->removeAllPlugins();
ok = fEngine->removeAllPlugins();
} }
else if (std::strcmp(msg, "rename_plugin") == 0) else if (std::strcmp(msg, "rename_plugin") == 0)
{ {
uint pluginId;
uint32_t pluginId;
const char* newName; const char* newName;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(newName),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(newName),);


// TODO
/*const char* name =*/ fEngine->renamePlugin(pluginId, newName); /*const char* name =*/ fEngine->renamePlugin(pluginId, newName);


delete[] newName; delete[] newName;
} }
else if (std::strcmp(msg, "clone_plugin") == 0) else if (std::strcmp(msg, "clone_plugin") == 0)
{ {
uint pluginId;
uint32_t pluginId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);


fEngine->clonePlugin(pluginId);
ok = fEngine->clonePlugin(pluginId);
} }
else if (std::strcmp(msg, "replace_plugin") == 0) else if (std::strcmp(msg, "replace_plugin") == 0)
{ {
uint pluginId;
uint32_t pluginId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);


fEngine->replacePlugin(pluginId);
ok = fEngine->replacePlugin(pluginId);
} }
else if (std::strcmp(msg, "switch_plugins") == 0) else if (std::strcmp(msg, "switch_plugins") == 0)
{ {
uint pluginIdA, pluginIdB;
uint32_t pluginIdA, pluginIdB;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginIdA),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginIdA),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginIdB),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginIdB),);


fEngine->switchPlugins(pluginIdA, pluginIdB);
ok = fEngine->switchPlugins(pluginIdA, pluginIdB);
} }
else if (std::strcmp(msg, "load_plugin_state") == 0) else if (std::strcmp(msg, "load_plugin_state") == 0)
{ {
uint pluginId;
uint32_t pluginId;
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -275,7 +275,7 @@ protected:
} }
else if (std::strcmp(msg, "save_plugin_state") == 0) else if (std::strcmp(msg, "save_plugin_state") == 0)
{ {
uint pluginId;
uint32_t pluginId;
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -288,8 +288,7 @@ protected:
} }
else if (std::strcmp(msg, "set_option") == 0) else if (std::strcmp(msg, "set_option") == 0)
{ {
uint pluginId;
uint option;
uint32_t pluginId, option;
bool yesNo; bool yesNo;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -301,7 +300,7 @@ protected:
} }
else if (std::strcmp(msg, "set_active") == 0) else if (std::strcmp(msg, "set_active") == 0)
{ {
uint pluginId;
uint32_t pluginId;
bool onOff; bool onOff;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -312,7 +311,7 @@ protected:
} }
else if (std::strcmp(msg, "set_drywet") == 0) else if (std::strcmp(msg, "set_drywet") == 0)
{ {
uint pluginId;
uint32_t pluginId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -323,7 +322,7 @@ protected:
} }
else if (std::strcmp(msg, "set_volume") == 0) else if (std::strcmp(msg, "set_volume") == 0)
{ {
uint pluginId;
uint32_t pluginId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -334,7 +333,7 @@ protected:
} }
else if (std::strcmp(msg, "set_balance_left") == 0) else if (std::strcmp(msg, "set_balance_left") == 0)
{ {
uint pluginId;
uint32_t pluginId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -345,7 +344,7 @@ protected:
} }
else if (std::strcmp(msg, "set_balance_right") == 0) else if (std::strcmp(msg, "set_balance_right") == 0)
{ {
uint pluginId;
uint32_t pluginId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -356,7 +355,7 @@ protected:
} }
else if (std::strcmp(msg, "set_panning") == 0) else if (std::strcmp(msg, "set_panning") == 0)
{ {
uint pluginId;
uint32_t pluginId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -367,8 +366,8 @@ protected:
} }
else if (std::strcmp(msg, "set_ctrl_channel") == 0) else if (std::strcmp(msg, "set_ctrl_channel") == 0)
{ {
uint pluginId;
int channel;
uint32_t pluginId;
int32_t channel;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel),);
@@ -379,8 +378,7 @@ protected:
} }
else if (std::strcmp(msg, "set_parameter_value") == 0) else if (std::strcmp(msg, "set_parameter_value") == 0)
{ {
uint pluginId;
uint parameterId;
uint32_t pluginId, parameterId;
float value; float value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -392,23 +390,20 @@ protected:
} }
else if (std::strcmp(msg, "set_parameter_midi_channel") == 0) else if (std::strcmp(msg, "set_parameter_midi_channel") == 0)
{ {
uint pluginId;
uint parameterId;
int channel;
uint32_t pluginId, parameterId, channel;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel),);
CARLA_SAFE_ASSERT_RETURN(channel >= 0 && channel < MAX_MIDI_CHANNELS,);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(channel),);
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
plugin->setParameterMidiChannel(parameterId, uint8_t(channel), true, false);
plugin->setParameterMidiChannel(parameterId, static_cast<uint8_t>(channel), true, false);
} }
else if (std::strcmp(msg, "set_parameter_midi_cc") == 0) else if (std::strcmp(msg, "set_parameter_midi_cc") == 0)
{ {
uint pluginId;
uint parameterId;
int cc;
uint32_t pluginId, parameterId;
int32_t cc;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(parameterId),);
@@ -416,12 +411,12 @@ protected:
CARLA_SAFE_ASSERT_RETURN(cc >= -1 && cc < 0x5F,); CARLA_SAFE_ASSERT_RETURN(cc >= -1 && cc < 0x5F,);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
plugin->setParameterMidiCC(parameterId, int16_t(cc), true, false);
plugin->setParameterMidiCC(parameterId, static_cast<int16_t>(cc), true, false);
} }
else if (std::strcmp(msg, "set_program") == 0) else if (std::strcmp(msg, "set_program") == 0)
{ {
uint pluginId;
int index;
uint32_t pluginId;
int32_t index;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index),);
@@ -431,8 +426,8 @@ protected:
} }
else if (std::strcmp(msg, "set_midi_program") == 0) else if (std::strcmp(msg, "set_midi_program") == 0)
{ {
uint pluginId;
int index;
uint32_t pluginId;
int32_t index;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(index),);
@@ -442,7 +437,7 @@ protected:
} }
else if (std::strcmp(msg, "set_custom_data") == 0) else if (std::strcmp(msg, "set_custom_data") == 0)
{ {
uint pluginId;
uint32_t pluginId;
const char* type; const char* type;
const char* key; const char* key;
const char* value; const char* value;
@@ -457,7 +452,7 @@ protected:
} }
else if (std::strcmp(msg, "set_chunk_data") == 0) else if (std::strcmp(msg, "set_chunk_data") == 0)
{ {
uint pluginId;
uint32_t pluginId;
const char* cdata; const char* cdata;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -468,7 +463,7 @@ protected:
} }
else if (std::strcmp(msg, "prepare_for_save") == 0) else if (std::strcmp(msg, "prepare_for_save") == 0)
{ {
uint pluginId;
uint32_t pluginId;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);


@@ -477,23 +472,22 @@ protected:
} }
else if (std::strcmp(msg, "send_midi_note") == 0) else if (std::strcmp(msg, "send_midi_note") == 0)
{ {
uint pluginId;
int channel, note, velocity;
uint32_t pluginId, channel, note, velocity;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(channel),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(note),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(velocity),);
CARLA_SAFE_ASSERT_RETURN(channel >= 0 && channel < MAX_MIDI_CHANNELS,);
CARLA_SAFE_ASSERT_RETURN(note >= 0 && channel < MAX_MIDI_VALUE,);
CARLA_SAFE_ASSERT_RETURN(velocity >= 0 && channel < MAX_MIDI_VALUE,);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(channel),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(note),);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(velocity),);
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,);
CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_VALUE,);
CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE,);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
plugin->sendMidiSingleNote(uint8_t(channel), uint8_t(note), 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)
{ {
uint pluginId;
uint32_t pluginId;
bool yesNo; bool yesNo;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId),);
@@ -506,6 +500,12 @@ protected:
{ {
carla_stderr("msgReceived : %s", msg); carla_stderr("msgReceived : %s", msg);
} }

if (! ok)
{
writeMsg("error\n", 6);
writeAndFixMsg(fEngine->getLastError());
}
} }


private: private:
@@ -1325,15 +1325,17 @@ protected:
// check if using GIG, SF2 or SFZ 16outs // check if using GIG, SF2 or SFZ 16outs
static const char kUse16OutsSuffix[] = " (16 outs)"; static const char kUse16OutsSuffix[] = " (16 outs)";


const PluginType ptype(getPluginTypeFromString(saveState.type));

if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix)) if (CarlaString(saveState.label).endsWith(kUse16OutsSuffix))
{ {
if (std::strcmp(saveState.type, "GIG") == 0 || std::strcmp(saveState.type, "SF2") == 0)
if (ptype == PLUGIN_FILE_GIG || ptype == PLUGIN_FILE_SF2)
extraStuff = "true"; extraStuff = "true";
} }


// TODO - proper find&load plugins // TODO - proper find&load plugins


if (addPlugin(getPluginTypeFromString(saveState.type), saveState.binary, saveState.name, saveState.label, extraStuff))
if (addPlugin(ptype, saveState.binary, saveState.name, saveState.label, saveState.uniqueId, extraStuff))
{ {
if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1))
plugin->loadSaveState(saveState); plugin->loadSaveState(saveState);


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

@@ -23,7 +23,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newAU(const Initializer& init) CarlaPlugin* CarlaPlugin::newAU(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name);
carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId);


#if defined(WANT_AU) && defined(HAVE_JUCE) #if defined(WANT_AU) && defined(HAVE_JUCE)
return newJuce(init, "AU"); return newJuce(init, "AU");


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

@@ -1950,7 +1950,7 @@ CarlaPlugin* CarlaPlugin::newBridge(const Initializer& init, BinaryType btype, P


CarlaPlugin* CarlaPlugin::newJACK(const Initializer& init) CarlaPlugin* CarlaPlugin::newJACK(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newJACK({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label);
carla_debug("CarlaPlugin::newJACK({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId);


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
BridgePlugin* const plugin(new BridgePlugin(init.engine, init.id, BINARY_NATIVE, PLUGIN_JACK)); BridgePlugin* const plugin(new BridgePlugin(init.engine, init.id, BINARY_NATIVE, PLUGIN_JACK));


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

@@ -202,7 +202,7 @@ PluginCategory CarlaPlugin::getCategory() const noexcept
return category; return category;
} }


long CarlaPlugin::getUniqueId() const noexcept
int64_t CarlaPlugin::getUniqueId() const noexcept
{ {
return 0; return 0;
} }
@@ -440,7 +440,7 @@ const SaveState& CarlaPlugin::getSaveState()
pData->saveState.name = carla_strdup(pData->name); pData->saveState.name = carla_strdup(pData->name);
pData->saveState.label = carla_strdup(strBuf); pData->saveState.label = carla_strdup(strBuf);
pData->saveState.binary = carla_strdup(pData->filename); pData->saveState.binary = carla_strdup(pData->filename);
pData->saveState.uniqueID = getUniqueId();
pData->saveState.uniqueId = getUniqueId();


// --------------------------------------------------------------- // ---------------------------------------------------------------
// Internals // Internals


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

@@ -166,14 +166,14 @@ void CarlaPluginThread::run()
case PLUGIN_THREAD_DSSI_GUI: case PLUGIN_THREAD_DSSI_GUI:
/* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId()); /* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId());
/* filename */ arguments << fPlugin->getFilename(); /* filename */ arguments << fPlugin->getFilename();
/* label */ arguments << (const char*)fLabel;
/* label */ arguments << fLabel.getBuffer();
/* ui-title */ arguments << QString("%1 (GUI)").arg(fPlugin->getName()); /* ui-title */ arguments << QString("%1 (GUI)").arg(fPlugin->getName());
break; break;


case PLUGIN_THREAD_LV2_GUI: case PLUGIN_THREAD_LV2_GUI:
/* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId()); /* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId());
/* URI */ arguments << (const char*)fLabel;
/* ui-URI */ arguments << (const char*)fExtra1;
/* URI */ arguments << fLabel.getBuffer();
/* ui-URI */ arguments << fExtra1.getBuffer();
/* ui-title */ arguments << QString("%1 (GUI)").arg(fPlugin->getName()); /* ui-title */ arguments << QString("%1 (GUI)").arg(fPlugin->getName());
break; break;


@@ -191,10 +191,11 @@ void CarlaPluginThread::run()
if (fPlugin->getType() != PLUGIN_JACK) if (fPlugin->getType() != PLUGIN_JACK)
{ {
/* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId()); /* osc-url */ arguments << QString("%1/%2").arg(fEngine->getOscServerPathUDP()).arg(fPlugin->getId());
/* stype */ arguments << (const char*)fExtra1;
/* stype */ arguments << fExtra1.getBuffer();
/* filename */ arguments << fPlugin->getFilename(); /* filename */ arguments << fPlugin->getFilename();
/* name */ arguments << name; /* name */ arguments << name;
/* label */ arguments << (const char*)fLabel;
/* label */ arguments << fLabel.getBuffer();
/* uniqueId */ arguments << QString("%1").arg(fPlugin->getUniqueId());
} }
else else
{ {


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

@@ -86,7 +86,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newCsound(const Initializer& init) CarlaPlugin* CarlaPlugin::newCsound(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newCsound(%p, \"%s\", \"%s\", \"%s\")", init.engine, init.filename, init.name, init.label);
carla_debug("CarlaPlugin::newCsound({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId);


#ifdef WANT_CSOUND #ifdef WANT_CSOUND
CsoundPlugin* const plugin(new CsoundPlugin(init.engine, init.id)); CsoundPlugin* const plugin(new CsoundPlugin(init.engine, init.id));


+ 3
- 4
source/backend/plugin/DssiPlugin.cpp View File

@@ -125,11 +125,11 @@ public:
return CarlaPlugin::getCategory(); return CarlaPlugin::getCategory();
} }


long getUniqueId() const noexcept override
int64_t getUniqueId() const noexcept override
{ {
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0); CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0);


return static_cast<long>(fDescriptor->UniqueID);
return static_cast<int64_t>(fDescriptor->UniqueID);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -1220,7 +1220,6 @@ public:
midiEvent.data.control.param = ctrlEvent.param; midiEvent.data.control.param = ctrlEvent.param;
midiEvent.data.control.value = int8_t(ctrlEvent.value*127.0f); midiEvent.data.control.value = int8_t(ctrlEvent.value*127.0f);
} }

break; break;
} // case kEngineControlEventTypeParameter } // case kEngineControlEventTypeParameter


@@ -2046,7 +2045,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newDSSI(const Initializer& init) CarlaPlugin* CarlaPlugin::newDSSI(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newDSSI({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label);
carla_debug("CarlaPlugin::newDSSI({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId);


#ifdef WANT_DSSI #ifdef WANT_DSSI
DssiPlugin* const plugin(new DssiPlugin(init.engine, init.id)); DssiPlugin* const plugin(new DssiPlugin(init.engine, init.id));


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

@@ -1718,7 +1718,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, const bool use16Outs) CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, const bool use16Outs)
{ {
carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs));
carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", init.engine, init.filename, init.name, init.label, init.uniqueId, bool2str(use16Outs));


#ifdef WANT_FLUIDSYNTH #ifdef WANT_FLUIDSYNTH
if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs) if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs)


+ 291
- 22
source/backend/plugin/JucePlugin.cpp View File

@@ -97,7 +97,7 @@ public:
return category; return category;
} }


long getUniqueId() const noexcept override
int64_t getUniqueId() const noexcept override
{ {
return fDesc.uid; return fDesc.uid;
} }
@@ -121,7 +121,6 @@ public:


unsigned int options = 0x0; unsigned int options = 0x0;


//options |= PLUGIN_OPTION_FIXED_BUFFERS;
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
//options |= PLUGIN_OPTION_USE_CHUNKS; //options |= PLUGIN_OPTION_USE_CHUNKS;


@@ -545,13 +544,279 @@ public:
pData->needsReset = false; pData->needsReset = false;
} }


uint32_t l=0;
for (; l < pData->audioIn.count; ++l)
fAudioBuffer.clear(static_cast<int>(l), 0, static_cast<int>(frames));
for (; l < pData->audioOut.count; ++l)
fAudioBuffer.clear(static_cast<int>(l), 0, static_cast<int>(frames));
// --------------------------------------------------------------------------------------------------------
// TimeInfo

// TODO

// --------------------------------------------------------------------------------------------------------
// Event Input

fMidiBuffer.clear();

if (pData->event.portIn != nullptr)
{
// ----------------------------------------------------------------------------------------------------
// MIDI Input (External)

if (pData->extNotes.mutex.tryLock())
{
for (; ! pData->extNotes.data.isEmpty();)
{
const ExternalMidiNote& note(pData->extNotes.data.getFirst(true));

CARLA_SAFE_ASSERT_CONTINUE(note.channel >= 0 && note.channel < MAX_MIDI_CHANNELS);

uint8_t midiEvent[3];
midiEvent[0] = static_cast<uint8_t>(note.channel + (note.velo > 0) ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF);
midiEvent[1] = note.note;
midiEvent[2] = note.velo;

fMidiBuffer.addEvent(midiEvent, 3, 0);
}

pData->extNotes.mutex.unlock();

} // End of MIDI Input (External)

// ----------------------------------------------------------------------------------------------------
// Event Input (System)

bool allNotesOffSent = false;

uint32_t numEvents = pData->event.portIn->getEventCount();
uint32_t nextBankId;

if (pData->midiprog.current >= 0 && pData->midiprog.count > 0)
nextBankId = pData->midiprog.data[pData->midiprog.current].bank;
else
nextBankId = 0;

for (uint32_t i=0; i < numEvents; ++i)
{
const EngineEvent& event(pData->event.portIn->getEvent(i));

if (event.time >= frames)
continue;

switch (event.type)
{
case kEngineEventTypeNull:
break;

case kEngineEventTypeControl: {
const EngineControlEvent& ctrlEvent(event.ctrl);

switch (ctrlEvent.type)
{
case kEngineControlEventTypeNull:
break;

case kEngineControlEventTypeParameter: {
#ifndef BUILD_BRIDGE
// Control backend stuff
if (event.channel == pData->ctrlChannel)
{
float value;

if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0)
{
value = ctrlEvent.value;
setDryWet(value, false, false);
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value);
break;
}

if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0)
{
value = ctrlEvent.value*127.0f/100.0f;
setVolume(value, false, false);
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value);
break;
}

if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0)
{
float left, right;
value = ctrlEvent.value/0.5f - 1.0f;

if (value < 0.0f)
{
left = -1.0f;
right = (value*2.0f)+1.0f;
}
else if (value > 0.0f)
{
left = (value*2.0f)-1.0f;
right = 1.0f;
}
else
{
left = -1.0f;
right = 1.0f;
}

setBalanceLeft(left, false, false);
setBalanceRight(right, false, false);
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left);
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right);
break;
}
}
#endif

// Control plugin parameters
uint32_t k;
for (k=0; k < pData->param.count; ++k)
{
if (pData->param.data[k].midiChannel != event.channel)
continue;
if (pData->param.data[k].midiCC != ctrlEvent.param)
continue;
if (pData->param.data[k].type != PARAMETER_INPUT)
continue;
if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
continue;

float value;

if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
{
value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max;
}
else
{
value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value);

if (pData->param.data[k].hints & PARAMETER_IS_INTEGER)
value = std::rint(value);
}

setParameterValue(k, value, false, false, false);
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value);
break;
}

// check if event is already handled
if (k != pData->param.count)
break;

if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F)
{
uint8_t midiData[3];
midiData[0] = static_cast<uint8_t>(MIDI_STATUS_CONTROL_CHANGE + i);
midiData[1] = static_cast<uint8_t>(ctrlEvent.param);
midiData[2] = uint8_t(ctrlEvent.value*127.0f);

fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time));
}
break;
} // case kEngineControlEventTypeParameter

case kEngineControlEventTypeMidiBank:
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
nextBankId = ctrlEvent.param;
break;

case kEngineControlEventTypeMidiProgram:
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
{
const uint32_t nextProgramId = ctrlEvent.param;

for (uint32_t k=0; k < pData->midiprog.count; ++k)
{
if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId)
{
const int32_t index(static_cast<int32_t>(k));
setMidiProgram(index, false, false, false);
pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, index, 0, 0.0f);
break;
}
}
}
break;

case kEngineControlEventTypeAllSoundOff:
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
uint8_t midiData[3];
midiData[0] = static_cast<uint8_t>(MIDI_STATUS_CONTROL_CHANGE + i);
midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF;
midiData[2] = 0;

fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time));
}
break;

case kEngineControlEventTypeAllNotesOff:
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
if (event.channel == pData->ctrlChannel && ! allNotesOffSent)
{
allNotesOffSent = true;
sendMidiAllNotesOffToCallback();
}

uint8_t midiData[3];
midiData[0] = static_cast<uint8_t>(MIDI_STATUS_CONTROL_CHANGE + i);
midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF;
midiData[2] = 0;

fMidiBuffer.addEvent(midiData, 3, static_cast<int>(event.time));
}
break;
} // switch (ctrlEvent.type)
break;
} // case kEngineEventTypeControl

case kEngineEventTypeMidi:
{
const EngineMidiEvent& midiEvent(event.midi);

uint8_t status = uint8_t(MIDI_GET_STATUS_FROM_DATA(midiEvent.data));
uint8_t channel = event.channel;

// Fix bad note-off
if (MIDI_IS_STATUS_NOTE_ON(status) && midiEvent.data[2] == 0)
status = MIDI_STATUS_NOTE_OFF;

if (status == MIDI_STATUS_CHANNEL_PRESSURE && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (status == MIDI_STATUS_CONTROL_CHANGE && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
continue;
if (status == MIDI_STATUS_POLYPHONIC_AFTERTOUCH && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0)
continue;
if (status == MIDI_STATUS_PITCH_WHEEL_CONTROL && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0)
continue;

fMidiBuffer.addEvent(midiEvent.data, midiEvent.size, static_cast<int>(event.time));

if (status == MIDI_STATUS_NOTE_ON)
pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, midiEvent.data[1], midiEvent.data[2]);
else if (status == MIDI_STATUS_NOTE_OFF)
pData->postponeRtEvent(kPluginPostRtEventNoteOff, channel, midiEvent.data[1], 0.0f);

break;
} // case kEngineEventTypeMidi
} // switch (event.type)
}

pData->postRtEvents.trySplice();

} // End of Event Input

// --------------------------------------------------------------------------------------------------------
// Process


processSingle(inBuffer, outBuffer, frames); processSingle(inBuffer, outBuffer, frames);

// --------------------------------------------------------------------------------------------------------
// MIDI Output

if (pData->event.portOut != nullptr)
{
// TODO
}
} }


bool processSingle(float** const inBuffer, float** const outBuffer, const uint32_t frames) bool processSingle(float** const inBuffer, float** const outBuffer, const uint32_t frames)
@@ -577,22 +842,15 @@ public:
else if (! pData->singleMutex.tryLock()) else if (! pData->singleMutex.tryLock())
{ {
for (uint32_t i=0; i < pData->audioOut.count; ++i) for (uint32_t i=0; i < pData->audioOut.count; ++i)
{
for (uint32_t k=0; k < frames; ++k)
outBuffer[i][k/*+timeOffset*/] = 0.0f;
}

FloatVectorOperations::clear(outBuffer[i], static_cast<int>(frames));
return false; return false;
} }


// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Set audio in buffers // Set audio in buffers


uint32_t l;
for (l=0; l < pData->audioIn.count; ++l)
fAudioBuffer.copyFrom(static_cast<int>(l), 0, inBuffer[l], static_cast<int>(frames));
//for (l=0; l < pData->audioOut.count; ++l)
// fAudioBuffer.clear(static_cast<int>(l), 0, static_cast<int>(frames));
for (uint32_t i=0; i < pData->audioIn.count; ++i)
fAudioBuffer.copyFrom(static_cast<int>(i), 0, inBuffer[i], static_cast<int>(frames));


// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
// Run plugin // Run plugin
@@ -655,7 +913,7 @@ protected:
// ------------------------------------------------------------------- // -------------------------------------------------------------------


public: public:
bool init(const char* const filename, const char* const name, const char* const label, const char* const format)
bool init(const char* const filename, const char* const name, const char* const label, const int64_t uniqueId, const char* const format)
{ {
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false);


@@ -680,6 +938,12 @@ public:
return false; return false;
} }


if (format == nullptr || format[0] == '\0')
{
pData->engine->setLastError("null format");
return false;
}

#ifdef CARLA_OS_LINUX #ifdef CARLA_OS_LINUX
const MessageManagerLock mmLock; const MessageManagerLock mmLock;
#endif #endif
@@ -698,7 +962,7 @@ public:
#endif #endif


//fDesc.name = fDesc.descriptiveName = label; //fDesc.name = fDesc.descriptiveName = label;
fDesc.uid = 0; // TODO - set uid for shell plugins
fDesc.uid = static_cast<int>(uniqueId);
fDesc.fileOrIdentifier = jfilename; fDesc.fileOrIdentifier = jfilename;
fDesc.pluginFormatName = format; fDesc.pluginFormatName = format;


@@ -743,7 +1007,7 @@ public:
// set default options // set default options
pData->options = 0x0; pData->options = 0x0;


//pData->options |= PLUGIN_OPTION_FIXED_BUFFERS;
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS;
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
//pData->options |= PLUGIN_OPTION_USE_CHUNKS; //pData->options |= PLUGIN_OPTION_USE_CHUNKS;


@@ -764,6 +1028,9 @@ public:


// load settings // load settings
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); pData->options = pData->loadSettings(pData->options, getOptionsAvailable());

// ignore settings, we need this anyway
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS;
} }


return true; return true;
@@ -777,6 +1044,8 @@ private:
AudioSampleBuffer fAudioBuffer; AudioSampleBuffer fAudioBuffer;
MidiBuffer fMidiBuffer; MidiBuffer fMidiBuffer;


const char* fUniqueId;

ScopedPointer<JucePluginWindow> fWindow; ScopedPointer<JucePluginWindow> fWindow;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JucePlugin) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JucePlugin)
@@ -792,12 +1061,12 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init, const char* const format) CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init, const char* const format)
{ {
carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, format);
carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s)", init.engine, init.filename, init.name, init.label, init.uniqueId, format);


#ifdef HAVE_JUCE #ifdef HAVE_JUCE
JucePlugin* const plugin(new JucePlugin(init.engine, init.id)); JucePlugin* const plugin(new JucePlugin(init.engine, init.id));


if (! plugin->init(init.filename, init.name, init.label, format))
if (! plugin->init(init.filename, init.name, init.label, init.uniqueId, format))
{ {
delete plugin; delete plugin;
return nullptr; return nullptr;


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

@@ -135,11 +135,11 @@ public:
return CarlaPlugin::getCategory(); return CarlaPlugin::getCategory();
} }


long getUniqueId() const noexcept override
int64_t getUniqueId() const noexcept override
{ {
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0); CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0);


return static_cast<long>(fDescriptor->UniqueID);
return static_cast<int64_t>(fDescriptor->UniqueID);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -1499,7 +1499,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* const rdfDescriptor) CarlaPlugin* CarlaPlugin::newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* const rdfDescriptor)
{ {
carla_debug("CarlaPlugin::newLADSPA({%p, \"%s\", \"%s\", \"%s\"}, %p)", init.engine, init.filename, init.name, init.label, rdfDescriptor);
carla_debug("CarlaPlugin::newLADSPA({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %p)", init.engine, init.filename, init.name, init.label, init.uniqueId, rdfDescriptor);


#ifdef WANT_LADSPA #ifdef WANT_LADSPA
LadspaPlugin* const plugin(new LadspaPlugin(init.engine, init.id)); LadspaPlugin* const plugin(new LadspaPlugin(init.engine, init.id));


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

@@ -1356,7 +1356,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newLinuxSampler(const Initializer& init, const char* const format, const bool use16Outs) CarlaPlugin* CarlaPlugin::newLinuxSampler(const Initializer& init, const char* const format, const bool use16Outs)
{ {
carla_debug("LinuxSamplerPlugin::newLinuxSampler({%p, \"%s\", \"%s\", \"%s\"}, %s, %s)", init.engine, init.filename, init.name, init.label, format, bool2str(use16Outs));
carla_debug("LinuxSamplerPlugin::newLinuxSampler({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "}, %s, %s)", init.engine, init.filename, init.name, init.label, init.uniqueId, format, bool2str(use16Outs));


#ifdef WANT_LINUXSAMPLER #ifdef WANT_LINUXSAMPLER
if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs) if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs)


+ 8
- 7
source/backend/plugin/Lv2Plugin.cpp View File

@@ -577,11 +577,11 @@ public:
return CarlaPlugin::getCategory(); return CarlaPlugin::getCategory();
} }


long getUniqueId() const noexcept override
int64_t getUniqueId() const noexcept override
{ {
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, 0); CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, 0);


return static_cast<long>(fRdfDescriptor->UniqueID);
return static_cast<int64_t>(fRdfDescriptor->UniqueID);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -2820,16 +2820,17 @@ public:
midiData[1] = static_cast<uint8_t>(ctrlEvent.param); midiData[1] = static_cast<uint8_t>(ctrlEvent.param);
midiData[2] = uint8_t(ctrlEvent.value*127.0f); midiData[2] = uint8_t(ctrlEvent.value*127.0f);


const uint32_t mtime(isSampleAccurate ? startTime : event.time);

if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM)
lv2_atom_buffer_write(&evInAtomIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData);
lv2_atom_buffer_write(&evInAtomIters[fEventsIn.ctrlIndex], mtime, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData);


else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT)
lv2_event_write(&evInEventIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData);
lv2_event_write(&evInEventIters[fEventsIn.ctrlIndex], mtime, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData);


else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL)
lv2midi_put_event(&evInMidiStates[fEventsIn.ctrlIndex], 0.0, 3, midiData);
lv2midi_put_event(&evInMidiStates[fEventsIn.ctrlIndex], mtime, 3, midiData);
} }

break; break;
} // case kEngineControlEventTypeParameter } // case kEngineControlEventTypeParameter


@@ -5517,7 +5518,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newLV2(const Initializer& init) CarlaPlugin* CarlaPlugin::newLV2(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newLV2({%p, \"%s\", \"%s\"})", init.engine, init.name, init.label);
carla_debug("CarlaPlugin::newLV2({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.name, init.label, init.uniqueId);


#ifdef WANT_LV2 #ifdef WANT_LV2
Lv2Plugin* const plugin(new Lv2Plugin(init.engine, init.id)); Lv2Plugin* const plugin(new Lv2Plugin(init.engine, init.id));


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

@@ -2470,7 +2470,7 @@ const NativePluginDescriptor* CarlaPlugin::getNativePluginDescriptor(const size_


CarlaPlugin* CarlaPlugin::newNative(const Initializer& init) CarlaPlugin* CarlaPlugin::newNative(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newNative({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label);
carla_debug("CarlaPlugin::newNative({%p, \"%s\", \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.label, init.uniqueId);


#ifdef WANT_NATIVE #ifdef WANT_NATIVE
NativePlugin* const plugin(new NativePlugin(init.engine, init.id)); NativePlugin* const plugin(new NativePlugin(init.engine, init.id));


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

@@ -1067,7 +1067,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newReWire(const Initializer& init) CarlaPlugin* CarlaPlugin::newReWire(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newReWire({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name);
carla_debug("CarlaPlugin::newReWire({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId);


#ifdef WANT_REWIRE #ifdef WANT_REWIRE
ReWirePlugin* const plugin(new ReWirePlugin(init.engine, init.id)); ReWirePlugin* const plugin(new ReWirePlugin(init.engine, init.id));


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

@@ -23,7 +23,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newVST3(const Initializer& init) CarlaPlugin* CarlaPlugin::newVST3(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name);
carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId);


#if defined(WANT_VST) && defined(HAVE_JUCE) #if defined(WANT_VST) && defined(HAVE_JUCE)
return newJuce(init, "VST3"); return newJuce(init, "VST3");


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

@@ -162,11 +162,11 @@ public:
return CarlaPlugin::getCategory(); return CarlaPlugin::getCategory();
} }


long getUniqueId() const noexcept override
int64_t getUniqueId() const noexcept override
{ {
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, 0); CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr, 0);


return static_cast<long>(fEffect->uniqueID);
return static_cast<int64_t>(fEffect->uniqueID);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -2081,7 +2081,7 @@ protected:
// ------------------------------------------------------------------- // -------------------------------------------------------------------


public: public:
bool init(const char* const filename, const char* const name)
bool init(const char* const filename, const char* const name, const int64_t uniqueId)
{ {
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false);


@@ -2270,6 +2270,9 @@ public:
} }


return true; return true;

// unused
(void)uniqueId;
} }


private: private:
@@ -2463,7 +2466,7 @@ CARLA_BACKEND_START_NAMESPACE


CarlaPlugin* CarlaPlugin::newVST(const Initializer& init) CarlaPlugin* CarlaPlugin::newVST(const Initializer& init)
{ {
carla_debug("CarlaPlugin::newVST({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name);
carla_debug("CarlaPlugin::newVST({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId);


#ifdef WANT_VST #ifdef WANT_VST
# if defined(HAVE_JUCE) && USE_JUCE_FOR_VST # if defined(HAVE_JUCE) && USE_JUCE_FOR_VST
@@ -2471,7 +2474,7 @@ CarlaPlugin* CarlaPlugin::newVST(const Initializer& init)
# else # else
VstPlugin* const plugin(new VstPlugin(init.engine, init.id)); VstPlugin* const plugin(new VstPlugin(init.engine, init.id));


if (! plugin->init(init.filename, init.name))
if (! plugin->init(init.filename, init.name, init.uniqueId))
{ {
delete plugin; delete plugin;
return nullptr; return nullptr;


+ 3
- 3
source/backend/standalone/CarlaStandalone.cpp View File

@@ -927,13 +927,13 @@ const CarlaTransportInfo* carla_get_transport_info()


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


bool carla_add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* name, const char* label, const void* extraPtr)
bool carla_add_plugin(BinaryType btype, PluginType ptype, const char* filename, const char* name, const char* label, int64_t uniqueId, const void* extraPtr)
{ {
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0', false);
carla_debug("carla_add_plugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", %p)", btype, CB::BinaryType2Str(btype), ptype, CB::PluginType2Str(ptype), filename, name, label, extraPtr);
carla_debug("carla_add_plugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p)", btype, CB::BinaryType2Str(btype), ptype, CB::PluginType2Str(ptype), filename, name, label, uniqueId, extraPtr);


if (gStandalone.engine != nullptr) if (gStandalone.engine != nullptr)
return gStandalone.engine->addPlugin(btype, ptype, filename, name, label, extraPtr);
return gStandalone.engine->addPlugin(btype, ptype, filename, name, label, uniqueId, extraPtr);


carla_stderr2("Engine is not running"); carla_stderr2("Engine is not running");
gStandalone.lastError = "Engine is not running"; gStandalone.lastError = "Engine is not running";


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

@@ -553,9 +553,9 @@ int main(int argc, char* argv[])
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Check argument count // Check argument count


if (argc != 6 && argc != 7)
if (argc != 7)
{ {
carla_stdout("usage: %s <osc-url|\"null\"> <type> <filename> <name|\"(none)\"> <label>", argv[0]);
carla_stdout("usage: %s <osc-url|\"null\"> <type> <filename> <name|\"(none)\"> <label> <uniqueId>", argv[0]);
return 1; return 1;
} }


@@ -567,6 +567,7 @@ int main(int argc, char* argv[])
const char* const filename = argv[3]; const char* const filename = argv[3];
const char* name = argv[4]; const char* name = argv[4];
const char* label = argv[5]; const char* label = argv[5];
const int64_t uniqueId = static_cast<int64_t>(std::atol(argv[6]));


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Setup args // Setup args
@@ -659,7 +660,7 @@ int main(int argc, char* argv[])


int ret; int ret;


if (carla_add_plugin(CarlaBackend::BINARY_NATIVE, itype, filename, name, label, extraStuff))
if (carla_add_plugin(CarlaBackend::BINARY_NATIVE, itype, filename, name, label, uniqueId, extraStuff))
{ {
if (useOsc) if (useOsc)
{ {


+ 5
- 4
source/carla_backend.py View File

@@ -1019,7 +1019,7 @@ class CarlaPluginInfo(Structure):


# Plugin unique Id. # Plugin unique Id.
# This Id is dependant on the plugin type and may sometimes be 0. # This Id is dependant on the plugin type and may sometimes be 0.
("uniqueId", c_long)
("uniqueId", c_int64)
] ]


# Information about an internal Carla plugin. # Information about an internal Carla plugin.
@@ -1349,12 +1349,13 @@ class Host(object):
# @param filename Filename, if applicable # @param filename Filename, if applicable
# @param name Name of the plugin, can be NULL # @param name Name of the plugin, can be NULL
# @param label Plugin label, if applicable # @param label Plugin label, if applicable
# @param uniqueId Plugin unique Id, if applicable
# @param extraPtr Extra pointer, defined per plugin type # @param extraPtr Extra pointer, defined per plugin type
def add_plugin(self, btype, ptype, filename, name, label, extraPtr):
def add_plugin(self, btype, ptype, filename, name, label, uniqueId, extraPtr):
cfilename = filename.encode("utf-8") if filename else None cfilename = filename.encode("utf-8") if filename else None
cname = name.encode("utf-8") if name else None cname = name.encode("utf-8") if name else None
clabel = label.encode("utf-8") if label else None clabel = label.encode("utf-8") if label else None
return bool(self.lib.carla_add_plugin(btype, ptype, cfilename, cname, clabel, cast(extraPtr, c_void_p)))
return bool(self.lib.carla_add_plugin(btype, ptype, cfilename, cname, clabel, uniqueId, cast(extraPtr, c_void_p)))


# Remove a plugin. # Remove a plugin.
# @param pluginId Plugin to remove. # @param pluginId Plugin to remove.
@@ -1782,7 +1783,7 @@ class Host(object):
self.lib.carla_get_transport_info.argtypes = None self.lib.carla_get_transport_info.argtypes = None
self.lib.carla_get_transport_info.restype = POINTER(CarlaTransportInfo) self.lib.carla_get_transport_info.restype = POINTER(CarlaTransportInfo)


self.lib.carla_add_plugin.argtypes = [c_enum, c_enum, c_char_p, c_char_p, c_char_p, c_void_p]
self.lib.carla_add_plugin.argtypes = [c_enum, c_enum, c_char_p, c_char_p, c_char_p, c_int64, c_void_p]
self.lib.carla_add_plugin.restype = c_bool self.lib.carla_add_plugin.restype = c_bool


self.lib.carla_remove_plugin.argtypes = [c_uint] self.lib.carla_remove_plugin.argtypes = [c_uint]


+ 2
- 1
source/carla_host.py View File

@@ -860,9 +860,10 @@ class HostWindow(QMainWindow):
ptype = dialog.fRetPlugin['type'] ptype = dialog.fRetPlugin['type']
filename = dialog.fRetPlugin['filename'] filename = dialog.fRetPlugin['filename']
label = dialog.fRetPlugin['label'] label = dialog.fRetPlugin['label']
uniqueId = dialog.fRetPlugin['uniqueId']
extraPtr = self.getExtraPtr(dialog.fRetPlugin) extraPtr = self.getExtraPtr(dialog.fRetPlugin)


if not Carla.host.add_plugin(btype, ptype, filename, None, label, extraPtr):
if not Carla.host.add_plugin(btype, ptype, filename, None, label, uniqueId, extraPtr):
CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), charPtrToString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), charPtrToString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok)
return return




+ 24
- 5
source/utils/CarlaPipeUtils.hpp View File

@@ -301,7 +301,7 @@ public:
return false; return false;
} }


bool readNextLineAsInt(int& value)
bool readNextLineAsInt(int32_t& value)
{ {
CARLA_SAFE_ASSERT_RETURN(fIsReading, false); CARLA_SAFE_ASSERT_RETURN(fIsReading, false);


@@ -315,18 +315,18 @@ public:
return false; return false;
} }


bool readNextLineAsUInt(uint& value)
bool readNextLineAsUInt(uint32_t& value)
{ {
CARLA_SAFE_ASSERT_RETURN(fIsReading, false); CARLA_SAFE_ASSERT_RETURN(fIsReading, false);


if (const char* const msg = readline()) if (const char* const msg = readline())
{ {
int tmp = std::atoi(msg);
int32_t tmp = std::atoi(msg);
delete[] msg; delete[] msg;


if (tmp >= 0) if (tmp >= 0)
{ {
value = static_cast<uint>(tmp);
value = static_cast<uint32_t>(tmp);
return true; return true;
} }
} }
@@ -334,7 +334,7 @@ public:
return false; return false;
} }


bool readNextLineAsLong(long& value)
bool readNextLineAsLong(int64_t& value)
{ {
CARLA_SAFE_ASSERT_RETURN(fIsReading, false); CARLA_SAFE_ASSERT_RETURN(fIsReading, false);


@@ -348,6 +348,25 @@ public:
return false; return false;
} }


bool readNextLineAsULong(uint64_t& value)
{
CARLA_SAFE_ASSERT_RETURN(fIsReading, false);

if (const char* const msg = readline())
{
int64_t tmp = std::atol(msg);
delete[] msg;

if (tmp >= 0)
{
value = static_cast<uint64_t>(tmp);
return true;
}
}

return false;
}

bool readNextLineAsFloat(float& value) bool readNextLineAsFloat(float& value)
{ {
CARLA_SAFE_ASSERT_RETURN(fIsReading, false); CARLA_SAFE_ASSERT_RETURN(fIsReading, false);


+ 8
- 8
source/utils/CarlaStateUtils.cpp View File

@@ -86,7 +86,7 @@ SaveState::SaveState() noexcept
name(nullptr), name(nullptr),
label(nullptr), label(nullptr),
binary(nullptr), binary(nullptr),
uniqueID(0),
uniqueId(0),
active(false), active(false),
dryWet(1.0f), dryWet(1.0f),
volume(1.0f), volume(1.0f),
@@ -138,7 +138,7 @@ void SaveState::reset()
chunk = nullptr; chunk = nullptr;
} }


uniqueID = 0;
uniqueId = 0;
active = false; active = false;
dryWet = 1.0f; dryWet = 1.0f;
volume = 1.0f; volume = 1.0f;
@@ -225,8 +225,8 @@ void fillSaveStateFromXmlNode(SaveState& saveState, const QDomNode& xmlNode)
else if (tag.compare("uniqueid", Qt::CaseInsensitive) == 0) else if (tag.compare("uniqueid", Qt::CaseInsensitive) == 0)
{ {
bool ok; bool ok;
const long uniqueID(text.toLong(&ok));
if (ok) saveState.uniqueID = uniqueID;
const qlonglong uniqueId(text.toLongLong(&ok));
if (ok) saveState.uniqueId = static_cast<int64_t>(uniqueId);
} }
} }
} }
@@ -426,7 +426,7 @@ void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
case PLUGIN_LADSPA: case PLUGIN_LADSPA:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true)); info += QString(" <Label>%1</Label>\n").arg(xmlSafeString(saveState.label, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueID);
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
break; break;
case PLUGIN_DSSI: case PLUGIN_DSSI:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
@@ -438,17 +438,17 @@ void fillXmlStringFromSaveState(QString& content, const SaveState& saveState)
break; break;
case PLUGIN_VST: case PLUGIN_VST:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueID);
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
break; break;
case PLUGIN_VST3: case PLUGIN_VST3:
// TODO? // TODO?
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueID);
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
break; break;
case PLUGIN_AU: case PLUGIN_AU:
// TODO? // TODO?
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueID);
info += QString(" <UniqueID>%1</UniqueID>\n").arg(saveState.uniqueId);
break; break;
case PLUGIN_JACK: case PLUGIN_JACK:
info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true)); info += QString(" <Binary>%1</Binary>\n").arg(xmlSafeString(saveState.binary, true));


+ 1
- 1
source/utils/CarlaStateUtils.hpp View File

@@ -69,7 +69,7 @@ struct SaveState {
const char* name; const char* name;
const char* label; const char* label;
const char* binary; const char* binary;
long uniqueID;
int64_t uniqueId;


bool active; bool active;
float dryWet; float dryWet;


+ 26
- 0
source/utils/CarlaString.hpp View File

@@ -127,6 +127,32 @@ public:
_dup(strBuf); _dup(strBuf);
} }


/*
* Long long integer.
*/
explicit CarlaString(const long long int value)
{
char strBuf[0xff+1];
carla_zeroChar(strBuf, 0xff+1);
std::snprintf(strBuf, 0xff, "%lld", value);

_init();
_dup(strBuf);
}

/*
* Long long unsigned integer, possibly hexadecimal.
*/
explicit CarlaString(const unsigned long long int value, const bool hexadecimal = false)
{
char strBuf[0xff+1];
carla_zeroChar(strBuf, 0xff+1);
std::snprintf(strBuf, 0xff, hexadecimal ? "0x%llx" : "%llu", value);

_init();
_dup(strBuf);
}

/* /*
* Single-precision floating point number. * Single-precision floating point number.
*/ */


Loading…
Cancel
Save