| @@ -729,6 +729,15 @@ typedef enum { | |||||
| */ | */ | ||||
| ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED = 10, | 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. | * A plugin's custom UI state has changed. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| @@ -737,7 +746,7 @@ typedef enum { | |||||
| * 1: UI is now visible\n | * 1: UI is now visible\n | ||||
| * -1: UI has crashed and should not be shown again | * -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. | * A note has been pressed. | ||||
| @@ -746,7 +755,7 @@ typedef enum { | |||||
| * @param value2 Note | * @param value2 Note | ||||
| * @param value3 Velocity | * @param value3 Velocity | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_NOTE_ON = 12, | |||||
| ENGINE_CALLBACK_NOTE_ON = 13, | |||||
| /*! | /*! | ||||
| * A note has been released. | * A note has been released. | ||||
| @@ -754,37 +763,37 @@ typedef enum { | |||||
| * @param value1 Channel | * @param value1 Channel | ||||
| * @param value2 Note | * @param value2 Note | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_NOTE_OFF = 13, | |||||
| ENGINE_CALLBACK_NOTE_OFF = 14, | |||||
| /*! | /*! | ||||
| * A plugin needs update. | * A plugin needs update. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_UPDATE = 14, | |||||
| ENGINE_CALLBACK_UPDATE = 15, | |||||
| /*! | /*! | ||||
| * A plugin's data/information has changed. | * A plugin's data/information has changed. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_RELOAD_INFO = 15, | |||||
| ENGINE_CALLBACK_RELOAD_INFO = 16, | |||||
| /*! | /*! | ||||
| * A plugin's parameters have changed. | * A plugin's parameters have changed. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_RELOAD_PARAMETERS = 16, | |||||
| ENGINE_CALLBACK_RELOAD_PARAMETERS = 17, | |||||
| /*! | /*! | ||||
| * A plugin's programs have changed. | * A plugin's programs have changed. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_RELOAD_PROGRAMS = 17, | |||||
| ENGINE_CALLBACK_RELOAD_PROGRAMS = 18, | |||||
| /*! | /*! | ||||
| * A plugin state has changed. | * A plugin state has changed. | ||||
| * @param pluginId Plugin Id | * @param pluginId Plugin Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_RELOAD_ALL = 18, | |||||
| ENGINE_CALLBACK_RELOAD_ALL = 19, | |||||
| /*! | /*! | ||||
| * A patchbay client has been added. | * A patchbay client has been added. | ||||
| @@ -794,20 +803,20 @@ typedef enum { | |||||
| * @param valueStr Client name | * @param valueStr Client name | ||||
| * @see PatchbayIcon | * @see PatchbayIcon | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 19, | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 20, | |||||
| /*! | /*! | ||||
| * A patchbay client has been removed. | * A patchbay client has been removed. | ||||
| * @param pluginId Client Id | * @param pluginId Client Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 20, | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 21, | |||||
| /*! | /*! | ||||
| * A patchbay client has been renamed. | * A patchbay client has been renamed. | ||||
| * @param pluginId Client Id | * @param pluginId Client Id | ||||
| * @param valueStr New client name | * @param valueStr New client name | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 21, | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 22, | |||||
| /*! | /*! | ||||
| * A patchbay client data has changed. | * A patchbay client data has changed. | ||||
| @@ -816,7 +825,7 @@ typedef enum { | |||||
| * @param value2 New plugin Id (-1 if not a plugin) | * @param value2 New plugin Id (-1 if not a plugin) | ||||
| * @see PatchbayIcon | * @see PatchbayIcon | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22, | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 23, | |||||
| /*! | /*! | ||||
| * A patchbay port has been added. | * A patchbay port has been added. | ||||
| @@ -826,14 +835,14 @@ typedef enum { | |||||
| * @param valueStr Port name | * @param valueStr Port name | ||||
| * @see PatchbayPortHints | * @see PatchbayPortHints | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 23, | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 24, | |||||
| /*! | /*! | ||||
| * A patchbay port has been removed. | * A patchbay port has been removed. | ||||
| * @param pluginId Client Id | * @param pluginId Client Id | ||||
| * @param value1 Port Id | * @param value1 Port Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 24, | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 25, | |||||
| /*! | /*! | ||||
| * A patchbay port has been renamed. | * A patchbay port has been renamed. | ||||
| @@ -841,20 +850,20 @@ typedef enum { | |||||
| * @param value1 Port Id | * @param value1 Port Id | ||||
| * @param valueStr New port name | * @param valueStr New port name | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 25, | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 26, | |||||
| /*! | /*! | ||||
| * A patchbay connection has been added. | * A patchbay connection has been added. | ||||
| * @param pluginId Connection Id | * @param pluginId Connection Id | ||||
| * @param valueStr Out group and port plus in group and port, in "og:op:ig:ip" syntax. | * @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. | * A patchbay connection has been removed. | ||||
| * @param pluginId Connection Id | * @param pluginId Connection Id | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27, | |||||
| ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 28, | |||||
| /*! | /*! | ||||
| * Engine started. | * Engine started. | ||||
| @@ -864,62 +873,62 @@ typedef enum { | |||||
| * @see EngineProcessMode | * @see EngineProcessMode | ||||
| * @see EngineTransportMode | * @see EngineTransportMode | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_ENGINE_STARTED = 28, | |||||
| ENGINE_CALLBACK_ENGINE_STARTED = 29, | |||||
| /*! | /*! | ||||
| * Engine stopped. | * Engine stopped. | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_ENGINE_STOPPED = 29, | |||||
| ENGINE_CALLBACK_ENGINE_STOPPED = 30, | |||||
| /*! | /*! | ||||
| * Engine process mode has changed. | * Engine process mode has changed. | ||||
| * @param value1 New process mode | * @param value1 New process mode | ||||
| * @see EngineProcessMode | * @see EngineProcessMode | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 30, | |||||
| ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 31, | |||||
| /*! | /*! | ||||
| * Engine transport mode has changed. | * Engine transport mode has changed. | ||||
| * @param value1 New transport mode | * @param value1 New transport mode | ||||
| * @see EngineTransportMode | * @see EngineTransportMode | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 31, | |||||
| ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 32, | |||||
| /*! | /*! | ||||
| * Engine buffer-size changed. | * Engine buffer-size changed. | ||||
| * @param value1 New buffer size | * @param value1 New buffer size | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 32, | |||||
| ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 33, | |||||
| /*! | /*! | ||||
| * Engine sample-rate changed. | * Engine sample-rate changed. | ||||
| * @param value3 New sample rate | * @param value3 New sample rate | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 33, | |||||
| ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 34, | |||||
| /*! | /*! | ||||
| * Idle frontend.\n | * Idle frontend.\n | ||||
| * This is used by the engine during long operations that might block the 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. | * 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. | * Show a message as information. | ||||
| * @param valueStr The message | * @param valueStr The message | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_INFO = 35, | |||||
| ENGINE_CALLBACK_INFO = 36, | |||||
| /*! | /*! | ||||
| * Show a message as an error. | * Show a message as an error. | ||||
| * @param valueStr The message | * @param valueStr The message | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_ERROR = 36, | |||||
| ENGINE_CALLBACK_ERROR = 37, | |||||
| /*! | /*! | ||||
| * The engine has crashed or malfunctioned and will no longer work. | * The engine has crashed or malfunctioned and will no longer work. | ||||
| */ | */ | ||||
| ENGINE_CALLBACK_QUIT = 37 | |||||
| ENGINE_CALLBACK_QUIT = 38 | |||||
| } EngineCallbackOpcode; | } EngineCallbackOpcode; | ||||
| @@ -430,7 +430,7 @@ public: | |||||
| * | * | ||||
| * \see getOptions() and getAvailableOptions() | * \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 | * 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)); | carla_debug("carla_set_option(%i, %i, %s)", pluginId, option, bool2str(yesNo)); | ||||
| if (CarlaPlugin* const plugin = gStandalone.engine->getPlugin(pluginId)) | 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)); | 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); | CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(yesNo), true); | ||||
| if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) | ||||
| plugin->setOption(option, yesNo); | |||||
| plugin->setOption(option, yesNo, false); | |||||
| } | } | ||||
| else if (std::strcmp(msg, "set_active") == 0) | 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.name = carla_strdup(pData->name); | ||||
| pData->stateSave.label = carla_strdup(strBuf); | pData->stateSave.label = carla_strdup(strBuf); | ||||
| pData->stateSave.uniqueId = getUniqueId(); | 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) | if (pData->filename != nullptr) | ||||
| pData->stateSave.binary = carla_strdup(pData->filename); | pData->stateSave.binary = carla_strdup(pData->filename); | ||||
| @@ -844,6 +846,17 @@ void CarlaPlugin::loadStateSave(const StateSave& stateSave) | |||||
| // --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
| // Part 6 - set internal stuff | // 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 | #ifndef BUILD_BRIDGE | ||||
| setDryWet(stateSave.dryWet, true, true); | setDryWet(stateSave.dryWet, true, true); | ||||
| setVolume(stateSave.volume, true, true); | setVolume(stateSave.volume, true, true); | ||||
| @@ -918,7 +931,7 @@ void CarlaPlugin::setName(const char* const newName) | |||||
| pData->name = carla_strdup(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,); | CARLA_SAFE_ASSERT_RETURN(getOptionsAvailable() & option,); | ||||
| @@ -927,9 +940,8 @@ void CarlaPlugin::setOption(const uint option, const bool yesNo) | |||||
| else | else | ||||
| pData->options &= ~option; | 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 | void CarlaPlugin::setEnabled(const bool yesNo) noexcept | ||||
| @@ -21,17 +21,8 @@ | |||||
| #include "CarlaLibCounter.hpp" | #include "CarlaLibCounter.hpp" | ||||
| #include "CarlaMathUtils.hpp" | #include "CarlaMathUtils.hpp" | ||||
| // FIXME | |||||
| #include <QtCore/QSettings> | |||||
| // ----------------------------------------------------------------------- | |||||
| CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
| #if 0 | |||||
| } // Fix editor indentation | |||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Fallback data | // Fallback data | ||||
| @@ -465,9 +456,6 @@ CarlaPlugin::ProtectedData::ProtectedData(CarlaEngine* const eng, const uint idx | |||||
| name(nullptr), | name(nullptr), | ||||
| filename(nullptr), | filename(nullptr), | ||||
| iconName(nullptr), | iconName(nullptr), | ||||
| #ifndef BUILD_BRIDGE | |||||
| identifier(nullptr), | |||||
| #endif | |||||
| osc(eng, plug) {} | osc(eng, plug) {} | ||||
| CarlaPlugin::ProtectedData::~ProtectedData() noexcept | CarlaPlugin::ProtectedData::~ProtectedData() noexcept | ||||
| @@ -516,14 +504,6 @@ CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||||
| iconName = nullptr; | iconName = nullptr; | ||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (identifier != nullptr) | |||||
| { | |||||
| delete[] identifier; | |||||
| identifier = nullptr; | |||||
| } | |||||
| #endif | |||||
| for (LinkedList<CustomData>::Itenerator it = custom.begin(); it.valid(); it.next()) | for (LinkedList<CustomData>::Itenerator it = custom.begin(); it.valid(); it.next()) | ||||
| { | { | ||||
| CustomData& cData(it.getValue()); | CustomData& cData(it.getValue()); | ||||
| @@ -704,91 +684,6 @@ void* CarlaPlugin::ProtectedData::uiLibSymbol(const char* const symbol) const no | |||||
| return lib_symbol(uiLib, symbol); | 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 | void CarlaPlugin::ProtectedData::tryTransient() noexcept | ||||
| @@ -796,7 +691,6 @@ void CarlaPlugin::ProtectedData::tryTransient() noexcept | |||||
| if (engine->getOptions().frontendWinId != 0) | if (engine->getOptions().frontendWinId != 0) | ||||
| transientTryCounter = 1; | transientTryCounter = 1; | ||||
| } | } | ||||
| #endif | |||||
| void CarlaPlugin::ProtectedData::updateParameterValues(CarlaPlugin* const plugin, const bool sendOsc, const bool sendCallback, const bool useDefault) noexcept | 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* name; | ||||
| const char* filename; | const char* filename; | ||||
| const char* iconName; | const char* iconName; | ||||
| #ifndef BUILD_BRIDGE | |||||
| const char* identifier; // used for save/restore settings per plugin | |||||
| #endif | |||||
| // data 2 | // data 2 | ||||
| PluginAudioData audioIn; | PluginAudioData audioIn; | ||||
| @@ -345,19 +342,10 @@ struct CarlaPlugin::ProtectedData { | |||||
| bool uiLibClose() noexcept; | bool uiLibClose() noexcept; | ||||
| void* uiLibSymbol(const char* const symbol) const 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 | // Misc | ||||
| void tryTransient() noexcept; | void tryTransient() noexcept; | ||||
| #endif | |||||
| void updateParameterValues(CarlaPlugin* const plugin, const bool sendOsc, const bool sendCallback, const bool useDefault) noexcept; | 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 | #ifdef __USE_GNU | ||||
| const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
| const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
| #else | #else | ||||
| const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
| const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
| #endif | #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; | 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; | 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; | return true; | ||||
| @@ -1604,40 +1604,21 @@ public: | |||||
| } | } | ||||
| // --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
| // load plugin settings | |||||
| // set default options | |||||
| { | |||||
| #ifdef __USE_GNU | #ifdef __USE_GNU | ||||
| const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
| const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
| #else | #else | ||||
| const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
| const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
| #endif | #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; | 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; | 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 $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | ||||
| CarlaPluginInternal.cpp.o: CarlaPluginInternal.cpp $(CARLA_PLUGIN_INTERNAL_CPP_DEPS) | 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) | CarlaPluginThread.cpp.o: CarlaPluginThread.cpp $(CARLA_PLUGIN_THREAD_CPP_DEPS) | ||||
| $(CXX) $< $(BUILD_CXX_FLAGS) $(QTCORE_FLAGS) -c -o $@ | $(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; | 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; | return true; | ||||
| @@ -87,6 +87,7 @@ class CarlaMultiW(QTabWidget): | |||||
| parent.ParameterMidiCcChangedCallback.connect(self.fRack.slot_handleParameterMidiCcChangedCallback) | parent.ParameterMidiCcChangedCallback.connect(self.fRack.slot_handleParameterMidiCcChangedCallback) | ||||
| parent.ProgramChangedCallback.connect(self.fRack.slot_handleProgramChangedCallback) | parent.ProgramChangedCallback.connect(self.fRack.slot_handleProgramChangedCallback) | ||||
| parent.MidiProgramChangedCallback.connect(self.fRack.slot_handleMidiProgramChangedCallback) | parent.MidiProgramChangedCallback.connect(self.fRack.slot_handleMidiProgramChangedCallback) | ||||
| parent.OptionChangedCallback.connect(self.fRack.slot_handleOptionChangedCallback) | |||||
| parent.UiStateChangedCallback.connect(self.fRack.slot_handleUiStateChangedCallback) | parent.UiStateChangedCallback.connect(self.fRack.slot_handleUiStateChangedCallback) | ||||
| parent.NoteOnCallback.connect(self.fRack.slot_handleNoteOnCallback) | parent.NoteOnCallback.connect(self.fRack.slot_handleNoteOnCallback) | ||||
| parent.NoteOnCallback.connect(self.fPatchbay.slot_handleNoteOnCallback) | parent.NoteOnCallback.connect(self.fPatchbay.slot_handleNoteOnCallback) | ||||
| @@ -540,46 +540,53 @@ ENGINE_CALLBACK_PROGRAM_CHANGED = 9 | |||||
| # @param value1 New MIDI program index | # @param value1 New MIDI program index | ||||
| ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED = 10 | 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. | # A plugin's custom UI state has changed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| # @param value1 New state, as follows: | # @param value1 New state, as follows: | ||||
| # 0: UI is now hidden | # 0: UI is now hidden | ||||
| # 1: UI is now visible | # 1: UI is now visible | ||||
| # -1: UI has crashed and should not be shown again | # -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. | # A note has been pressed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| # @param value1 Channel | # @param value1 Channel | ||||
| # @param value2 Note | # @param value2 Note | ||||
| # @param value3 Velocity | # @param value3 Velocity | ||||
| ENGINE_CALLBACK_NOTE_ON = 12 | |||||
| ENGINE_CALLBACK_NOTE_ON = 13 | |||||
| # A note has been released. | # A note has been released. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| # @param value1 Channel | # @param value1 Channel | ||||
| # @param value2 Note | # @param value2 Note | ||||
| ENGINE_CALLBACK_NOTE_OFF = 13 | |||||
| ENGINE_CALLBACK_NOTE_OFF = 14 | |||||
| # A plugin needs update. | # A plugin needs update. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| ENGINE_CALLBACK_UPDATE = 14 | |||||
| ENGINE_CALLBACK_UPDATE = 15 | |||||
| # A plugin's data/information has changed. | # A plugin's data/information has changed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| ENGINE_CALLBACK_RELOAD_INFO = 15 | |||||
| ENGINE_CALLBACK_RELOAD_INFO = 16 | |||||
| # A plugin's parameters have changed. | # A plugin's parameters have changed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| ENGINE_CALLBACK_RELOAD_PARAMETERS = 16 | |||||
| ENGINE_CALLBACK_RELOAD_PARAMETERS = 17 | |||||
| # A plugin's programs have changed. | # A plugin's programs have changed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| ENGINE_CALLBACK_RELOAD_PROGRAMS = 17 | |||||
| ENGINE_CALLBACK_RELOAD_PROGRAMS = 18 | |||||
| # A plugin state has changed. | # A plugin state has changed. | ||||
| # @param pluginId Plugin Id | # @param pluginId Plugin Id | ||||
| ENGINE_CALLBACK_RELOAD_ALL = 18 | |||||
| ENGINE_CALLBACK_RELOAD_ALL = 19 | |||||
| # A patchbay client has been added. | # A patchbay client has been added. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| @@ -587,23 +594,23 @@ ENGINE_CALLBACK_RELOAD_ALL = 18 | |||||
| # @param value2 Plugin Id (-1 if not a plugin) | # @param value2 Plugin Id (-1 if not a plugin) | ||||
| # @param valueStr Client name | # @param valueStr Client name | ||||
| # @see PatchbayIcon | # @see PatchbayIcon | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 19 | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED = 20 | |||||
| # A patchbay client has been removed. | # A patchbay client has been removed. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 20 | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_REMOVED = 21 | |||||
| # A patchbay client has been renamed. | # A patchbay client has been renamed. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| # @param valueStr New client name | # @param valueStr New client name | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 21 | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_RENAMED = 22 | |||||
| # A patchbay client data has changed. | # A patchbay client data has changed. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| # @param value1 New icon | # @param value1 New icon | ||||
| # @param value2 New plugin Id (-1 if not a plugin) | # @param value2 New plugin Id (-1 if not a plugin) | ||||
| # @see PatchbayIcon | # @see PatchbayIcon | ||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22 | |||||
| ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 23 | |||||
| # A patchbay port has been added. | # A patchbay port has been added. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| @@ -611,27 +618,27 @@ ENGINE_CALLBACK_PATCHBAY_CLIENT_DATA_CHANGED = 22 | |||||
| # @param value2 Port hints | # @param value2 Port hints | ||||
| # @param valueStr Port name | # @param valueStr Port name | ||||
| # @see PatchbayPortHints | # @see PatchbayPortHints | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 23 | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_ADDED = 24 | |||||
| # A patchbay port has been removed. | # A patchbay port has been removed. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| # @param value1 Port Id | # @param value1 Port Id | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 24 | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_REMOVED = 25 | |||||
| # A patchbay port has been renamed. | # A patchbay port has been renamed. | ||||
| # @param pluginId Client Id | # @param pluginId Client Id | ||||
| # @param value1 Port Id | # @param value1 Port Id | ||||
| # @param valueStr New port name | # @param valueStr New port name | ||||
| ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 25 | |||||
| ENGINE_CALLBACK_PATCHBAY_PORT_RENAMED = 26 | |||||
| # A patchbay connection has been added. | # A patchbay connection has been added. | ||||
| # @param pluginId Connection Id | # @param pluginId Connection Id | ||||
| # @param valueStr Out group, port plus in group and port, in "og:op:ig:ip" syntax. | # @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. | # A patchbay connection has been removed. | ||||
| # @param pluginId Connection Id | # @param pluginId Connection Id | ||||
| ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27 | |||||
| ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 28 | |||||
| # Engine started. | # Engine started. | ||||
| # @param value1 Process mode | # @param value1 Process mode | ||||
| @@ -639,44 +646,44 @@ ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED = 27 | |||||
| # @param valuestr Engine driver | # @param valuestr Engine driver | ||||
| # @see EngineProcessMode | # @see EngineProcessMode | ||||
| # @see EngineTransportMode | # @see EngineTransportMode | ||||
| ENGINE_CALLBACK_ENGINE_STARTED = 28 | |||||
| ENGINE_CALLBACK_ENGINE_STARTED = 29 | |||||
| # Engine stopped. | # Engine stopped. | ||||
| ENGINE_CALLBACK_ENGINE_STOPPED = 29 | |||||
| ENGINE_CALLBACK_ENGINE_STOPPED = 30 | |||||
| # Engine process mode has changed. | # Engine process mode has changed. | ||||
| # @param value1 New process mode | # @param value1 New process mode | ||||
| # @see EngineProcessMode | # @see EngineProcessMode | ||||
| ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 30 | |||||
| ENGINE_CALLBACK_PROCESS_MODE_CHANGED = 31 | |||||
| # Engine transport mode has changed. | # Engine transport mode has changed. | ||||
| # @param value1 New transport mode | # @param value1 New transport mode | ||||
| # @see EngineTransportMode | # @see EngineTransportMode | ||||
| ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 31 | |||||
| ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED = 32 | |||||
| # Engine buffer-size changed. | # Engine buffer-size changed. | ||||
| # @param value1 New buffer size | # @param value1 New buffer size | ||||
| ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 32 | |||||
| ENGINE_CALLBACK_BUFFER_SIZE_CHANGED = 33 | |||||
| # Engine sample-rate changed. | # Engine sample-rate changed. | ||||
| # @param value3 New sample rate | # @param value3 New sample rate | ||||
| ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 33 | |||||
| ENGINE_CALLBACK_SAMPLE_RATE_CHANGED = 34 | |||||
| # Idle frontend. | # Idle frontend. | ||||
| # This is used by the engine during long operations that might block the 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. | # 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. | # Show a message as information. | ||||
| # @param valueStr The message | # @param valueStr The message | ||||
| ENGINE_CALLBACK_INFO = 35 | |||||
| ENGINE_CALLBACK_INFO = 36 | |||||
| # Show a message as an error. | # Show a message as an error. | ||||
| # @param valueStr The message | # @param valueStr The message | ||||
| ENGINE_CALLBACK_ERROR = 36 | |||||
| ENGINE_CALLBACK_ERROR = 37 | |||||
| # The engine has crashed or malfunctioned and will no longer work. | # The engine has crashed or malfunctioned and will no longer work. | ||||
| ENGINE_CALLBACK_QUIT = 37 | |||||
| ENGINE_CALLBACK_QUIT = 38 | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Engine Option | # Engine Option | ||||
| @@ -134,6 +134,7 @@ class HostWindow(QMainWindow): | |||||
| ParameterMidiChannelChangedCallback = pyqtSignal(int, int, int) | ParameterMidiChannelChangedCallback = pyqtSignal(int, int, int) | ||||
| ProgramChangedCallback = pyqtSignal(int, int) | ProgramChangedCallback = pyqtSignal(int, int) | ||||
| MidiProgramChangedCallback = pyqtSignal(int, int) | MidiProgramChangedCallback = pyqtSignal(int, int) | ||||
| OptionChangedCallback = pyqtSignal(int, int, bool) | |||||
| UiStateChangedCallback = pyqtSignal(int, int) | UiStateChangedCallback = pyqtSignal(int, int) | ||||
| NoteOnCallback = pyqtSignal(int, int, int, int) | NoteOnCallback = pyqtSignal(int, int, int, int) | ||||
| NoteOffCallback = pyqtSignal(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) | gCarla.gui.ProgramChangedCallback.emit(pluginId, value1) | ||||
| elif action == ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | elif action == ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | ||||
| gCarla.gui.MidiProgramChangedCallback.emit(pluginId, value1) | 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: | elif action == ENGINE_CALLBACK_UI_STATE_CHANGED: | ||||
| gCarla.gui.UiStateChangedCallback.emit(pluginId, value1) | gCarla.gui.UiStateChangedCallback.emit(pluginId, value1) | ||||
| elif action == ENGINE_CALLBACK_NOTE_ON: | elif action == ENGINE_CALLBACK_NOTE_ON: | ||||
| @@ -225,6 +225,7 @@ class CarlaPatchbayW(QFrame): | |||||
| parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | ||||
| parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | ||||
| parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | ||||
| parent.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback) | |||||
| parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | ||||
| parent.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | parent.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | ||||
| parent.UpdateCallback.connect(self.slot_handleUpdateCallback) | 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) | @pyqtSlot(int, int, int, int) | ||||
| def slot_handleNoteOnCallback(self, pluginId, channel, note, velo): | def slot_handleNoteOnCallback(self, pluginId, channel, note, velo): | ||||
| if pluginId in self.fSelectedPlugins: | if pluginId in self.fSelectedPlugins: | ||||
| @@ -297,6 +297,7 @@ class CarlaRackW(QFrame): | |||||
| parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | parent.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | ||||
| parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | parent.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | ||||
| parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | parent.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | ||||
| parent.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback) | |||||
| parent.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback) | parent.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback) | ||||
| parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | parent.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | ||||
| parent.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | 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) | @pyqtSlot(int, int) | ||||
| def slot_handleUiStateChangedCallback(self, pluginId, state): | def slot_handleUiStateChangedCallback(self, pluginId, state): | ||||
| if pluginId >= self.fPluginCount: | 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): | def sendNoteOn(self, channel, note): | ||||
| if self.fEditDialog.sendNoteOn(channel, note): | if self.fEditDialog.sendNoteOn(channel, note): | ||||
| self.midiActivityChanged(True) | self.midiActivityChanged(True) | ||||
| @@ -379,6 +384,9 @@ class AbstractPluginSlot(QFrame): | |||||
| self.cb_presets.setCurrentIndex(index) | self.cb_presets.setCurrentIndex(index) | ||||
| self.cb_presets.blockSignals(False) | self.cb_presets.blockSignals(False) | ||||
| def optionChanged(self, option, yesNo): | |||||
| pass | |||||
| def notePressed(self, note): | def notePressed(self, note): | ||||
| pass | pass | ||||
| @@ -942,6 +942,32 @@ class PluginEdit(QDialog): | |||||
| self.ui.cb_midi_programs.setCurrentIndex(index) | self.ui.cb_midi_programs.setCurrentIndex(index) | ||||
| self.ui.cb_midi_programs.blockSignals(False) | 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): | def sendNoteOn(self, channel, note): | ||||
| @@ -217,6 +217,8 @@ const char* EngineCallbackOpcode2Str(const EngineCallbackOpcode opcode) noexcept | |||||
| return "ENGINE_CALLBACK_PROGRAM_CHANGED"; | return "ENGINE_CALLBACK_PROGRAM_CHANGED"; | ||||
| case ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | case ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: | ||||
| return "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: | case ENGINE_CALLBACK_UI_STATE_CHANGED: | ||||
| return "ENGINE_CALLBACK_UI_STATE_CHANGED"; | return "ENGINE_CALLBACK_UI_STATE_CHANGED"; | ||||
| case ENGINE_CALLBACK_NOTE_ON: | case ENGINE_CALLBACK_NOTE_ON: | ||||
| @@ -141,6 +141,7 @@ StateSave::StateSave() noexcept | |||||
| balanceRight(1.0f), | balanceRight(1.0f), | ||||
| panning(0.0f), | panning(0.0f), | ||||
| ctrlChannel(-1), | ctrlChannel(-1), | ||||
| options(0x0), | |||||
| currentProgramIndex(-1), | currentProgramIndex(-1), | ||||
| currentProgramName(nullptr), | currentProgramName(nullptr), | ||||
| currentMidiBank(-1), | currentMidiBank(-1), | ||||
| @@ -193,6 +194,7 @@ void StateSave::clear() noexcept | |||||
| balanceRight = 1.0f; | balanceRight = 1.0f; | ||||
| panning = 0.0f; | panning = 0.0f; | ||||
| ctrlChannel = -1; | ctrlChannel = -1; | ||||
| options = 0x0; | |||||
| currentProgramIndex = -1; | currentProgramIndex = -1; | ||||
| currentMidiBank = -1; | currentMidiBank = -1; | ||||
| currentMidiProgram = -1; | currentMidiProgram = -1; | ||||
| @@ -295,6 +297,10 @@ bool StateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||||
| ctrlChannel = static_cast<int8_t>(value-1); | ctrlChannel = static_cast<int8_t>(value-1); | ||||
| } | } | ||||
| } | } | ||||
| else if (tag.equalsIgnoreCase("options")) | |||||
| { | |||||
| options = text.getHexValue32(); | |||||
| } | |||||
| // ------------------------------------------------------- | // ------------------------------------------------------- | ||||
| // Program (current) | // Program (current) | ||||
| @@ -496,6 +502,8 @@ String StateSave::toString() const | |||||
| else | else | ||||
| dataXml << " <ControlChannel>" << int(ctrlChannel+1) << "</ControlChannel>\n"; | dataXml << " <ControlChannel>" << int(ctrlChannel+1) << "</ControlChannel>\n"; | ||||
| dataXml << " <Options>0x" << String::toHexString(static_cast<int>(options)) << "</Options>\n"; | |||||
| content << dataXml; | content << dataXml; | ||||
| } | } | ||||
| @@ -76,6 +76,7 @@ struct StateSave { | |||||
| float balanceRight; | float balanceRight; | ||||
| float panning; | float panning; | ||||
| int8_t ctrlChannel; | int8_t ctrlChannel; | ||||
| uint options; | |||||
| int32_t currentProgramIndex; | int32_t currentProgramIndex; | ||||
| const char* currentProgramName; | const char* currentProgramName; | ||||