@@ -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; | ||||
@@ -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. | ||||
@@ -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; | ||||
@@ -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); | ||||
@@ -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); | ||||
@@ -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"); | ||||
@@ -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)); | ||||
@@ -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 | ||||
@@ -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 | ||||
{ | { | ||||
@@ -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)); | ||||
@@ -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)); | ||||
@@ -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) | ||||
@@ -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; | ||||
@@ -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)); | ||||
@@ -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) | ||||
@@ -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)); | ||||
@@ -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)); | ||||
@@ -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)); | ||||
@@ -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"); | ||||
@@ -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; | ||||
@@ -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"; | ||||
@@ -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) | ||||
{ | { | ||||
@@ -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] | ||||
@@ -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 | ||||
@@ -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); | ||||
@@ -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)); | ||||
@@ -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; | ||||
@@ -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. | ||||
*/ | */ | ||||