@@ -729,6 +729,15 @@ typedef enum { | |||
*/ | |||
ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED = 10, | |||
/*! | |||
* A plugin option has changed. | |||
* @param pluginId Plugin Id | |||
* @param value1 Option | |||
* @param value2 New on/off state (1 for on, 0 for off) | |||
* @see PluginOptions | |||
*/ | |||
ENGINE_CALLBACK_OPTION_CHANGED = 11, | |||
/*! | |||
* A plugin's custom UI state has changed. | |||
* @param pluginId Plugin Id | |||
@@ -737,7 +746,7 @@ typedef enum { | |||
* 1: UI is now visible\n | |||
* -1: UI has crashed and should not be shown again | |||
*/ | |||
ENGINE_CALLBACK_UI_STATE_CHANGED = 11, | |||
ENGINE_CALLBACK_UI_STATE_CHANGED = 12, | |||
/*! | |||
* A note has been pressed. | |||
@@ -746,7 +755,7 @@ typedef enum { | |||
* @param value2 Note | |||
* @param value3 Velocity | |||
*/ | |||
ENGINE_CALLBACK_NOTE_ON = 12, | |||
ENGINE_CALLBACK_NOTE_ON = 13, | |||
/*! | |||
* A note has been released. | |||
@@ -754,37 +763,37 @@ typedef enum { | |||
* @param value1 Channel | |||
* @param value2 Note | |||
*/ | |||
ENGINE_CALLBACK_NOTE_OFF = 13, | |||
ENGINE_CALLBACK_NOTE_OFF = 14, | |||
/*! | |||
* A plugin needs update. | |||
* @param pluginId Plugin Id | |||
*/ | |||
ENGINE_CALLBACK_UPDATE = 14, | |||
ENGINE_CALLBACK_UPDATE = 15, | |||
/*! | |||
* A plugin's data/information has changed. | |||
* @param pluginId Plugin Id | |||
*/ | |||
ENGINE_CALLBACK_RELOAD_INFO = 15, | |||
ENGINE_CALLBACK_RELOAD_INFO = 16, | |||
/*! | |||
* A plugin's parameters have changed. | |||
* @param pluginId Plugin Id | |||
*/ | |||
ENGINE_CALLBACK_RELOAD_PARAMETERS = 16, | |||
ENGINE_CALLBACK_RELOAD_PARAMETERS = 17, | |||
/*! | |||
* A plugin's programs have changed. | |||
* @param pluginId Plugin Id | |||
*/ | |||
ENGINE_CALLBACK_RELOAD_PROGRAMS = 17, | |||
ENGINE_CALLBACK_RELOAD_PROGRAMS = 18, | |||
/*! | |||
* A plugin state has changed. | |||
* @param pluginId Plugin Id | |||
*/ | |||
ENGINE_CALLBACK_RELOAD_ALL = 18, | |||
ENGINE_CALLBACK_RELOAD_ALL = 19, | |||
/*! | |||
* A patchbay client has been added. | |||
@@ -794,20 +803,20 @@ typedef enum { | |||
* @param valueStr Client name | |||
* @see PatchbayIcon | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 19, | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 20, | |||
/*! | |||
* A patchbay client has been removed. | |||
* @param pluginId Client Id | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 20, | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 21, | |||
/*! | |||
* A patchbay client has been renamed. | |||
* @param pluginId Client Id | |||
* @param valueStr New client name | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 21, | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 22, | |||
/*! | |||
* A patchbay client data has changed. | |||
@@ -816,7 +825,7 @@ typedef enum { | |||
* @param value2 New plugin Id (-1 if not a plugin) | |||
* @see PatchbayIcon | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22, | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 23, | |||
/*! | |||
* A patchbay port has been added. | |||
@@ -826,14 +835,14 @@ typedef enum { | |||
* @param valueStr Port name | |||
* @see PatchbayPortHints | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 23, | |||
ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 24, | |||
/*! | |||
* A patchbay port has been removed. | |||
* @param pluginId Client Id | |||
* @param value1 Port Id | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 24, | |||
ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 25, | |||
/*! | |||
* A patchbay port has been renamed. | |||
@@ -841,20 +850,20 @@ typedef enum { | |||
* @param value1 Port Id | |||
* @param valueStr New port name | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 25, | |||
ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 26, | |||
/*! | |||
* A patchbay connection has been added. | |||
* @param pluginId Connection Id | |||
* @param valueStr Out group and port plus in group and port, in "og:op:ig:ip" syntax. | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED = 26, | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED = 27, | |||
/*! | |||
* A patchbay connection has been removed. | |||
* @param pluginId Connection Id | |||
*/ | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27, | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 28, | |||
/*! | |||
* Engine started. | |||
@@ -864,62 +873,62 @@ typedef enum { | |||
* @see EngineProcessMode | |||
* @see EngineTransportMode | |||
*/ | |||
ENGINE_CALLBACK_ENGINE_STARTED = 28, | |||
ENGINE_CALLBACK_ENGINE_STARTED = 29, | |||
/*! | |||
* Engine stopped. | |||
*/ | |||
ENGINE_CALLBACK_ENGINE_STOPPED = 29, | |||
ENGINE_CALLBACK_ENGINE_STOPPED = 30, | |||
/*! | |||
* Engine process mode has changed. | |||
* @param value1 New process mode | |||
* @see EngineProcessMode | |||
*/ | |||
ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 30, | |||
ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 31, | |||
/*! | |||
* Engine transport mode has changed. | |||
* @param value1 New transport mode | |||
* @see EngineTransportMode | |||
*/ | |||
ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 31, | |||
ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 32, | |||
/*! | |||
* Engine buffer-size changed. | |||
* @param value1 New buffer size | |||
*/ | |||
ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 32, | |||
ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 33, | |||
/*! | |||
* Engine sample-rate changed. | |||
* @param value3 New sample rate | |||
*/ | |||
ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 33, | |||
ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 34, | |||
/*! | |||
* Idle frontend.\n | |||
* This is used by the engine during long operations that might block the frontend, | |||
* giving it the possibility to idle while the operation is still in place. | |||
*/ | |||
ENGINE_CALLBACK_IDLE = 34, | |||
ENGINE_CALLBACK_IDLE = 35, | |||
/*! | |||
* Show a message as information. | |||
* @param valueStr The message | |||
*/ | |||
ENGINE_CALLBACK_INFO = 35, | |||
ENGINE_CALLBACK_INFO = 36, | |||
/*! | |||
* Show a message as an error. | |||
* @param valueStr The message | |||
*/ | |||
ENGINE_CALLBACK_ERROR = 36, | |||
ENGINE_CALLBACK_ERROR = 37, | |||
/*! | |||
* The engine has crashed or malfunctioned and will no longer work. | |||
*/ | |||
ENGINE_CALLBACK_QUIT = 37 | |||
ENGINE_CALLBACK_QUIT = 38 | |||
} EngineCallbackOpcode; | |||
@@ -430,7 +430,7 @@ public: | |||
* | |||
* \see getOptions() and getAvailableOptions() | |||
*/ | |||
void setOption(const uint option, const bool yesNo); | |||
void setOption(const uint option, const bool yesNo, const bool sendCallback); | |||
/*! | |||
* Enable or disable the plugin according to \a yesNo. \n | |||
@@ -2069,7 +2069,7 @@ void carla_set_option(uint pluginId, uint option, bool yesNo) | |||
carla_debug("carla_set_option(%i, %i, %s)", pluginId, option, bool2str(yesNo)); | |||
if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId)) | |||
return plugin->setOption(option, yesNo); | |||
return plugin->setOption(option, yesNo, false); | |||
carla_stderr2("carla_set_option(%i, %i, %s) - could not find plugin", pluginId, option, bool2str(yesNo)); | |||
} | |||
@@ -296,7 +296,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | |||
if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | |||
plugin->setOption(option, yesNo); | |||
plugin->setOption(option, yesNo, false); | |||
} | |||
else if (std::strcmp(msg, "set_active") == 0) | |||
{ | |||
@@ -528,6 +528,8 @@ const StateSave& CarlaPlugin::getStateSave() | |||
pData->stateSave.name = carla_strdup(pData->name); | |||
pData->stateSave.label = carla_strdup(strBuf); | |||
pData->stateSave.uniqueId = getUniqueId(); | |||
pData->stateSave.options = pData->options; | |||
carla_stdout("Options: 0x%x | 0x%x", pData->options, pData->stateSave.options); | |||
if (pData->filename != nullptr) | |||
pData->stateSave.binary = carla_strdup(pData->filename); | |||
@@ -844,6 +846,17 @@ void CarlaPlugin::loadStateSave(const StateSave& stateSave) | |||
// --------------------------------------------------------------- | |||
// Part 6 - set internal stuff | |||
const uint availOptions(getOptionsAvailable()); | |||
for (int i=0; i<10; ++i) // FIXME - get this value somehow... | |||
{ | |||
const uint option(1 << i); | |||
if (availOptions & option) | |||
setOption(option, (stateSave.options & option) != 0, true); | |||
} | |||
#ifndef BUILD_BRIDGE | |||
setDryWet(stateSave.dryWet, true, true); | |||
setVolume(stateSave.volume, true, true); | |||
@@ -918,7 +931,7 @@ void CarlaPlugin::setName(const char* const newName) | |||
pData->name = carla_strdup(newName); | |||
} | |||
void CarlaPlugin::setOption(const uint option, const bool yesNo) | |||
void CarlaPlugin::setOption(const uint option, const bool yesNo, const bool sendCallback) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(getOptionsAvailable() & option,); | |||
@@ -927,9 +940,8 @@ void CarlaPlugin::setOption(const uint option, const bool yesNo) | |||
else | |||
pData->options &= ~option; | |||
#ifndef BUILD_BRIDGE | |||
pData->saveSetting(option, yesNo); | |||
#endif | |||
if (sendCallback) | |||
pData->engine->callback(ENGINE_CALLBACK_OPTION_CHANGED, pData->id, option, yesNo ? 1 : 0, 0.0f, nullptr); | |||
} | |||
void CarlaPlugin::setEnabled(const bool yesNo) noexcept | |||
@@ -21,17 +21,8 @@ | |||
#include "CarlaLibCounter.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
// FIXME | |||
#include <QtCore/QSettings> | |||
// ----------------------------------------------------------------------- | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
// ------------------------------------------------------------------- | |||
// Fallback data | |||
@@ -465,9 +456,6 @@ CarlaPlugin::ProtectedData::ProtectedData(CarlaEngine* const eng, const uint idx | |||
name(nullptr), | |||
filename(nullptr), | |||
iconName(nullptr), | |||
#ifndef BUILD_BRIDGE | |||
identifier(nullptr), | |||
#endif | |||
osc(eng, plug) {} | |||
CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||
@@ -516,14 +504,6 @@ CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||
iconName = nullptr; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
if (identifier != nullptr) | |||
{ | |||
delete[] identifier; | |||
identifier = nullptr; | |||
} | |||
#endif | |||
for (LinkedList<CustomData>::Itenerator it = custom.begin(); it.valid(); it.next()) | |||
{ | |||
CustomData& cData(it.getValue()); | |||
@@ -704,91 +684,6 @@ void* CarlaPlugin::ProtectedData::uiLibSymbol(const char* const symbol) const no | |||
return lib_symbol(uiLib, symbol); | |||
} | |||
#ifndef BUILD_BRIDGE | |||
// ----------------------------------------------------------------------- | |||
// Settings functions | |||
void CarlaPlugin::ProtectedData::saveSetting(const uint option, const bool yesNo) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(identifier != nullptr && identifier[0] != '\0',); | |||
QSettings settings("falkTX", "CarlaPluginSettings"); | |||
settings.beginGroup(identifier); | |||
switch (option) | |||
{ | |||
case PLUGIN_OPTION_FIXED_BUFFERS: | |||
settings.setValue("FixedBuffers", yesNo); | |||
break; | |||
case PLUGIN_OPTION_FORCE_STEREO: | |||
settings.setValue("ForceStereo", yesNo); | |||
break; | |||
case PLUGIN_OPTION_MAP_PROGRAM_CHANGES: | |||
settings.setValue("MapProgramChanges", yesNo); | |||
break; | |||
case PLUGIN_OPTION_USE_CHUNKS: | |||
settings.setValue("UseChunks", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_CONTROL_CHANGES: | |||
settings.setValue("SendControlChanges", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_CHANNEL_PRESSURE: | |||
settings.setValue("SendChannelPressure", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH: | |||
settings.setValue("SendNoteAftertouch", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_PITCHBEND: | |||
settings.setValue("SendPitchbend", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_ALL_SOUND_OFF: | |||
settings.setValue("SendAllSoundOff", yesNo); | |||
break; | |||
default: | |||
break; | |||
} | |||
settings.endGroup(); | |||
} | |||
uint CarlaPlugin::ProtectedData::loadSettings(const uint curOptions, const uint availOptions) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(identifier != nullptr && identifier[0] != '\0', 0x0); | |||
QSettings settings("falkTX", "CarlaPluginSettings"); | |||
settings.beginGroup(identifier); | |||
uint newOptions = 0x0; | |||
#define CHECK_AND_SET_OPTION(STR, BIT) \ | |||
if ((availOptions & BIT) != 0 || BIT == PLUGIN_OPTION_FORCE_STEREO) \ | |||
{ \ | |||
if (settings.contains(STR)) \ | |||
{ \ | |||
if (settings.value(STR, bool((curOptions & BIT) != 0)).toBool()) \ | |||
newOptions |= BIT; \ | |||
} \ | |||
else if (curOptions & BIT) \ | |||
newOptions |= BIT; \ | |||
} | |||
CHECK_AND_SET_OPTION("FixedBuffers", PLUGIN_OPTION_FIXED_BUFFERS); | |||
CHECK_AND_SET_OPTION("ForceStereo", PLUGIN_OPTION_FORCE_STEREO); | |||
CHECK_AND_SET_OPTION("MapProgramChanges", PLUGIN_OPTION_MAP_PROGRAM_CHANGES); | |||
CHECK_AND_SET_OPTION("UseChunks", PLUGIN_OPTION_USE_CHUNKS); | |||
CHECK_AND_SET_OPTION("SendControlChanges", PLUGIN_OPTION_SEND_CONTROL_CHANGES); | |||
CHECK_AND_SET_OPTION("SendChannelPressure", PLUGIN_OPTION_SEND_CHANNEL_PRESSURE); | |||
CHECK_AND_SET_OPTION("SendNoteAftertouch", PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH); | |||
CHECK_AND_SET_OPTION("SendPitchbend", PLUGIN_OPTION_SEND_PITCHBEND); | |||
CHECK_AND_SET_OPTION("SendAllSoundOff", PLUGIN_OPTION_SEND_ALL_SOUND_OFF); | |||
#undef CHECK_AND_SET_OPTION | |||
settings.endGroup(); | |||
return newOptions; | |||
} | |||
// ----------------------------------------------------------------------- | |||
void CarlaPlugin::ProtectedData::tryTransient() noexcept | |||
@@ -796,7 +691,6 @@ void CarlaPlugin::ProtectedData::tryTransient() noexcept | |||
if (engine->getOptions().frontendWinId != 0) | |||
transientTryCounter = 1; | |||
} | |||
#endif | |||
void CarlaPlugin::ProtectedData::updateParameterValues(CarlaPlugin* const plugin, const bool sendOsc, const bool sendCallback, const bool useDefault) noexcept | |||
{ | |||
@@ -240,9 +240,6 @@ struct CarlaPlugin::ProtectedData { | |||
const char* name; | |||
const char* filename; | |||
const char* iconName; | |||
#ifndef BUILD_BRIDGE | |||
const char* identifier; // used for save/restore settings per plugin | |||
#endif | |||
// data 2 | |||
PluginAudioData audioIn; | |||
@@ -345,19 +342,10 @@ struct CarlaPlugin::ProtectedData { | |||
bool uiLibClose() noexcept; | |||
void* uiLibSymbol(const char* const symbol) const noexcept; | |||
#ifndef BUILD_BRIDGE | |||
// ------------------------------------------------------------------- | |||
// Settings functions | |||
void saveSetting(const uint option, const bool yesNo) const; | |||
uint loadSettings(const uint options, const uint availOptions) const; | |||
// ------------------------------------------------------------------- | |||
// Misc | |||
void tryTransient() noexcept; | |||
#endif | |||
void updateParameterValues(CarlaPlugin* const plugin, const bool sendOsc, const bool sendCallback, const bool useDefault) noexcept; | |||
// ------------------------------------------------------------------- | |||
@@ -2103,60 +2103,35 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
#ifdef __USE_GNU | |||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||
#else | |||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||
#endif | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
if (fUsesCustomData) | |||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
if (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
if (fDssiDescriptor->run_synth == nullptr) | |||
carla_stderr("WARNING: Plugin can ONLY use run_multiple_synths!"); | |||
} | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("DSSI/"); | |||
if (const char* const shortname = std::strrchr(filename, OS_SEP)) | |||
{ | |||
identifier += shortname+1; | |||
identifier += ","; | |||
} | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
if (fUsesCustomData) | |||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
if (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
// ignore settings, we need this anyway | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
if (fDssiDescriptor->run_synth == nullptr) | |||
carla_stderr("WARNING: Plugin can ONLY use run_multiple_synths!"); | |||
} | |||
return true; | |||
@@ -1621,32 +1621,13 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("SF2/"); | |||
if (const char* const shortname = std::strrchr(filename, OS_SEP)) | |||
identifier += shortname+1; | |||
else | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
#endif | |||
} | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
return true; | |||
} | |||
@@ -1101,38 +1101,19 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
//pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
if (fInstance->acceptsMidi()) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
String juceId(fDesc.createIdentifierString()); | |||
CarlaString identifier("Juce/"); | |||
identifier += juceId.toRawUTF8(); | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
//pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
// ignore settings, we need this anyway | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
if (fInstance->acceptsMidi()) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
return true; | |||
@@ -1604,40 +1604,21 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
#ifdef __USE_GNU | |||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||
#else | |||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||
#endif | |||
// set default options | |||
pData->options = 0x0; | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options = 0x0; | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("LADSPA/"); | |||
identifier += CarlaString(getUniqueId()); | |||
identifier += ","; | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (fLatencyIndex >= 0 || isDssiVst) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
} | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
return true; | |||
} | |||
@@ -1304,33 +1304,13 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier(fFormat); | |||
identifier += "/"; | |||
if (const char* const shortname = std::strrchr(filename, OS_SEP)) | |||
identifier += shortname+1; | |||
else | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
#endif | |||
} | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
return true; | |||
} | |||
@@ -4758,41 +4758,23 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (fLatencyIndex >= 0 || getMidiInCount() > 0 || needsFixedBuffer()) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
if (getMidiInCount() > 0) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
if (fLatencyIndex >= 0 || getMidiInCount() > 0 || needsFixedBuffer()) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("LV2/"); | |||
identifier += uri; | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
// ignore settings, we need this anyway | |||
if (fLatencyIndex >= 0 || getMidiInCount() > 0 || needsFixedBuffer()) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
if (getMidiInCount() > 0) | |||
{ | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
// --------------------------------------------------------------- | |||
@@ -53,7 +53,7 @@ CarlaPlugin.cpp.o: CarlaPlugin.cpp $(CARLA_PLUGIN_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
CarlaPluginInternal.cpp.o: CarlaPluginInternal.cpp $(CARLA_PLUGIN_INTERNAL_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(QTCORE_FLAGS) -c -o $@ | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
CarlaPluginThread.cpp.o: CarlaPluginThread.cpp $(CARLA_PLUGIN_THREAD_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(QTCORE_FLAGS) -c -o $@ | |||
@@ -2326,46 +2326,29 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | |||
// set default options | |||
pData->options = 0x0; | |||
if (hasMidiProgs && (fDescriptor->supports & ::PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options = 0x0; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_CHANNEL_PRESSURE) | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_NOTE_AFTERTOUCH) | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_PITCHBEND) | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
if (hasMidiProgs && (fDescriptor->supports & ::PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("Native/"); | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
// ignore settings, we need this anyway | |||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
} | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_CHANNEL_PRESSURE) | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_NOTE_AFTERTOUCH) | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_PITCHBEND) | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
return true; | |||
} | |||
@@ -2306,48 +2306,21 @@ public: | |||
} | |||
// --------------------------------------------------------------- | |||
// load plugin settings | |||
// set default options | |||
{ | |||
const bool hasMidiIn(hasMidiInput()); | |||
// set default options | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (fEffect->flags & effFlagsProgramChunks) | |||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
if (hasMidiIn) | |||
{ | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
// set identifier string | |||
CarlaString identifier("VST/"); | |||
pData->options = 0x0; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (const char* const shortname = std::strrchr(filename, OS_SEP)) | |||
{ | |||
identifier += shortname+1; | |||
identifier += ","; | |||
} | |||
identifier += CarlaString(static_cast<long>(fEffect->uniqueID)); | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
if (fEffect->flags & effFlagsProgramChunks) | |||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
// ignore settings, we need this anyway | |||
if (hasMidiIn) | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
#endif | |||
if (hasMidiInput()) | |||
{ | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
} | |||
return true; | |||
@@ -87,6 +87,7 @@ class CarlaMultiW(QTabWidget): | |||
parent.ParameterMidiCcChangedCallback.connect(self.fRack.slot_handleParameterMidiCcChangedCallback) | |||
parent.ProgramChangedCallback.connect(self.fRack.slot_handleProgramChangedCallback) | |||
parent.MidiProgramChangedCallback.connect(self.fRack.slot_handleMidiProgramChangedCallback) | |||
parent.OptionChangedCallback.connect(self.fRack.slot_handleOptionChangedCallback) | |||
parent.UiStateChangedCallback.connect(self.fRack.slot_handleUiStateChangedCallback) | |||
parent.NoteOnCallback.connect(self.fRack.slot_handleNoteOnCallback) | |||
parent.NoteOnCallback.connect(self.fPatchbay.slot_handleNoteOnCallback) | |||
@@ -540,46 +540,53 @@ ENGINE_CALLBACK_PROGRAM_CHANGED = 9 | |||
# @param value1 New MIDI program index | |||
ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED = 10 | |||
# A plugin option has changed. | |||
# @param pluginId Plugin Id | |||
# @param value1 Option | |||
# @param value2 New on/off state (1 for on, 0 for off) | |||
# @see PluginOptions | |||
ENGINE_CALLBACK_OPTION_CHANGED = 11 | |||
# A plugin's custom UI state has changed. | |||
# @param pluginId Plugin Id | |||
# @param value1 New state, as follows: | |||
# 0: UI is now hidden | |||
# 1: UI is now visible | |||
# -1: UI has crashed and should not be shown again | |||
ENGINE_CALLBACK_UI_STATE_CHANGED = 11 | |||
ENGINE_CALLBACK_UI_STATE_CHANGED = 12 | |||
# A note has been pressed. | |||
# @param pluginId Plugin Id | |||
# @param value1 Channel | |||
# @param value2 Note | |||
# @param value3 Velocity | |||
ENGINE_CALLBACK_NOTE_ON = 12 | |||
ENGINE_CALLBACK_NOTE_ON = 13 | |||
# A note has been released. | |||
# @param pluginId Plugin Id | |||
# @param value1 Channel | |||
# @param value2 Note | |||
ENGINE_CALLBACK_NOTE_OFF = 13 | |||
ENGINE_CALLBACK_NOTE_OFF = 14 | |||
# A plugin needs update. | |||
# @param pluginId Plugin Id | |||
ENGINE_CALLBACK_UPDATE = 14 | |||
ENGINE_CALLBACK_UPDATE = 15 | |||
# A plugin's data/information has changed. | |||
# @param pluginId Plugin Id | |||
ENGINE_CALLBACK_RELOAD_INFO = 15 | |||
ENGINE_CALLBACK_RELOAD_INFO = 16 | |||
# A plugin's parameters have changed. | |||
# @param pluginId Plugin Id | |||
ENGINE_CALLBACK_RELOAD_PARAMETERS = 16 | |||
ENGINE_CALLBACK_RELOAD_PARAMETERS = 17 | |||
# A plugin's programs have changed. | |||
# @param pluginId Plugin Id | |||
ENGINE_CALLBACK_RELOAD_PROGRAMS = 17 | |||
ENGINE_CALLBACK_RELOAD_PROGRAMS = 18 | |||
# A plugin state has changed. | |||
# @param pluginId Plugin Id | |||
ENGINE_CALLBACK_RELOAD_ALL = 18 | |||
ENGINE_CALLBACK_RELOAD_ALL = 19 | |||
# A patchbay client has been added. | |||
# @param pluginId Client Id | |||
@@ -587,23 +594,23 @@ ENGINE_CALLBACK_RELOAD_ALL = 18 | |||
# @param value2 Plugin Id (-1 if not a plugin) | |||
# @param valueStr Client name | |||
# @see PatchbayIcon | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 19 | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 20 | |||
# A patchbay client has been removed. | |||
# @param pluginId Client Id | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 20 | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 21 | |||
# A patchbay client has been renamed. | |||
# @param pluginId Client Id | |||
# @param valueStr New client name | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 21 | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 22 | |||
# A patchbay client data has changed. | |||
# @param pluginId Client Id | |||
# @param value1 New icon | |||
# @param value2 New plugin Id (-1 if not a plugin) | |||
# @see PatchbayIcon | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22 | |||
ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 23 | |||
# A patchbay port has been added. | |||
# @param pluginId Client Id | |||
@@ -611,27 +618,27 @@ ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22 | |||
# @param value2 Port hints | |||
# @param valueStr Port name | |||
# @see PatchbayPortHints | |||
ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 23 | |||
ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 24 | |||
# A patchbay port has been removed. | |||
# @param pluginId Client Id | |||
# @param value1 Port Id | |||
ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 24 | |||
ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 25 | |||
# A patchbay port has been renamed. | |||
# @param pluginId Client Id | |||
# @param value1 Port Id | |||
# @param valueStr New port name | |||
ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 25 | |||
ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 26 | |||
# A patchbay connection has been added. | |||
# @param pluginId Connection Id | |||
# @param valueStr Out group, port plus in group and port, in "og:op:ig:ip" syntax. | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED = 26 | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED = 27 | |||
# A patchbay connection has been removed. | |||
# @param pluginId Connection Id | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27 | |||
ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 28 | |||
# Engine started. | |||
# @param value1 Process mode | |||
@@ -639,44 +646,44 @@ ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27 | |||
# @param valuestr Engine driver | |||
# @see EngineProcessMode | |||
# @see EngineTransportMode | |||
ENGINE_CALLBACK_ENGINE_STARTED = 28 | |||
ENGINE_CALLBACK_ENGINE_STARTED = 29 | |||
# Engine stopped. | |||
ENGINE_CALLBACK_ENGINE_STOPPED = 29 | |||
ENGINE_CALLBACK_ENGINE_STOPPED = 30 | |||
# Engine process mode has changed. | |||
# @param value1 New process mode | |||
# @see EngineProcessMode | |||
ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 30 | |||
ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 31 | |||
# Engine transport mode has changed. | |||
# @param value1 New transport mode | |||
# @see EngineTransportMode | |||
ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 31 | |||
ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 32 | |||
# Engine buffer-size changed. | |||
# @param value1 New buffer size | |||
ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 32 | |||
ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 33 | |||
# Engine sample-rate changed. | |||
# @param value3 New sample rate | |||
ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 33 | |||
ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 34 | |||
# Idle frontend. | |||
# This is used by the engine during long operations that might block the frontend, | |||
# giving it the possibility to idle while the operation is still in place. | |||
ENGINE_CALLBACK_IDLE = 34 | |||
ENGINE_CALLBACK_IDLE = 35 | |||
# Show a message as information. | |||
# @param valueStr The message | |||
ENGINE_CALLBACK_INFO = 35 | |||
ENGINE_CALLBACK_INFO = 36 | |||
# Show a message as an error. | |||
# @param valueStr The message | |||
ENGINE_CALLBACK_ERROR = 36 | |||
ENGINE_CALLBACK_ERROR = 37 | |||
# The engine has crashed or malfunctioned and will no longer work. | |||
ENGINE_CALLBACK_QUIT = 37 | |||
ENGINE_CALLBACK_QUIT = 38 | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Engine Option | |||
@@ -134,6 +134,7 @@ class HostWindow(QMainWindow): | |||
ParameterMidiChannelChangedCallback = pyqtSignal(int, int, int) | |||
ProgramChangedCallback = pyqtSignal(int, int) | |||
MidiProgramChangedCallback = pyqtSignal(int, int) | |||
OptionChangedCallback = pyqtSignal(int, int, bool) | |||
UiStateChangedCallback = pyqtSignal(int, int) | |||
NoteOnCallback = pyqtSignal(int, int, int, int) | |||
NoteOffCallback = pyqtSignal(int, int, int) | |||
@@ -1262,6 +1263,8 @@ def engineCallback(ptr, action, pluginId, value1, value2, value3, valueStr): | |||
gCarla.gui.ProgramChangedCallback.emit(pluginId, value1) | |||
elif action == ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | |||
gCarla.gui.MidiProgramChangedCallback.emit(pluginId, value1) | |||
elif action == ENGINE_CALLBACK_OPTION_CHANGED: | |||
gCarla.gui.OptionChangedCallback.emit(pluginId, value1, bool(value2)) | |||
elif action == ENGINE_CALLBACK_UI_STATE_CHANGED: | |||
gCarla.gui.UiStateChangedCallback.emit(pluginId, value1) | |||
elif action == ENGINE_CALLBACK_NOTE_ON: | |||
@@ -225,6 +225,7 @@ class CarlaPatchbayW(QFrame): | |||
parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | |||
parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | |||
parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | |||
parent.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback) | |||
parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | |||
parent.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | |||
parent.UpdateCallback.connect(self.slot_handleUpdateCallback) | |||
@@ -728,6 +729,19 @@ class CarlaPatchbayW(QFrame): | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int, int, bool) | |||
def slot_handleOptionChangedCallback(self, pluginId, option, yesNo): | |||
if pluginId >= self.fPluginCount: | |||
return | |||
pitem = self.fPluginList[pluginId] | |||
if pitem is None: | |||
return | |||
pitem.setOption(option, yesNo) | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int, int, int, int) | |||
def slot_handleNoteOnCallback(self, pluginId, channel, note, velo): | |||
if pluginId in self.fSelectedPlugins: | |||
@@ -297,6 +297,7 @@ class CarlaRackW(QFrame): | |||
parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | |||
parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | |||
parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | |||
parent.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback) | |||
parent.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback) | |||
parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | |||
parent.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | |||
@@ -600,6 +601,19 @@ class CarlaRackW(QFrame): | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int, int, bool) | |||
def slot_handleOptionChangedCallback(self, pluginId, option, yesNo): | |||
if pluginId >= self.fPluginCount: | |||
return | |||
pitem = self.fPluginList[pluginId] | |||
if pitem is None: | |||
return | |||
pitem.widget.setOption(option, yesNo) | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int, int) | |||
def slot_handleUiStateChangedCallback(self, pluginId, state): | |||
if pluginId >= self.fPluginCount: | |||
@@ -297,6 +297,11 @@ class AbstractPluginSlot(QFrame): | |||
#------------------------------------------------------------------ | |||
def setOption(self, option, yesNo): | |||
self.fEditDialog.setOption(option, yesNo) | |||
#------------------------------------------------------------------ | |||
def sendNoteOn(self, channel, note): | |||
if self.fEditDialog.sendNoteOn(channel, note): | |||
self.midiActivityChanged(True) | |||
@@ -379,6 +384,9 @@ class AbstractPluginSlot(QFrame): | |||
self.cb_presets.setCurrentIndex(index) | |||
self.cb_presets.blockSignals(False) | |||
def optionChanged(self, option, yesNo): | |||
pass | |||
def notePressed(self, note): | |||
pass | |||
@@ -942,6 +942,32 @@ class PluginEdit(QDialog): | |||
self.ui.cb_midi_programs.setCurrentIndex(index) | |||
self.ui.cb_midi_programs.blockSignals(False) | |||
def setOption(self, option, yesNo): | |||
if option == PLUGIN_OPTION_FIXED_BUFFERS: | |||
widget = self.ui.ch_fixed_buffer | |||
elif option == PLUGIN_OPTION_FORCE_STEREO: | |||
widget = self.ui.ch_force_stereo | |||
elif option == PLUGIN_OPTION_MAP_PROGRAM_CHANGES: | |||
widget = self.ui.ch_map_program_changes | |||
elif option == PLUGIN_OPTION_USE_CHUNKS: | |||
widget = self.ui.ch_use_chunks | |||
elif option == PLUGIN_OPTION_SEND_CONTROL_CHANGES: | |||
widget = self.ui.ch_send_control_changes | |||
elif option == PLUGIN_OPTION_SEND_CHANNEL_PRESSURE: | |||
widget = self.ui.ch_send_channel_pressure | |||
elif option == PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH: | |||
widget = self.ui.ch_send_note_aftertouch | |||
elif option == PLUGIN_OPTION_SEND_PITCHBEND: | |||
widget = self.ui.ch_send_pitchbend | |||
elif option == PLUGIN_OPTION_SEND_ALL_SOUND_OFF: | |||
widget = self.ui.ch_send_all_sound_off | |||
else: | |||
return | |||
widget.blockSignals(True) | |||
widget.setChecked(yesNo) | |||
widget.blockSignals(False) | |||
#------------------------------------------------------------------ | |||
def sendNoteOn(self, channel, note): | |||
@@ -217,6 +217,8 @@ const char* EngineCallbackOpcode2Str(const EngineCallbackOpcode opcode) noexcept | |||
return "ENGINE_CALLBACK_PROGRAM_CHANGED"; | |||
case ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | |||
return "ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED"; | |||
case ENGINE_CALLBACK_OPTION_CHANGED: | |||
return "ENGINE_CALLBACK_OPTION_CHANGED"; | |||
case ENGINE_CALLBACK_UI_STATE_CHANGED: | |||
return "ENGINE_CALLBACK_UI_STATE_CHANGED"; | |||
case ENGINE_CALLBACK_NOTE_ON: | |||
@@ -141,6 +141,7 @@ StateSave::StateSave() noexcept | |||
balanceRight(1.0f), | |||
panning(0.0f), | |||
ctrlChannel(-1), | |||
options(0x0), | |||
currentProgramIndex(-1), | |||
currentProgramName(nullptr), | |||
currentMidiBank(-1), | |||
@@ -193,6 +194,7 @@ void StateSave::clear() noexcept | |||
balanceRight = 1.0f; | |||
panning = 0.0f; | |||
ctrlChannel = -1; | |||
options = 0x0; | |||
currentProgramIndex = -1; | |||
currentMidiBank = -1; | |||
currentMidiProgram = -1; | |||
@@ -295,6 +297,10 @@ bool StateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
ctrlChannel = static_cast<int8_t>(value-1); | |||
} | |||
} | |||
else if (tag.equalsIgnoreCase("options")) | |||
{ | |||
options = text.getHexValue32(); | |||
} | |||
// ------------------------------------------------------- | |||
// Program (current) | |||
@@ -496,6 +502,8 @@ String StateSave::toString() const | |||
else | |||
dataXml << " <ControlChannel>" << int(ctrlChannel+1) << "</ControlChannel>\n"; | |||
dataXml << " <Options>0x" << String::toHexString(static_cast<int>(options)) << "</Options>\n"; | |||
content << dataXml; | |||
} | |||
@@ -76,6 +76,7 @@ struct StateSave { | |||
float balanceRight; | |||
float panning; | |||
int8_t ctrlChannel; | |||
uint options; | |||
int32_t currentProgramIndex; | |||
const char* currentProgramName; | |||