Signed-off-by: falkTX <falktx@falktx.com>tags/23.02
| @@ -0,0 +1,119 @@ | |||
| { | |||
| "version": "2.1", | |||
| "zoom": 1.0, | |||
| "modules": [ | |||
| { | |||
| "id": 2799203590388841, | |||
| "plugin": "Cardinal", | |||
| "model": "TextEditor", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 4, | |||
| "data": { | |||
| "filepath": "", | |||
| "lang": "None", | |||
| "etext": "Welcome to Cardinal!\n\nThis is the mini variant\nIt has 2 audio ports, 5 CV ports, plus MIDI\n\nThe most relevant modules for host\nintegration are in this default patch\n\nHave fun!\n\n", | |||
| "width": 23 | |||
| }, | |||
| "pos": [ | |||
| 42, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 2, | |||
| "plugin": "Cardinal", | |||
| "model": "HostMIDI", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 7249509538355161, | |||
| "rightModuleId": 3, | |||
| "data": { | |||
| "pwRange": 0.0, | |||
| "smooth": false, | |||
| "channels": 1, | |||
| "polyMode": 0, | |||
| "lastPitch": 8192, | |||
| "lastMod": 0, | |||
| "inputChannel": 0, | |||
| "outputChannel": 0 | |||
| }, | |||
| "pos": [ | |||
| 16, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 3, | |||
| "plugin": "Cardinal", | |||
| "model": "HostTime", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 2, | |||
| "rightModuleId": 4, | |||
| "pos": [ | |||
| 25, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 4, | |||
| "plugin": "Cardinal", | |||
| "model": "HostParameters", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 3, | |||
| "rightModuleId": 2799203590388841, | |||
| "pos": [ | |||
| 33, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 7249509538355161, | |||
| "plugin": "Cardinal", | |||
| "model": "HostCV", | |||
| "version": "2.0", | |||
| "params": [ | |||
| { | |||
| "value": 0.0, | |||
| "id": 0 | |||
| }, | |||
| { | |||
| "value": 0.0, | |||
| "id": 1 | |||
| }, | |||
| { | |||
| "value": 0.0, | |||
| "id": 2 | |||
| }, | |||
| { | |||
| "value": 0.0, | |||
| "id": 3 | |||
| } | |||
| ], | |||
| "leftModuleId": 3606136179759592, | |||
| "rightModuleId": 2, | |||
| "pos": [ | |||
| 8, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 3606136179759592, | |||
| "plugin": "Cardinal", | |||
| "model": "HostAudio2", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "rightModuleId": 7249509538355161, | |||
| "data": { | |||
| "dcFilter": false | |||
| }, | |||
| "pos": [ | |||
| 0, | |||
| 0 | |||
| ] | |||
| } | |||
| ], | |||
| "cables": [] | |||
| } | |||
| @@ -311,6 +311,11 @@ endif | |||
| PLUGIN_FILES += $(filter-out Fundamental/src/plugin.cpp,$(wildcard Fundamental/src/*.cpp)) | |||
| PLUGIN_FILES += Fundamental/src/dr_wav.c | |||
| MINIPLUGIN_FILES += Fundamental/src/ADSR.cpp | |||
| MINIPLUGIN_FILES += Fundamental/src/LFO.cpp | |||
| MINIPLUGIN_FILES += Fundamental/src/VCF.cpp | |||
| MINIPLUGIN_FILES += Fundamental/src/VCO.cpp | |||
| # modules/types which are present in other plugins | |||
| FUNDAMENTAL_CUSTOM = $(DRWAV) | |||
| @@ -1294,7 +1299,7 @@ endif | |||
| ifeq ($(NOPLUGINS),true) | |||
| TARGETS = noplugins$(TARGET_SUFFIX).a | |||
| else | |||
| TARGETS = plugins$(TARGET_SUFFIX).a plugins-mini.a | |||
| TARGETS = plugins$(TARGET_SUFFIX).a plugins-mini$(TARGET_SUFFIX).a | |||
| endif | |||
| all: $(TARGETS) | |||
| @@ -1375,11 +1380,14 @@ JACK_RESOURCES += $(CURDIR)/surgext/build/surge-data/wavetables | |||
| JACK_RESOURCES += $(CURDIR)/surgext/build/surge-data/windows.wt | |||
| endif | |||
| MINIPLUGIN_LIST = Cardinal | |||
| MINIRESOURCE_FILES = $(wildcard Cardinal/res/*.svg) | |||
| RESOURCE_FILES += Cardinal/res/Miku/Miku.png | |||
| MINIPLUGIN_LIST = Cardinal Fundamental | |||
| MINIRESOURCE_FILES = $(wildcard Cardinal/res/*.svg) | |||
| MINIRESOURCE_FILES += $(wildcard Fundamental/res/*.svg) | |||
| MINIRESOURCE_FILES += $(wildcard Fundamental/res/components/*.svg) | |||
| MINIRESOURCE_FILES += Fundamental/presets | |||
| # MOD builds only have LV2 main and FX variant | |||
| ifeq ($(MOD_BUILD),true) | |||
| @@ -23,11 +23,15 @@ | |||
| // Cardinal (built-in) | |||
| #include "Cardinal/src/plugin.hpp" | |||
| // Fundamental | |||
| #include "Fundamental/src/plugin.hpp" | |||
| // known terminal modules | |||
| std::vector<Model*> hostTerminalModels; | |||
| // plugin instances | |||
| Plugin* pluginInstance__Cardinal; | |||
| Plugin* pluginInstance__Fundamental; | |||
| namespace rack { | |||
| @@ -175,9 +179,47 @@ static void initStatic__Cardinal() | |||
| } | |||
| } | |||
| static void initStatic__Fundamental() | |||
| { | |||
| Plugin* const p = new Plugin; | |||
| pluginInstance__Fundamental = p; | |||
| const StaticPluginLoader spl(p, "Fundamental"); | |||
| if (spl.ok()) | |||
| { | |||
| p->addModel(modelADSR); | |||
| p->addModel(modelLFO); | |||
| p->addModel(modelVCF); | |||
| p->addModel(modelVCO); | |||
| spl.removeModule("VCO2"); | |||
| spl.removeModule("VCA-1"); | |||
| spl.removeModule("VCA"); | |||
| spl.removeModule("LFO2"); | |||
| spl.removeModule("Delay"); | |||
| spl.removeModule("Mixer"); | |||
| spl.removeModule("VCMixer"); | |||
| spl.removeModule("8vert"); | |||
| spl.removeModule("Mutes"); | |||
| spl.removeModule("Pulses"); | |||
| spl.removeModule("Scope"); | |||
| spl.removeModule("SEQ3"); | |||
| spl.removeModule("SequentialSwitch1"); | |||
| spl.removeModule("SequentialSwitch2"); | |||
| spl.removeModule("Octave"); | |||
| spl.removeModule("Quantizer"); | |||
| spl.removeModule("Split"); | |||
| spl.removeModule("Merge"); | |||
| spl.removeModule("Sum"); | |||
| spl.removeModule("MidSide"); | |||
| spl.removeModule("Noise"); | |||
| spl.removeModule("Random"); | |||
| } | |||
| } | |||
| void initStaticPlugins() | |||
| { | |||
| initStatic__Cardinal(); | |||
| initStatic__Fundamental(); | |||
| } | |||
| void destroyStaticPlugins() | |||
| @@ -62,12 +62,14 @@ | |||
| # error wrong build | |||
| #endif | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # define HEADLESS | |||
| #if defined(CARDINAL_COMMON_DSP_ONLY) || defined(HEADLESS) | |||
| # define HEADLESS_BEHAVIOUR | |||
| #endif | |||
| #if CARDINAL_VARIANT_FX | |||
| # define CARDINAL_TEMPLATE_NAME "init/fx.vcv" | |||
| #elif CARDINAL_VARIANT_MINI | |||
| # define CARDINAL_TEMPLATE_NAME "init/mini.vcv" | |||
| #elif CARDINAL_VARIANT_NATIVE | |||
| # define CARDINAL_TEMPLATE_NAME "init/native.vcv" | |||
| #elif CARDINAL_VARIANT_SYNTH | |||
| @@ -93,10 +95,12 @@ START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| #ifndef HEADLESS | |||
| void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(pcontext->ui != nullptr,); | |||
| #ifndef CARDINAL_COMMON_DSP_ONLY | |||
| if (started) | |||
| { | |||
| pcontext->ui->editParameter(index, true); | |||
| @@ -106,26 +110,40 @@ void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, | |||
| { | |||
| pcontext->ui->editParameter(index, false); | |||
| } | |||
| #endif | |||
| } | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #ifndef HEADLESS | |||
| bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb) const | |||
| { | |||
| if (ui == nullptr) | |||
| return false; | |||
| #ifndef CARDINAL_COMMON_DSP_ONLY | |||
| if (ui != nullptr) | |||
| { | |||
| ui->addIdleCallback(cb); | |||
| return true; | |||
| } | |||
| #else | |||
| // unused | |||
| (void)cb; | |||
| #endif | |||
| ui->addIdleCallback(cb); | |||
| return true; | |||
| return false; | |||
| } | |||
| void CardinalPluginContext::removeIdleCallback(IdleCallback* const cb) const | |||
| { | |||
| if (ui == nullptr) | |||
| return; | |||
| ui->removeIdleCallback(cb); | |||
| #ifndef CARDINAL_COMMON_DSP_ONLY | |||
| if (ui != nullptr) | |||
| ui->removeIdleCallback(cb); | |||
| #else | |||
| // unused | |||
| (void)cb; | |||
| #endif | |||
| } | |||
| #endif | |||
| void CardinalPluginContext::writeMidiMessage(const rack::midi::Message& message, const uint8_t channel) | |||
| { | |||
| @@ -296,7 +314,7 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB | |||
| settings::skipLoadOnLaunch = true; | |||
| settings::showTipsOnLaunch = false; | |||
| settings::windowPos = math::Vec(0, 0); | |||
| #ifdef HEADLESS | |||
| #ifdef HEADLESS_BEHAVIOUR | |||
| settings::headless = true; | |||
| #endif | |||
| @@ -348,17 +366,17 @@ Initializer::Initializer(const CardinalBasePlugin* const plugin, const CardinalB | |||
| if (!system::exists(system::join(asset::systemDir, "res"))) | |||
| #endif | |||
| { | |||
| #if defined(DISTRHO_OS_WASM) | |||
| #if defined(DISTRHO_OS_WASM) | |||
| asset::systemDir = "/resources"; | |||
| #elif defined(ARCH_MAC) | |||
| #elif defined(ARCH_MAC) | |||
| asset::systemDir = "/Library/Application Support/Cardinal"; | |||
| #elif defined(ARCH_WIN) | |||
| #elif defined(ARCH_WIN) | |||
| const std::string commonprogfiles = getSpecialPath(kSpecialPathCommonProgramFiles); | |||
| if (! commonprogfiles.empty()) | |||
| asset::systemDir = system::join(commonprogfiles, "Cardinal"); | |||
| #else | |||
| #else | |||
| asset::systemDir = CARDINAL_PLUGIN_PREFIX "/share/cardinal"; | |||
| #endif | |||
| #endif | |||
| asset::bundlePath = system::join(asset::systemDir, "PluginManifests"); | |||
| } | |||
| @@ -542,7 +560,7 @@ namespace patchUtils | |||
| using namespace rack; | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| static void promptClear(const char* const message, const std::function<void()> action) | |||
| { | |||
| if (APP->history->isSaved() || APP->scene->rack->hasModules()) | |||
| @@ -554,7 +572,7 @@ static void promptClear(const char* const message, const std::function<void()> a | |||
| void loadDialog() | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| promptClear("The current patch is unsaved. Clear it and open a new patch?", []() { | |||
| std::string dir; | |||
| if (! APP->patch->path.empty()) | |||
| @@ -579,7 +597,7 @@ void loadDialog() | |||
| void loadPathDialog(const std::string& path, const bool asTemplate) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| promptClear("The current patch is unsaved. Clear it and open the new patch?", [path, asTemplate]() { | |||
| APP->patch->loadAction(path); | |||
| @@ -618,7 +636,7 @@ void loadSelectionDialog() | |||
| void loadTemplateDialog() | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| promptClear("The current patch is unsaved. Clear it and start a new patch?", []() { | |||
| APP->patch->loadTemplate(); | |||
| }); | |||
| @@ -627,7 +645,7 @@ void loadTemplateDialog() | |||
| void revertDialog() | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| if (APP->patch->path.empty()) | |||
| return; | |||
| promptClear("Revert patch to the last saved state?", []{ | |||
| @@ -638,7 +656,7 @@ void revertDialog() | |||
| void saveDialog(const std::string& path) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| if (path.empty()) { | |||
| return; | |||
| } | |||
| @@ -656,7 +674,7 @@ void saveDialog(const std::string& path) | |||
| #endif | |||
| } | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| static void saveAsDialog(const bool uncompressed) | |||
| { | |||
| std::string dir; | |||
| @@ -683,14 +701,14 @@ static void saveAsDialog(const bool uncompressed) | |||
| void saveAsDialog() | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| saveAsDialog(false); | |||
| #endif | |||
| } | |||
| void saveAsDialogUncompressed() | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| saveAsDialog(true); | |||
| #endif | |||
| } | |||
| @@ -716,7 +734,7 @@ void async_dialog_filebrowser(const bool saving, | |||
| const char* const title, | |||
| const std::function<void(char* path)> action) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP); | |||
| DISTRHO_SAFE_ASSERT_RETURN(pcontext != nullptr,); | |||
| @@ -739,14 +757,14 @@ void async_dialog_filebrowser(const bool saving, | |||
| void async_dialog_message(const char* const message) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| asyncDialog::create(message); | |||
| #endif | |||
| } | |||
| void async_dialog_message(const char* const message, const std::function<void()> action) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| asyncDialog::create(message, action); | |||
| #endif | |||
| } | |||
| @@ -754,7 +772,7 @@ void async_dialog_message(const char* const message, const std::function<void()> | |||
| void async_dialog_text_input(const char* const message, const char* const text, | |||
| const std::function<void(char* newText)> action) | |||
| { | |||
| #ifndef HEADLESS | |||
| #ifndef HEADLESS_BEHAVIOUR | |||
| asyncDialog::textInput(message, text, action); | |||
| #endif | |||
| } | |||
| @@ -104,6 +104,7 @@ START_NAMESPACE_DISTRHO | |||
| class CardinalBasePlugin; | |||
| class CardinalBaseUI; | |||
| struct CardinalPluginContext; | |||
| struct Initializer | |||
| #ifdef CARDINAL_INIT_OSC_THREAD | |||
| @@ -124,6 +125,10 @@ struct Initializer | |||
| #endif | |||
| }; | |||
| #ifndef HEADLESS | |||
| void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started); | |||
| #endif | |||
| END_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| @@ -0,0 +1,19 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2022 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 | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #define CARDINAL_COMMON_UI_ONLY | |||
| #include "CardinalCommon.cpp" | |||
| @@ -1 +0,0 @@ | |||
| ../CardinalCommon.cpp | |||
| @@ -0,0 +1,19 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021-2022 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 | |||
| * published by the Free Software Foundation; either version 3 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #define CARDINAL_COMMON_DSP_ONLY | |||
| #include "../CardinalCommon.cpp" | |||
| @@ -609,7 +609,27 @@ protected: | |||
| switch (index) | |||
| { | |||
| case 0: | |||
| state.hints = kStateIsBase64Blob | kStateIsOnlyForDSP; | |||
| state.hints = kStateIsBase64Blob; | |||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| state.hints |= kStateIsOnlyForDSP; | |||
| #endif | |||
| if (FILE* const f = std::fopen(context->patch->factoryTemplatePath.c_str(), "r")) | |||
| { | |||
| std::fseek(f, 0, SEEK_END); | |||
| if (const long fileSize = std::ftell(f)) | |||
| { | |||
| std::fseek(f, 0, SEEK_SET); | |||
| char* const fileContent = new char[fileSize]; | |||
| if (std::fread(fileContent, fileSize, 1, f) == 1) | |||
| { | |||
| state.defaultValue = String::asBase64(fileContent, fileSize); | |||
| } | |||
| delete[] fileContent; | |||
| } | |||
| std::fclose(f); | |||
| } | |||
| state.key = "patch"; | |||
| state.label = "Patch"; | |||
| break; | |||
| @@ -624,12 +644,17 @@ protected: | |||
| state.label = "Comment"; | |||
| break; | |||
| case 3: | |||
| state.hints = kStateIsOnlyForUI; | |||
| state.hints = 0x0; | |||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| state.hints |= kStateIsOnlyForDSP; | |||
| #endif | |||
| state.defaultValue = "{}"; | |||
| state.key = "moduleInfos"; | |||
| state.label = "moduleInfos"; | |||
| break; | |||
| case 4: | |||
| state.hints = kStateIsOnlyForUI; | |||
| // state.defaultValue = String("%d:%d", DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT); | |||
| state.key = "windowSize"; | |||
| state.label = "Window size"; | |||
| break; | |||
| @@ -51,6 +51,7 @@ | |||
| #include "CardinalCommon.hpp" | |||
| #include "PluginContext.hpp" | |||
| #include "WindowParameters.hpp" | |||
| #include "extra/Base64.hpp" | |||
| #ifndef DISTRHO_OS_WASM | |||
| # include "extra/SharedResourcePointer.hpp" | |||
| @@ -376,8 +377,7 @@ public: | |||
| context->history = new rack::history::State; | |||
| context->patch = new rack::patch::Manager; | |||
| context->patch->autosavePath = fAutosavePath; | |||
| context->patch->templatePath = fInitializer->templatePath; | |||
| context->patch->factoryTemplatePath = fInitializer->factoryTemplatePath; | |||
| context->patch->templatePath = context->patch->factoryTemplatePath = fInitializer->templatePath; | |||
| context->event = new rack::widget::EventState; | |||
| context->scene = new rack::app::Scene; | |||
| @@ -385,10 +385,7 @@ public: | |||
| context->window = new rack::window::Window; | |||
| context->patch->loadTemplate(); | |||
| context->scene->rackScroll->reset(); | |||
| // swap to factory template after first load | |||
| context->patch->templatePath = context->patch->factoryTemplatePath; | |||
| #endif | |||
| Window& window(getWindow()); | |||
| @@ -806,17 +803,59 @@ protected: | |||
| void stateChanged(const char* const key, const char* const value) override | |||
| { | |||
| if (std::strcmp(key, "windowSize") != 0) | |||
| return; | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| if (std::strcmp(key, "patch") == 0) | |||
| { | |||
| if (fAutosavePath.empty()) | |||
| return; | |||
| const std::vector<uint8_t> data(d_getChunkFromBase64String(value)); | |||
| DISTRHO_SAFE_ASSERT_RETURN(data.size() >= 4,); | |||
| rack::system::removeRecursively(fAutosavePath); | |||
| rack::system::createDirectories(fAutosavePath); | |||
| static constexpr const char zstdMagic[] = "\x28\xb5\x2f\xfd"; | |||
| if (std::memcmp(data.data(), zstdMagic, sizeof(zstdMagic)) != 0) | |||
| { | |||
| FILE* const f = std::fopen(rack::system::join(fAutosavePath, "patch.json").c_str(), "w"); | |||
| DISTRHO_SAFE_ASSERT_RETURN(f != nullptr,); | |||
| std::fwrite(data.data(), data.size(), 1, f); | |||
| std::fclose(f); | |||
| } | |||
| else | |||
| { | |||
| try { | |||
| rack::system::unarchiveToDirectory(data, fAutosavePath); | |||
| } DISTRHO_SAFE_EXCEPTION_RETURN("setState unarchiveToDirectory",); | |||
| } | |||
| const ScopedContext sc(this); | |||
| int width = 0; | |||
| int height = 0; | |||
| std::sscanf(value, "%i:%i", &width, &height); | |||
| try { | |||
| context->patch->loadAutosave(); | |||
| } DISTRHO_SAFE_EXCEPTION_RETURN("setState loadAutosave",); | |||
| return; | |||
| } | |||
| #endif | |||
| if (width > 0 && height > 0) | |||
| if (std::strcmp(key, "windowSize") == 0) | |||
| { | |||
| const double scaleFactor = getScaleFactor(); | |||
| setSize(width * scaleFactor, height * scaleFactor); | |||
| int width = 0; | |||
| int height = 0; | |||
| std::sscanf(value, "%d:%d", &width, &height); | |||
| if (width > 0 && height > 0) | |||
| { | |||
| const double scaleFactor = getScaleFactor(); | |||
| setSize(width * scaleFactor, height * scaleFactor); | |||
| } | |||
| return; | |||
| } | |||
| } | |||
| @@ -248,14 +248,12 @@ endif | |||
| ifeq ($(CARDINAL_VARIANT),mini) | |||
| ifneq ($(HEADLESS)$(MOD_BUILD),true) | |||
| FILES_UI = CardinalUI.cpp | |||
| FILES_UI += CardinalCommon.cpp | |||
| FILES_UI += CardinalCommon-UI.cpp | |||
| FILES_UI += common.cpp | |||
| FILES_UI += glfw.cpp | |||
| FILES_UI += Window.cpp | |||
| EXTRA_UI_DEPENDENCIES = $(subst -headless,,$(EXTRA_DSP_DEPENDENCIES)) | |||
| EXTRA_UI_LIBS = -Wl,--start-group | |||
| EXTRA_UI_LIBS += $(subst -headless,,$(EXTRA_DSP_LIBS)) | |||
| EXTRA_UI_LIBS += -Wl,--end-group | |||
| endif | |||
| endif | |||
| @@ -124,10 +124,6 @@ struct CardinalPluginContext : rack::Context { | |||
| #endif | |||
| }; | |||
| #ifndef HEADLESS | |||
| void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started); | |||
| #endif | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| CardinalPluginContext* getRackContextFromPlugin(void* ptr); | |||
| @@ -21,27 +21,27 @@ | |||
| # error wrong build | |||
| #endif | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # define HEADLESS | |||
| #endif | |||
| #ifndef HEADLESS | |||
| # include "OpenGL.hpp" | |||
| #endif | |||
| // #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| // # define HEADLESS | |||
| // #endif | |||
| // | |||
| // #ifndef HEADLESS | |||
| // # include "OpenGL.hpp" | |||
| // #endif | |||
| #include "nanovg.h" | |||
| #ifdef HEADLESS | |||
| // #ifdef HEADLESS | |||
| struct NVGLUframebuffer; | |||
| void nvgluBindFramebuffer(NVGLUframebuffer* fb) {} | |||
| NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags) { return nullptr; } | |||
| void nvgluDeleteFramebuffer(NVGLUframebuffer* fb) {} | |||
| #else | |||
| # define NANOVG_GLES2_IMPLEMENTATION | |||
| # define NANOVG_FBO_VALID 1 | |||
| # include "nanovg_gl.h" | |||
| # include "nanovg_gl_utils.h" | |||
| #endif | |||
| // #else | |||
| // # define NANOVG_GLES2_IMPLEMENTATION | |||
| // # define NANOVG_FBO_VALID 1 | |||
| // # include "nanovg_gl.h" | |||
| // # include "nanovg_gl_utils.h" | |||
| // #endif | |||
| #if defined(__GNUC__) && (__GNUC__ >= 6) | |||
| # pragma GCC diagnostic push | |||
| @@ -72,7 +72,7 @@ GLFWAPI double glfwGetTime(void) { return 0.0; } | |||
| } | |||
| #ifndef HEADLESS | |||
| # define STB_IMAGE_WRITE_IMPLEMENTATION | |||
| # include "../src/Rack/dep/glfw/deps/stb_image_write.h" | |||
| #endif | |||
| // #ifndef HEADLESS | |||
| // # define STB_IMAGE_WRITE_IMPLEMENTATION | |||
| // # include "../src/Rack/dep/glfw/deps/stb_image_write.h" | |||
| // #endif | |||