Signed-off-by: falkTX <falktx@falktx.com>pull/1775/head
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -451,10 +451,12 @@ public: | |||
| */ | |||
| bool loadStateFromFile(const char* filename); | |||
| #ifndef CARLA_PLUGIN_ONLY_BRIDGE | |||
| /*! | |||
| * Export this plugin as its own LV2 plugin, using a carla wrapper around it for the LV2 functionality. | |||
| */ | |||
| bool exportAsLV2(const char* lv2path); | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| // Set data (internal stuff) | |||
| @@ -967,11 +969,13 @@ public: | |||
| const uint options; // see PluginOptions | |||
| }; | |||
| static CarlaPluginPtr newNative(const Initializer& init); | |||
| static CarlaPluginPtr newBridge(const Initializer& init, | |||
| BinaryType btype, PluginType ptype, | |||
| const char* binaryArchName, const char* bridgeBinary); | |||
| #ifndef CARLA_PLUGIN_ONLY_BRIDGE | |||
| static CarlaPluginPtr newNative(const Initializer& init); | |||
| static CarlaPluginPtr newLADSPA(const Initializer& init, const LADSPA_RDF_Descriptor* rdfDescriptor); | |||
| static CarlaPluginPtr newDSSI(const Initializer& init); | |||
| static CarlaPluginPtr newLV2(const Initializer& init); | |||
| @@ -986,6 +990,7 @@ public: | |||
| static CarlaPluginPtr newSFZero(const Initializer& init); | |||
| static CarlaPluginPtr newJackApp(const Initializer& init); | |||
| #endif | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -319,7 +319,7 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | |||
| return newJack(); | |||
| #endif | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_OS_WASM)) | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_OS_WASM) || defined(STATIC_PLUGIN_TARGET)) | |||
| if (std::strcmp(driverName, "Dummy") == 0) | |||
| return newDummy(); | |||
| #endif | |||
| @@ -574,7 +574,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| uint id; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| CarlaPluginPtr oldPlugin; | |||
| if (pData->nextPluginId < pData->curPluginCount) | |||
| @@ -587,7 +587,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(oldPlugin.get() != nullptr, "Invalid replace plugin Id"); | |||
| } | |||
| else | |||
| #endif | |||
| #endif | |||
| { | |||
| id = pData->curPluginCount; | |||
| @@ -597,9 +597,9 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| return false; | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins[id].plugin.get() == nullptr, "Invalid engine internal data"); | |||
| #endif | |||
| #endif | |||
| } | |||
| CarlaPlugin::Initializer initializer = { | |||
| @@ -617,13 +617,13 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| if (bridgeBinary.isNotEmpty()) | |||
| { | |||
| #ifndef CARLA_OS_WIN | |||
| #ifndef CARLA_OS_WIN | |||
| if (btype == BINARY_NATIVE) | |||
| { | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native"; | |||
| } | |||
| else | |||
| #endif | |||
| #endif | |||
| { | |||
| switch (btype) | |||
| { | |||
| @@ -634,18 +634,18 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-posix64"; | |||
| break; | |||
| case BINARY_WIN32: | |||
| #if defined(CARLA_OS_WIN) && !defined(CARLA_OS_64BIT) | |||
| #if defined(CARLA_OS_WIN) && !defined(CARLA_OS_64BIT) | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native.exe"; | |||
| #else | |||
| #else | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-win32.exe"; | |||
| #endif | |||
| #endif | |||
| break; | |||
| case BINARY_WIN64: | |||
| #if defined(CARLA_OS_WIN) && defined(CARLA_OS_64BIT) | |||
| #if defined(CARLA_OS_WIN) && defined(CARLA_OS_64BIT) | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native.exe"; | |||
| #else | |||
| #else | |||
| bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-win64.exe"; | |||
| #endif | |||
| #endif | |||
| break; | |||
| default: | |||
| bridgeBinary.clear(); | |||
| @@ -669,16 +669,16 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| bool preferBridges = pData->options.preferPluginBridges; | |||
| const char* needsArchBridge = nullptr; | |||
| #ifdef CARLA_OS_MAC | |||
| #ifdef CARLA_OS_MAC | |||
| // Plugin might be in quarentine due to Apple stupid notarization rules, let's remove that if possible | |||
| if (canBeBridged && ptype != PLUGIN_LV2 && ptype != PLUGIN_AU) | |||
| removeFileFromQuarantine(filename); | |||
| #endif | |||
| #endif | |||
| #ifndef BUILD_BRIDGE | |||
| #ifndef BUILD_BRIDGE | |||
| if (canBeBridged && ! preferBridges) | |||
| { | |||
| # if 0 | |||
| /* | |||
| if (ptype == PLUGIN_LV2 && label != nullptr) | |||
| { | |||
| if (std::strncmp(label, "http://calf.sourceforge.net/plugins/", 36) == 0 || | |||
| @@ -688,8 +688,8 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| preferBridges = true; | |||
| } | |||
| } | |||
| # endif | |||
| # ifdef ADAPT_FOR_APPLE_SILLICON | |||
| */ | |||
| #ifdef ADAPT_FOR_APPLE_SILLICON | |||
| // see if this binary needs bridging | |||
| if (ptype == PLUGIN_VST2 || ptype == PLUGIN_VST3) | |||
| { | |||
| @@ -699,13 +699,13 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| if (const char* const output = magic.getFileDescription(vst2Binary)) | |||
| { | |||
| carla_stdout("VST binary magic output is '%s'", output); | |||
| # ifdef __aarch64__ | |||
| #ifdef __aarch64__ | |||
| if (std::strstr(output, "arm64") == nullptr && std::strstr(output, "x86_64") != nullptr) | |||
| needsArchBridge = "x86_64"; | |||
| # else | |||
| #else | |||
| if (std::strstr(output, "x86_64") == nullptr && std::strstr(output, "arm64") != nullptr) | |||
| needsArchBridge = "arm64"; | |||
| # endif | |||
| #endif | |||
| } | |||
| else | |||
| { | |||
| @@ -717,11 +717,21 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| carla_stdout("Search for binary in VST bundle failed"); | |||
| } | |||
| } | |||
| # endif | |||
| #endif // ADAPT_FOR_APPLE_SILLICON | |||
| } | |||
| #endif // ! BUILD_BRIDGE | |||
| #endif // ! BUILD_BRIDGE | |||
| #ifndef CARLA_OS_WASM | |||
| #if defined(CARLA_PLUGIN_ONLY_BRIDGE) | |||
| if (bridgeBinary.isNotEmpty()) | |||
| { | |||
| plugin = CarlaPlugin::newBridge(initializer, btype, ptype, needsArchBridge, bridgeBinary); | |||
| } | |||
| else | |||
| { | |||
| setLastError("Cannot load plugin, the required plugin bridge is not available"); | |||
| return false; | |||
| } | |||
| #elif !defined(CARLA_OS_WASM) | |||
| if (canBeBridged && (needsArchBridge || btype != BINARY_NATIVE || (preferBridges && bridgeBinary.isNotEmpty()))) | |||
| { | |||
| if (bridgeBinary.isNotEmpty()) | |||
| @@ -735,11 +745,12 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| } | |||
| } | |||
| else | |||
| #endif | |||
| #endif | |||
| #ifndef CARLA_PLUGIN_ONLY_BRIDGE | |||
| { | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| bool use16Outs; | |||
| #endif | |||
| #endif | |||
| setLastError("Invalid or unsupported plugin type"); | |||
| // Some stupid plugins mess up with global signals, err!! | |||
| @@ -779,7 +790,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| plugin = CarlaPlugin::newCLAP(initializer); | |||
| break; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| case PLUGIN_INTERNAL: | |||
| plugin = CarlaPlugin::newNative(initializer); | |||
| break; | |||
| @@ -792,7 +803,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| break; | |||
| case PLUGIN_SFZ: | |||
| # ifdef SFZ_FILES_USING_SFIZZ | |||
| #ifdef SFZ_FILES_USING_SFIZZ | |||
| { | |||
| CarlaPlugin::Initializer sfizzInitializer = { | |||
| this, | |||
| @@ -806,9 +817,9 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| plugin = CarlaPlugin::newLV2(sfizzInitializer); | |||
| } | |||
| # else | |||
| #else | |||
| plugin = CarlaPlugin::newSFZero(initializer); | |||
| # endif | |||
| #endif | |||
| break; | |||
| case PLUGIN_JSFX: | |||
| @@ -816,13 +827,13 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| break; | |||
| case PLUGIN_JACK: | |||
| # ifdef HAVE_JACK | |||
| #ifdef HAVE_JACK | |||
| plugin = CarlaPlugin::newJackApp(initializer); | |||
| # else | |||
| #else | |||
| setLastError("JACK plugin target is not available"); | |||
| # endif | |||
| #endif | |||
| break; | |||
| #else | |||
| #else | |||
| case PLUGIN_INTERNAL: | |||
| case PLUGIN_DLS: | |||
| case PLUGIN_GIG: | |||
| @@ -832,16 +843,17 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| case PLUGIN_JSFX: | |||
| setLastError("Plugin bridges cannot handle this binary"); | |||
| break; | |||
| #endif | |||
| #endif // BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| } | |||
| } | |||
| #endif // CARLA_PLUGIN_ONLY_BRIDGE | |||
| if (plugin.get() == nullptr) | |||
| return false; | |||
| plugin->reload(); | |||
| #ifdef SFZ_FILES_USING_SFIZZ | |||
| #ifdef SFZ_FILES_USING_SFIZZ | |||
| if (ptype == PLUGIN_SFZ && plugin->getType() == PLUGIN_LV2) | |||
| { | |||
| plugin->setCustomData(LV2_ATOM__Path, | |||
| @@ -851,7 +863,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| plugin->restoreLV2State(true); | |||
| } | |||
| #endif | |||
| #endif | |||
| bool canRun = true; | |||
| @@ -873,7 +885,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| pluginData.plugin = plugin; | |||
| carla_zeroFloats(pluginData.peaks, 4); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| if (oldPlugin.get() != nullptr) | |||
| { | |||
| CARLA_SAFE_ASSERT(! pData->loadingProject); | |||
| @@ -905,7 +917,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| callback(true, true, ENGINE_CALLBACK_RELOAD_ALL, id, 0, 0, 0, 0.0f, nullptr); | |||
| } | |||
| else if (! pData->loadingProject) | |||
| #endif | |||
| #endif | |||
| { | |||
| plugin->setEnabled(true); | |||
| @@ -915,13 +927,18 @@ bool CarlaEngine::addPlugin(const BinaryType btype, | |||
| if (getType() != kEngineTypeBridge) | |||
| plugin->setActive(true, true, true); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| if (pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) | |||
| pData->graph.addPlugin(plugin); | |||
| #endif | |||
| #endif | |||
| } | |||
| return true; | |||
| #if defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE) | |||
| // unused | |||
| (void)extra; | |||
| #endif | |||
| } | |||
| bool CarlaEngine::addPlugin(const PluginType ptype, | |||
| @@ -2947,7 +2964,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw | |||
| CARLA_SAFE_ASSERT_CONTINUE(stateSave.type != nullptr); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| // compatibility code to load projects with GIG files | |||
| // FIXME Remove on 2.1 release | |||
| if (std::strcmp(stateSave.type, "GIG") == 0) | |||
| @@ -3008,7 +3025,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw | |||
| callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | |||
| continue; | |||
| } | |||
| # ifdef SFZ_FILES_USING_SFIZZ | |||
| #ifdef SFZ_FILES_USING_SFIZZ | |||
| if (std::strcmp(stateSave.type, "SFZ") == 0) | |||
| { | |||
| if (addPlugin(PLUGIN_LV2, "", stateSave.name, "http://sfztools.github.io/sfizz", 0, nullptr)) | |||
| @@ -3063,8 +3080,8 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw | |||
| callback(true, true, ENGINE_CALLBACK_IDLE, 0, 0, 0, 0, 0.0f, nullptr); | |||
| continue; | |||
| } | |||
| # endif | |||
| #endif | |||
| #endif | |||
| #endif | |||
| const void* extraStuff = nullptr; | |||
| static const char kTrue[] = "true"; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Plugin | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -536,14 +536,14 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) | |||
| pData->stateSave.name = carla_strdup(pData->name); | |||
| pData->stateSave.label = carla_strdup(strBuf); | |||
| pData->stateSave.uniqueId = getUniqueId(); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| // #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| pData->stateSave.options = pData->options; | |||
| #endif | |||
| // #endif | |||
| if (pData->filename != nullptr) | |||
| pData->stateSave.binary = carla_strdup(pData->filename); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| // --------------------------------------------------------------- | |||
| // Internals | |||
| @@ -554,7 +554,7 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) | |||
| pData->stateSave.balanceRight = pData->postProc.balanceRight; | |||
| pData->stateSave.panning = pData->postProc.panning; | |||
| pData->stateSave.ctrlChannel = pData->ctrlChannel; | |||
| #endif | |||
| #endif | |||
| if (pData->hints & PLUGIN_IS_BRIDGE) | |||
| waitForBridgeSaveSignal(); | |||
| @@ -621,7 +621,7 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) | |||
| stateParameter->dummy = dummy; | |||
| stateParameter->index = paramData.index; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| if (paramData.mappedControlIndex != CONTROL_INDEX_MIDI_LEARN) | |||
| { | |||
| stateParameter->mappedControlIndex = paramData.mappedControlIndex; | |||
| @@ -640,7 +640,7 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave) | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| #endif | |||
| if (! getParameterName(i, strBuf)) | |||
| strBuf[0] = '\0'; | |||
| @@ -859,7 +859,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) | |||
| setParameterValue(static_cast<uint32_t>(index), stateParameter->value, true, true, true); | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| if (stateParameter->mappedRangeValid) | |||
| { | |||
| if (pData->param.data[index].hints & PARAMETER_USES_SAMPLERATE) | |||
| @@ -876,7 +876,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) | |||
| setParameterMappedControlIndex(static_cast<uint32_t>(index), | |||
| stateParameter->mappedControlIndex, true, true, false); | |||
| setParameterMidiChannel(static_cast<uint32_t>(index), stateParameter->midiChannel, true, true); | |||
| #endif | |||
| #endif | |||
| } | |||
| else | |||
| carla_stderr("Could not set parameter '%s' value for '%s'", | |||
| @@ -939,14 +939,14 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) | |||
| if (stateSave.chunk != nullptr && (pData->options & PLUGIN_OPTION_USE_CHUNKS) != 0) | |||
| { | |||
| std::vector<uint8_t> chunk(carla_getChunkFromBase64String(stateSave.chunk)); | |||
| #ifdef CARLA_PROPER_CPP11_SUPPORT | |||
| #ifdef CARLA_PROPER_CPP11_SUPPORT | |||
| setChunkData(chunk.data(), chunk.size()); | |||
| #else | |||
| #else | |||
| setChunkData(&chunk.front(), chunk.size()); | |||
| #endif | |||
| #endif | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| // --------------------------------------------------------------- | |||
| // Part 6 - set internal stuff | |||
| @@ -970,7 +970,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave) | |||
| if (! pData->engine->isLoadingProject()) | |||
| pData->engine->callback(true, true, ENGINE_CALLBACK_UPDATE, pData->id, 0, 0, 0, 0.0f, nullptr); | |||
| #endif | |||
| #endif | |||
| } | |||
| bool CarlaPlugin::saveStateToFile(const char* const filename) | |||
| @@ -1026,6 +1026,7 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename) | |||
| return false; | |||
| } | |||
| #ifndef CARLA_PLUGIN_ONLY_BRIDGE | |||
| bool CarlaPlugin::exportAsLV2(const char* const lv2path) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false); | |||
| @@ -1343,6 +1344,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path) | |||
| return true; | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| // Set data (internal stuff) | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla State utils | |||
| * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -122,16 +122,16 @@ CarlaStateSave::Parameter::Parameter() noexcept | |||
| index(-1), | |||
| name(nullptr), | |||
| symbol(nullptr), | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| value(0.0f), | |||
| mappedControlIndex(CONTROL_INDEX_NONE), | |||
| midiChannel(0), | |||
| mappedRangeValid(false), | |||
| mappedMinimum(0.0f), | |||
| mappedMaximum(1.0f) {} | |||
| #else | |||
| #else | |||
| value(0.0f) {} | |||
| #endif | |||
| #endif | |||
| CarlaStateSave::Parameter::~Parameter() noexcept | |||
| { | |||
| @@ -191,9 +191,9 @@ CarlaStateSave::CarlaStateSave() noexcept | |||
| label(nullptr), | |||
| binary(nullptr), | |||
| uniqueId(0), | |||
| options(0x0), | |||
| options(PLUGIN_OPTIONS_NULL), | |||
| temporary(false), | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| active(false), | |||
| dryWet(1.0f), | |||
| volume(1.0f), | |||
| @@ -201,7 +201,7 @@ CarlaStateSave::CarlaStateSave() noexcept | |||
| balanceRight(1.0f), | |||
| panning(0.0f), | |||
| ctrlChannel(-1), | |||
| #endif | |||
| #endif | |||
| currentProgramIndex(-1), | |||
| currentProgramName(nullptr), | |||
| currentMidiBank(-1), | |||
| @@ -249,9 +249,9 @@ void CarlaStateSave::clear() noexcept | |||
| } | |||
| uniqueId = 0; | |||
| options = 0x0; | |||
| options = PLUGIN_OPTIONS_NULL; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| active = false; | |||
| dryWet = 1.0f; | |||
| volume = 1.0f; | |||
| @@ -259,7 +259,7 @@ void CarlaStateSave::clear() noexcept | |||
| balanceRight = 1.0f; | |||
| panning = 0.0f; | |||
| ctrlChannel = -1; | |||
| #endif | |||
| #endif | |||
| currentProgramIndex = -1; | |||
| currentMidiBank = -1; | |||
| @@ -327,11 +327,17 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
| const String& tag(xmlData->getTagName()); | |||
| const String text(xmlData->getAllSubText().trim()); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| // ------------------------------------------------------- | |||
| // Internal Data | |||
| /**/ if (tag == "Active") | |||
| /**/ if (tag == "Options") | |||
| { | |||
| const int value(text.getHexValue32()); | |||
| if (value > 0) | |||
| options = static_cast<uint>(value); | |||
| } | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| else if (tag == "Active") | |||
| { | |||
| active = (text == "Yes"); | |||
| } | |||
| @@ -364,15 +370,7 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
| ctrlChannel = static_cast<int8_t>(value-1); | |||
| } | |||
| } | |||
| else if (tag == "Options") | |||
| { | |||
| const int value(text.getHexValue32()); | |||
| if (value > 0) | |||
| options = static_cast<uint>(value); | |||
| } | |||
| #else | |||
| if (false) {} | |||
| #endif | |||
| #endif | |||
| // ------------------------------------------------------- | |||
| // Program (current) | |||
| @@ -410,9 +408,9 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
| else if (tag == "Parameter") | |||
| { | |||
| Parameter* const stateParameter(new Parameter()); | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| bool hasMappedMinimum = false, hasMappedMaximum = false; | |||
| #endif | |||
| #endif | |||
| for (XmlElement* xmlSubData = xmlData->getFirstChildElement(); xmlSubData != nullptr; xmlSubData = xmlSubData->getNextElement()) | |||
| { | |||
| @@ -438,7 +436,7 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
| stateParameter->dummy = false; | |||
| stateParameter->value = pText.getFloatValue(); | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| else if (pTag == "MidiChannel") | |||
| { | |||
| const int channel(pText.getIntValue()); | |||
| @@ -468,13 +466,13 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||
| hasMappedMaximum = true; | |||
| stateParameter->mappedMaximum = pText.getFloatValue(); | |||
| } | |||
| #endif | |||
| #endif | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| if (hasMappedMinimum && hasMappedMaximum) | |||
| stateParameter->mappedRangeValid = true; | |||
| #endif | |||
| #endif | |||
| parameters.append(stateParameter); | |||
| } | |||
| @@ -627,7 +625,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const | |||
| content << " <Data>\n"; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| { | |||
| MemoryOutputStream dataXml; | |||
| @@ -653,7 +651,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const | |||
| content << dataXml; | |||
| } | |||
| #endif | |||
| #endif | |||
| for (ParameterItenerator it = parameters.begin2(); it.valid(); it.next()) | |||
| { | |||
| @@ -675,7 +673,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const | |||
| parameterXml << " <Symbol>" << xmlSafeString(stateParameter->symbol, true) << "</Symbol>\n"; | |||
| } | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| if (stateParameter->mappedControlIndex > CONTROL_INDEX_NONE && stateParameter->mappedControlIndex <= CONTROL_INDEX_MAX_ALLOWED) | |||
| { | |||
| parameterXml << " <MidiChannel>" << stateParameter->midiChannel+1 << "</MidiChannel>\n"; | |||
| @@ -691,7 +689,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const | |||
| if (stateParameter->mappedControlIndex > 0 && stateParameter->mappedControlIndex < MAX_MIDI_CONTROL) | |||
| parameterXml << " <MidiCC>" << stateParameter->mappedControlIndex << "</MidiCC>\n"; | |||
| } | |||
| #endif | |||
| #endif | |||
| if (! stateParameter->dummy) | |||
| parameterXml << " <Value>" << String(stateParameter->value, 15) << "</Value>\n"; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla State utils | |||
| * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -34,13 +34,13 @@ struct CarlaStateSave { | |||
| const char* name; | |||
| const char* symbol; | |||
| float value; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| int16_t mappedControlIndex; | |||
| uint8_t midiChannel; | |||
| bool mappedRangeValid; | |||
| float mappedMinimum; | |||
| float mappedMaximum; | |||
| #endif | |||
| #endif | |||
| Parameter() noexcept; | |||
| ~Parameter() noexcept; | |||
| @@ -76,7 +76,7 @@ struct CarlaStateSave { | |||
| // saved during clone, rename or similar | |||
| bool temporary; | |||
| #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
| #if !(defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) || defined(CARLA_PLUGIN_ONLY_BRIDGE)) | |||
| bool active; | |||
| float dryWet; | |||
| float volume; | |||
| @@ -84,7 +84,7 @@ struct CarlaStateSave { | |||
| float balanceRight; | |||
| float panning; | |||
| int8_t ctrlChannel; | |||
| #endif | |||
| #endif | |||
| int32_t currentProgramIndex; | |||
| const char* currentProgramName; | |||