Signed-off-by: falkTX <falktx@falktx.com>tags/23.02
| @@ -1 +1 @@ | |||
| Subproject commit 924576a58c3f3a98d7df56f189f3f53fc4da0abb | |||
| Subproject commit 564f6519b4bbf1c6cc8791a9adbb377f6cfd4984 | |||
| @@ -41,6 +41,7 @@ static constexpr const uint32_t kModuleParameters = 24; | |||
| enum CardinalVariant { | |||
| kCardinalVariantMain, | |||
| kCardinalVariantMini, | |||
| kCardinalVariantFX, | |||
| kCardinalVariantNative, | |||
| kCardinalVariantSynth, | |||
| @@ -231,7 +231,13 @@ DRWAV += drwav_write_raw | |||
| # -------------------------------------------------------------- | |||
| # Files to build | |||
| ifeq ($(NOPLUGINS),true) | |||
| PLUGIN_FILES = noplugins.cpp | |||
| else | |||
| PLUGIN_FILES = plugins.cpp | |||
| endif | |||
| MINIPLUGIN_FILES = plugins-mini.cpp | |||
| # -------------------------------------------------------------- | |||
| # Cardinal (built-in) | |||
| @@ -250,6 +256,17 @@ PLUGIN_FILES += Cardinal/src/HostParameters-Map.cpp | |||
| PLUGIN_FILES += Cardinal/src/HostTime.cpp | |||
| PLUGIN_FILES += Cardinal/src/TextEditor.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostAudio.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostCV.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostMIDI.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostMIDI-CC.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostMIDI-Gate.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostMIDI-Map.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostParameters.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostParameters-Map.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/HostTime.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/TextEditor.cpp | |||
| ifneq ($(USE_GLES2),true) | |||
| ifneq ($(USE_GLES3),true) | |||
| PLUGIN_FILES += Cardinal/src/glBars.cpp | |||
| @@ -280,6 +297,7 @@ endif | |||
| ifeq ($(shell $(PKG_CONFIG) --exists fftw3f && echo true),true) | |||
| PLUGIN_FILES += Cardinal/src/AudioToCVPitch.cpp | |||
| MINIPLUGIN_FILES += Cardinal/src/AudioToCVPitch.cpp | |||
| BASE_FLAGS += -DHAVE_FFTW3F | |||
| endif | |||
| @@ -1106,7 +1124,11 @@ endif # !NOPLUGINS | |||
| # -------------------------------------------------------------- | |||
| # Build setup | |||
| ifeq ($(HEADLESS),true) | |||
| BUILD_DIR = ../build-headless/plugins | |||
| else | |||
| BUILD_DIR = ../build/plugins | |||
| endif | |||
| ifeq ($(MACOS),true) | |||
| BASE_FLAGS += -DARCH_MAC | |||
| @@ -1261,16 +1283,23 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Build targets | |||
| ifeq ($(HEADLESS),true) | |||
| TARGET_SUFFIX = -headless | |||
| endif | |||
| ifeq ($(NOPLUGINS),true) | |||
| TARGET = noplugins.a | |||
| TARGETS = noplugins$(TARGET_SUFFIX).a | |||
| else | |||
| TARGET = plugins.a | |||
| TARGETS = plugins$(TARGET_SUFFIX).a plugins-mini-headless.a | |||
| endif | |||
| all: $(TARGET) | |||
| all: $(TARGETS) | |||
| ifneq ($(HEADLESS),true) | |||
| $(MAKE) HEADLESS=true plugins-mini-headless.a | |||
| endif | |||
| clean: | |||
| rm -f $(TARGET) | |||
| rm -f $(TARGETS) | |||
| rm -rf $(BUILD_DIR) | |||
| rm -rf surgext/build | |||
| @@ -1342,6 +1371,9 @@ 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 | |||
| # MOD builds only have LV2 main and FX variant | |||
| @@ -1349,8 +1381,10 @@ ifeq ($(MOD_BUILD),true) | |||
| LV2_RESOURCES = $(PLUGIN_LIST:%=../bin/Cardinal.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(PLUGIN_LIST:%=../bin/CardinalFX.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(MINIPLUGIN_LIST:%=../bin/CardinalMini.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/Cardinal.lv2/resources/%) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/CardinalFX.lv2/resources/%) | |||
| LV2_RESOURCES += $(MINIRESOURCE_FILES:%=../bin/CardinalMini.lv2/resources/%) | |||
| # MOD builds only have LV2 FX variant for now | |||
| else ifeq ($(WASM),true) | |||
| @@ -1362,10 +1396,12 @@ else | |||
| LV2_RESOURCES = $(PLUGIN_LIST:%=../bin/Cardinal.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(PLUGIN_LIST:%=../bin/CardinalFX.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(MINIPLUGIN_LIST:%=../bin/CardinalMini.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(PLUGIN_LIST:%=../bin/CardinalSynth.lv2/resources/PluginManifests/%.json) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/Cardinal.lv2/resources/%) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/CardinalFX.lv2/resources/%) | |||
| LV2_RESOURCES += $(RESOURCE_FILES:%=../bin/CardinalSynth.lv2/resources/%) | |||
| LV2_RESOURCES += $(MINIRESOURCE_FILES:%=../bin/CardinalMini.lv2/resources/%) | |||
| ifeq ($(MACOS),true) | |||
| VST2_RESOURCES = $(PLUGIN_LIST:%=../bin/CardinalFX.vst/Contents/Resources/PluginManifests/%.json) | |||
| @@ -1404,6 +1440,10 @@ resources: $(JACK_RESOURCES) $(LV2_RESOURCES) $(VST2_RESOURCES) $(VST3_RESOURCES | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| ../bin/CardinalMini.lv2/resources/%: % | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| ../bin/CardinalNative.lv2/resources/%: % | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| @@ -1426,6 +1466,10 @@ endif | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| ../bin/CardinalMini.lv2/resources/PluginManifests/%.json: %/plugin.json | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| ../bin/CardinalNative.lv2/resources/PluginManifests/%.json: %/plugin.json | |||
| -@mkdir -p "$(shell dirname $@)" | |||
| $(SILENT)ln -sf $(abspath $<) $@ | |||
| @@ -1539,6 +1583,8 @@ endif | |||
| PLUGIN_OBJS = $(PLUGIN_FILES:%=$(BUILD_DIR)/%.o) | |||
| PLUGIN_OBJS += $(PLUGIN_BINARIES:%=$(BUILD_DIR)/%.bin.o) | |||
| MINIPLUGIN_OBJS = $(MINIPLUGIN_FILES:%=$(BUILD_DIR)/%.o) | |||
| NOPLUGIN_OBJS = $(NOPLUGIN_FILES:%=$(BUILD_DIR)/%.o) | |||
| .PRECIOUS: $(PLUGIN_BINARIES:%=$(BUILD_DIR)/%.bin.c) | |||
| @@ -1547,12 +1593,17 @@ NOPLUGIN_OBJS = $(NOPLUGIN_FILES:%=$(BUILD_DIR)/%.o) | |||
| custom_module_names = -D${1}=${2}${1} -Dmodel${1}=model${2}${1} -D${1}Widget=${2}${1}Widget | |||
| custom_per_file_names = -D${1}=${2}_${1} | |||
| plugins.a: $(PLUGIN_OBJS) | |||
| plugins$(TARGET_SUFFIX).a: $(PLUGIN_OBJS) | |||
| @echo "Creating $@" | |||
| $(SILENT)rm -f $@ | |||
| $(SILENT)$(AR) crs $@ $^ | |||
| plugins-mini$(TARGET_SUFFIX).a: $(MINIPLUGIN_OBJS) | |||
| @echo "Creating $@" | |||
| $(SILENT)rm -f $@ | |||
| $(SILENT)$(AR) crs $@ $^ | |||
| noplugins.a: $(NOPLUGIN_OBJS) | |||
| noplugins$(TARGET_SUFFIX).a: $(NOPLUGIN_OBJS) | |||
| @echo "Creating $@" $(NOPLUGIN_OBJS) | |||
| $(SILENT)rm -f $@ | |||
| $(SILENT)$(AR) crs $@ $^ | |||
| @@ -1572,6 +1623,16 @@ $(BUILD_DIR)/plugins.cpp.o: plugins.cpp | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| $(BUILD_DIR)/plugins-mini.cpp.o: plugins-mini.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| $(BUILD_DIR)/noplugins.cpp.o: plugins.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
| $(BUILD_DIR)/Cardinal/%.cpp.o: Cardinal/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| @@ -0,0 +1,195 @@ | |||
| /* | |||
| * 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. | |||
| */ | |||
| #include "rack.hpp" | |||
| #include "plugin.hpp" | |||
| #include "DistrhoUtils.hpp" | |||
| // Cardinal (built-in) | |||
| #include "Cardinal/src/plugin.hpp" | |||
| // known terminal modules | |||
| std::vector<Model*> hostTerminalModels; | |||
| // plugin instances | |||
| Plugin* pluginInstance__Cardinal; | |||
| namespace rack { | |||
| namespace asset { | |||
| std::string pluginManifest(const std::string& dirname); | |||
| std::string pluginPath(const std::string& dirname); | |||
| } | |||
| namespace plugin { | |||
| struct StaticPluginLoader { | |||
| Plugin* const plugin; | |||
| FILE* file; | |||
| json_t* rootJ; | |||
| StaticPluginLoader(Plugin* const p, const char* const name) | |||
| : plugin(p), | |||
| file(nullptr), | |||
| rootJ(nullptr) | |||
| { | |||
| #ifdef DEBUG | |||
| DEBUG("Loading plugin module %s", name); | |||
| #endif | |||
| p->path = asset::pluginPath(name); | |||
| const std::string manifestFilename = asset::pluginManifest(name); | |||
| if ((file = std::fopen(manifestFilename.c_str(), "r")) == nullptr) | |||
| { | |||
| d_stderr2("Manifest file %s does not exist", manifestFilename.c_str()); | |||
| return; | |||
| } | |||
| json_error_t error; | |||
| if ((rootJ = json_loadf(file, 0, &error)) == nullptr) | |||
| { | |||
| d_stderr2("JSON parsing error at %s %d:%d %s", manifestFilename.c_str(), error.line, error.column, error.text); | |||
| return; | |||
| } | |||
| // force ABI, we use static plugins so this doesnt matter as long as it builds | |||
| json_t* const version = json_string((APP_VERSION_MAJOR + ".0").c_str()); | |||
| json_object_set(rootJ, "version", version); | |||
| json_decref(version); | |||
| // Load manifest | |||
| p->fromJson(rootJ); | |||
| // Reject plugin if slug already exists | |||
| if (Plugin* const existingPlugin = getPlugin(p->slug)) | |||
| throw Exception("Plugin %s is already loaded, not attempting to load it again", p->slug.c_str()); | |||
| } | |||
| ~StaticPluginLoader() | |||
| { | |||
| if (rootJ != nullptr) | |||
| { | |||
| // Load modules manifest | |||
| json_t* const modulesJ = json_object_get(rootJ, "modules"); | |||
| plugin->modulesFromJson(modulesJ); | |||
| json_decref(rootJ); | |||
| plugins.push_back(plugin); | |||
| } | |||
| if (file != nullptr) | |||
| std::fclose(file); | |||
| } | |||
| bool ok() const noexcept | |||
| { | |||
| return rootJ != nullptr; | |||
| } | |||
| void removeModule(const char* const slugToRemove) const noexcept | |||
| { | |||
| json_t* const modules = json_object_get(rootJ, "modules"); | |||
| DISTRHO_SAFE_ASSERT_RETURN(modules != nullptr,); | |||
| size_t i; | |||
| json_t* v; | |||
| json_array_foreach(modules, i, v) | |||
| { | |||
| if (json_t* const slug = json_object_get(v, "slug")) | |||
| { | |||
| if (const char* const value = json_string_value(slug)) | |||
| { | |||
| if (std::strcmp(value, slugToRemove) == 0) | |||
| { | |||
| json_array_remove(modules, i); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| }; | |||
| static void initStatic__Cardinal() | |||
| { | |||
| Plugin* const p = new Plugin; | |||
| pluginInstance__Cardinal = p; | |||
| const StaticPluginLoader spl(p, "Cardinal"); | |||
| if (spl.ok()) | |||
| { | |||
| p->addModel(modelHostAudio2); | |||
| p->addModel(modelHostCV); | |||
| p->addModel(modelHostMIDI); | |||
| p->addModel(modelHostMIDICC); | |||
| p->addModel(modelHostMIDIGate); | |||
| p->addModel(modelHostMIDIMap); | |||
| p->addModel(modelHostParameters); | |||
| p->addModel(modelHostParametersMap); | |||
| p->addModel(modelHostTime); | |||
| p->addModel(modelTextEditor); | |||
| #ifdef HAVE_FFTW3F | |||
| p->addModel(modelAudioToCVPitch); | |||
| #else | |||
| spl.removeModule("AudioToCVPitch"); | |||
| #endif | |||
| spl.removeModule("AudioFile"); | |||
| spl.removeModule("Blank"); | |||
| spl.removeModule("Carla"); | |||
| spl.removeModule("ExpanderInputMIDI"); | |||
| spl.removeModule("ExpanderOutputMIDI"); | |||
| spl.removeModule("HostAudio8"); | |||
| spl.removeModule("Ildaeil"); | |||
| spl.removeModule("MPV"); | |||
| spl.removeModule("SassyScope"); | |||
| spl.removeModule("glBars"); | |||
| hostTerminalModels = { | |||
| modelHostAudio2, | |||
| modelHostCV, | |||
| modelHostMIDI, | |||
| modelHostMIDICC, | |||
| modelHostMIDIGate, | |||
| modelHostMIDIMap, | |||
| modelHostParameters, | |||
| modelHostParametersMap, | |||
| modelHostTime, | |||
| }; | |||
| } | |||
| } | |||
| void initStaticPlugins() | |||
| { | |||
| initStatic__Cardinal(); | |||
| } | |||
| void destroyStaticPlugins() | |||
| { | |||
| for (Plugin* p : plugins) | |||
| delete p; | |||
| plugins.clear(); | |||
| } | |||
| void updateStaticPluginsDarkMode() | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -19,6 +19,7 @@ | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define CARDINAL_VARIANT_MAIN 1 | |||
| #define CARDINAL_VARIANT_MINI 0 | |||
| #define CARDINAL_VARIANT_FX 0 | |||
| #define CARDINAL_VARIANT_NATIVE 0 | |||
| #define CARDINAL_VARIANT_SYNTH 0 | |||
| @@ -57,6 +57,14 @@ | |||
| # include <emscripten/emscripten.h> | |||
| #endif | |||
| #ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # error wrong build | |||
| #endif | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # define HEADLESS | |||
| #endif | |||
| const std::string CARDINAL_VERSION = "22.12"; | |||
| START_NAMESPACE_DISTRHO | |||
| @@ -19,6 +19,7 @@ | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define CARDINAL_VARIANT_MAIN 0 | |||
| #define CARDINAL_VARIANT_MINI 0 | |||
| #define CARDINAL_VARIANT_FX 1 | |||
| #define CARDINAL_VARIANT_NATIVE 0 | |||
| #define CARDINAL_VARIANT_SYNTH 0 | |||
| @@ -0,0 +1 @@ | |||
| ../CardinalCommon.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../CardinalPlugin.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../CardinalUI.cpp | |||
| @@ -0,0 +1,55 @@ | |||
| /* | |||
| * 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. | |||
| */ | |||
| #ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define CARDINAL_VARIANT_MAIN 0 | |||
| #define CARDINAL_VARIANT_MINI 1 | |||
| #define CARDINAL_VARIANT_FX 0 | |||
| #define CARDINAL_VARIANT_NATIVE 0 | |||
| #define CARDINAL_VARIANT_SYNTH 0 | |||
| #define CARDINAL_NUM_AUDIO_INPUTS 2 | |||
| #define CARDINAL_NUM_AUDIO_OUTPUTS 2 | |||
| #define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||
| #define DISTRHO_PLUGIN_URI "https://distrho.kx.studio/plugins/cardinal#mini" | |||
| #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.cardinal#mini" | |||
| #define DISTRHO_PLUGIN_NAME "Cardinal FX" | |||
| #define DISTRHO_PLUGIN_LABEL "CardinalFX" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 | |||
| #define DISTRHO_UI_FILE_BROWSER 1 | |||
| #define DISTRHO_UI_USE_NANOVG 1 | |||
| #define DISTRHO_UI_USER_RESIZABLE 1 | |||
| #define DISTRHO_UI_DEFAULT_WIDTH 1228 | |||
| #define DISTRHO_UI_DEFAULT_HEIGHT 666 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS CARDINAL_NUM_AUDIO_INPUTS | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS CARDINAL_NUM_AUDIO_OUTPUTS | |||
| #define DISTRHO_PLUGIN_WANT_MIDI_INPUT 1 | |||
| #define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1 | |||
| #define DISTRHO_PLUGIN_WANT_FULL_STATE 1 | |||
| #define DISTRHO_PLUGIN_WANT_STATE 1 | |||
| #define DISTRHO_PLUGIN_WANT_TIMEPOS 1 | |||
| #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:UtilityPlugin" | |||
| #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|Generator" | |||
| #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| @@ -0,0 +1,8 @@ | |||
| #!/usr/bin/make -f | |||
| # Makefile for DISTRHO Plugins # | |||
| # ---------------------------- # | |||
| # Created by falkTX | |||
| # | |||
| NAME = CardinalMini | |||
| include ../Makefile.cardinal.mk | |||
| @@ -0,0 +1 @@ | |||
| ../custom/RemoteNanoVG.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../custom/RemoteWindow.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../override/Window.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../override/common.cpp | |||
| @@ -0,0 +1 @@ | |||
| ../custom/glfw.cpp | |||
| @@ -19,6 +19,7 @@ | |||
| #define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
| #define CARDINAL_VARIANT_MAIN 0 | |||
| #define CARDINAL_VARIANT_MINI 0 | |||
| #define CARDINAL_VARIANT_FX 0 | |||
| #define CARDINAL_VARIANT_NATIVE 1 | |||
| #define CARDINAL_VARIANT_SYNTH 0 | |||
| @@ -647,6 +647,8 @@ protected: | |||
| { | |||
| #if CARDINAL_VARIANT_MAIN || CARDINAL_VARIANT_NATIVE | |||
| return d_cconst('d', 'C', 'd', 'n'); | |||
| #elif CARDINAL_VARIANT_MINI | |||
| return d_cconst('d', 'C', 'd', 'M'); | |||
| #elif CARDINAL_VARIANT_FX | |||
| return d_cconst('d', 'C', 'n', 'F'); | |||
| #elif CARDINAL_VARIANT_SYNTH | |||
| @@ -671,7 +673,7 @@ protected: | |||
| port.hints = kAudioPortIsCV | kCVPortHasPositiveUnipolarRange | kCVPortHasScaledRange | kCVPortIsOptional; | |||
| index -= 8; | |||
| } | |||
| #elif CARDINAL_VARIANT_FX || CARDINAL_VARIANT_NATIVE || CARDINAL_VARIANT_SYNTH | |||
| #elif CARDINAL_VARIANT_MINI || CARDINAL_VARIANT_NATIVE || CARDINAL_VARIANT_FX || CARDINAL_VARIANT_SYNTH | |||
| if (index < 2) | |||
| port.groupId = kPortGroupStereo; | |||
| #endif | |||
| @@ -25,7 +25,11 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Build setup | |||
| ifeq ($(HEADLESS),true) | |||
| BUILD_DIR = ../build-headless/rack | |||
| else | |||
| BUILD_DIR = ../build/rack | |||
| endif | |||
| ifeq ($(MACOS),true) | |||
| BASE_FLAGS += -DARCH_MAC | |||
| @@ -213,14 +217,18 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Build targets | |||
| TARGET = rack.a | |||
| ifeq ($(HEADLESS),true) | |||
| TARGET_SUFFIX = -headless | |||
| endif | |||
| TARGETS = rack$(TARGET_SUFFIX).a rack-headless.a | |||
| ifneq ($(MACOS),true) | |||
| CARDINAL_FX_ARGS = VST2_FILENAME=Cardinal.vst/CardinalFX$(LIB_EXT) CLAP_FILENAME=Cardinal.clap/CardinalFX.clap | |||
| CARDINAL_SYNTH_ARGS = VST2_FILENAME=Cardinal.vst/CardinalSynth$(LIB_EXT) CLAP_FILENAME=Cardinal.clap/CardinalSynth.clap | |||
| endif | |||
| all: $(TARGET) | |||
| all: $(TARGETS) | |||
| ifeq ($(MOD_BUILD),true) | |||
| $(MAKE) -C Cardinal lv2 | |||
| $(MAKE) -C CardinalFX lv2 | |||
| @@ -228,37 +236,38 @@ else ifeq ($(WASM),true) | |||
| $(MAKE) -C CardinalNative | |||
| else | |||
| $(MAKE) -C Cardinal | |||
| $(MAKE) -C CardinalMini | |||
| $(MAKE) -C CardinalNative | |||
| $(MAKE) -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| $(MAKE) -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| endif | |||
| jack: $(TARGET) | |||
| jack: $(TARGETS) | |||
| $(MAKE) jack -C Cardinal | |||
| native: $(TARGET) | |||
| native: $(TARGETS) | |||
| $(MAKE) jack -C CardinalNative | |||
| lv2: $(TARGET) | |||
| lv2: $(TARGETS) | |||
| $(MAKE) lv2 -C Cardinal | |||
| $(MAKE) lv2 -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| $(MAKE) lv2 -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| vst2: $(TARGET) | |||
| vst2: $(TARGETS) | |||
| $(MAKE) vst2 -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| $(MAKE) vst2 -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| vst3: $(TARGET) | |||
| vst3: $(TARGETS) | |||
| $(MAKE) vst3 -C Cardinal | |||
| $(MAKE) vst3 -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| $(MAKE) vst3 -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| clap: $(TARGET) | |||
| clap: $(TARGETS) | |||
| $(MAKE) clap -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| $(MAKE) clap -C CardinalSynth $(CARDINAL_SYNTH_ARGS) | |||
| clean: | |||
| rm -f $(TARGET) | |||
| rm -f $(TARGETS) | |||
| rm -rf $(BUILD_DIR) | |||
| $(MAKE) clean -C Cardinal | |||
| $(MAKE) clean -C CardinalFX $(CARDINAL_FX_ARGS) | |||
| @@ -269,11 +278,16 @@ clean: | |||
| RACK_OBJS = $(RACK_FILES:%=$(BUILD_DIR)/%.o) | |||
| $(TARGET): $(RACK_OBJS) | |||
| rack$(TARGET_SUFFIX).a: $(RACK_OBJS) | |||
| @echo "Creating $@" | |||
| $(SILENT)rm -f $@ | |||
| $(SILENT)$(AR) crs $@ $^ | |||
| ifneq ($(HEADLESS),true) | |||
| rack-headless.a: | |||
| $(MAKE) HEADLESS=true $@ | |||
| endif | |||
| $(BUILD_DIR)/%.c.o: %.c | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| @@ -8,6 +8,8 @@ | |||
| ifeq ($(NAME),Cardinal) | |||
| CARDINAL_VARIANT = main | |||
| else ifeq ($(NAME),CardinalMini) | |||
| CARDINAL_VARIANT = mini | |||
| else ifeq ($(NAME),CardinalFX) | |||
| CARDINAL_VARIANT = fx | |||
| else ifeq ($(NAME),CardinalNative) | |||
| @@ -19,6 +21,7 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Carla stuff | |||
| ifneq ($(CARDINAL_VARIANT),mini) | |||
| ifneq ($(STATIC_BUILD),true) | |||
| STATIC_PLUGIN_TARGET = true | |||
| @@ -49,6 +52,7 @@ CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/ysfx.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/zita-resampler.a | |||
| endif # STATIC_BUILD | |||
| endif # CARDINAL_VARIANT mini | |||
| # -------------------------------------------------------------- | |||
| # Import base definitions | |||
| @@ -64,7 +68,7 @@ ifeq ($(CARDINAL_VARIANT),main) | |||
| # main variant should not use rtaudio/sdl2 fallback (it has CV ports) | |||
| SKIP_NATIVE_AUDIO_FALLBACK = true | |||
| else | |||
| # fx and synth variants should only use rtaudio/sdl2 fallbacks | |||
| # other variants should only use rtaudio/sdl2 fallbacks | |||
| FORCE_NATIVE_AUDIO_FALLBACK = true | |||
| endif | |||
| @@ -94,7 +98,10 @@ FILES_DSP = CardinalPlugin.cpp | |||
| FILES_DSP += CardinalCommon.cpp | |||
| FILES_DSP += common.cpp | |||
| ifeq ($(HEADLESS),true) | |||
| ifeq ($(CARDINAL_VARIANT),mini) | |||
| FILES_DSP += RemoteNanoVG.cpp | |||
| FILES_DSP += RemoteWindow.cpp | |||
| else ifeq ($(HEADLESS),true) | |||
| FILES_DSP += RemoteNanoVG.cpp | |||
| FILES_DSP += RemoteWindow.cpp | |||
| else | |||
| @@ -110,12 +117,24 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Extra libraries to link against | |||
| ifeq ($(NOPLUGINS),true) | |||
| RACK_EXTRA_LIBS = ../../plugins/noplugins.a | |||
| ifeq ($(HEADLESS),true) | |||
| TARGET_SUFFIX = -headless | |||
| endif | |||
| ifeq ($(CARDINAL_VARIANT),mini) | |||
| RACK_EXTRA_LIBS = ../../plugins/plugins-mini-headless.a | |||
| else ifeq ($(NOPLUGINS),true) | |||
| RACK_EXTRA_LIBS = ../../plugins/noplugins$(TARGET_SUFFIX).a | |||
| else | |||
| RACK_EXTRA_LIBS = ../../plugins/plugins$(TARGET_SUFFIX).a | |||
| endif | |||
| ifeq ($(CARDINAL_VARIANT),mini) | |||
| RACK_EXTRA_LIBS += ../rack-headless.a | |||
| else | |||
| RACK_EXTRA_LIBS = ../../plugins/plugins.a | |||
| RACK_EXTRA_LIBS += ../rack$(TARGET_SUFFIX).a | |||
| endif | |||
| RACK_EXTRA_LIBS += ../rack.a | |||
| RACK_EXTRA_LIBS += $(DEP_LIB_PATH)/libquickjs.a | |||
| ifneq ($(SYSDEPS),true) | |||
| @@ -133,6 +152,7 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # surgext libraries | |||
| ifneq ($(CARDINAL_VARIANT),mini) | |||
| ifneq ($(NOPLUGINS),true) | |||
| SURGE_DEP_PATH = $(abspath ../../deps/surge-build) | |||
| RACK_EXTRA_LIBS += $(SURGE_DEP_PATH)/src/common/libsurge-common.a | |||
| @@ -152,6 +172,7 @@ endif | |||
| RACK_EXTRA_LIBS += $(SURGE_DEP_PATH)/libs/sst/sst-plugininfra/libs/strnatcmp/libstrnatcmp.a | |||
| RACK_EXTRA_LIBS += $(SURGE_DEP_PATH)/libs/sst/sst-plugininfra/libs/tinyxml/libtinyxml.a | |||
| endif | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| @@ -162,18 +183,18 @@ STATIC_CARLA_PLUGIN_LIBS = -lsndfile -lopus -lFLAC -lvorbisenc -lvorbis -logg -l | |||
| endif | |||
| endif | |||
| EXTRA_DEPENDENCIES = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS) | |||
| EXTRA_LIBS = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS) $(STATIC_CARLA_PLUGIN_LIBS) | |||
| EXTRA_DSP_DEPENDENCIES = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS) | |||
| EXTRA_DSP_LIBS = $(RACK_EXTRA_LIBS) $(CARLA_EXTRA_LIBS) $(STATIC_CARLA_PLUGIN_LIBS) | |||
| ifeq ($(shell $(PKG_CONFIG) --exists fftw3f && echo true),true) | |||
| EXTRA_DEPENDENCIES += ../../deps/aubio/libaubio.a | |||
| EXTRA_LIBS += ../../deps/aubio/libaubio.a | |||
| EXTRA_LIBS += $(shell $(PKG_CONFIG) --libs fftw3f) | |||
| EXTRA_DSP_DEPENDENCIES += ../../deps/aubio/libaubio.a | |||
| EXTRA_DSP_LIBS += ../../deps/aubio/libaubio.a | |||
| EXTRA_DSP_LIBS += $(shell $(PKG_CONFIG) --libs fftw3f) | |||
| endif | |||
| ifneq ($(NOPLUGINS),true) | |||
| ifeq ($(MACOS),true) | |||
| EXTRA_LIBS += -framework Accelerate | |||
| EXTRA_DSP_LIBS += -framework Accelerate | |||
| endif | |||
| endif | |||
| @@ -216,9 +237,22 @@ ifneq ($(STATIC_BUILD),true) | |||
| WASM_RESOURCES += $(CURDIR)/lv2/fomp.lv2/manifest.ttl | |||
| endif | |||
| EXTRA_DEPENDENCIES += $(WASM_RESOURCES) | |||
| EXTRA_DSP_DEPENDENCIES += $(WASM_RESOURCES) | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # mini variant UI | |||
| # ifeq ($(CARDINAL_VARIANT),mini) | |||
| # ifneq ($(HEADLESS)$(MOD_BUILD),true) | |||
| # FILES_UI = CardinalUI.cpp | |||
| # FILES_UI += glfw.cpp | |||
| # FILES_UI += Window.cpp | |||
| # EXTRA_UI_DEPENDENCIES = $(subst -headless,,$(EXTRA_DSP_DEPENDENCIES)) | |||
| # EXTRA_UI_LIBS = $(subst -headless,,$(EXTRA_DSP_LIBS)) | |||
| # endif | |||
| # endif | |||
| # -------------------------------------------------------------- | |||
| # Do some magic | |||
| @@ -370,13 +404,13 @@ ifeq ($(MACOS),true) | |||
| LINK_FLAGS += -framework IOKit | |||
| else ifeq ($(WINDOWS),true) | |||
| # needed by VCVRack | |||
| EXTRA_LIBS += -ldbghelp -lshlwapi -Wl,--stack,0x100000 | |||
| EXTRA_DSP_LIBS += -ldbghelp -lshlwapi -Wl,--stack,0x100000 | |||
| # needed by JW-Modules | |||
| EXTRA_LIBS += -lws2_32 -lwinmm | |||
| EXTRA_DSP_LIBS += -lws2_32 -lwinmm | |||
| endif | |||
| ifeq ($(SYSDEPS),true) | |||
| EXTRA_LIBS += $(shell $(PKG_CONFIG) --libs jansson libarchive samplerate speexdsp) | |||
| EXTRA_DSP_LIBS += $(shell $(PKG_CONFIG) --libs jansson libarchive samplerate speexdsp) | |||
| endif | |||
| ifeq ($(WITH_LTO),true) | |||
| @@ -393,7 +427,7 @@ endif | |||
| ifeq ($(HAVE_LIBLO),true) | |||
| BASE_FLAGS += $(LIBLO_FLAGS) | |||
| LINK_FLAGS += $(LIBLO_LIBS) | |||
| EXTRA_DSP_LIBS += $(LIBLO_LIBS) | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| @@ -422,10 +456,9 @@ BUILD_CXX_FLAGS += -DCARDINAL_PLUGIN_PREFIX='"$(PREFIX)"' | |||
| # Enable all possible plugin types and setup resources | |||
| ifeq ($(CARDINAL_VARIANT),main) | |||
| TARGETS = lv2 vst3 clap | |||
| ifeq ($(HAVE_JACK),true) | |||
| TARGETS += jack | |||
| endif | |||
| TARGETS = jack lv2 vst3 clap | |||
| else ifeq ($(CARDINAL_VARIANT),mini) | |||
| TARGETS = lv2_sep | |||
| else ifeq ($(CARDINAL_VARIANT),native) | |||
| TARGETS = jack | |||
| else | |||
| @@ -40,6 +40,7 @@ static constexpr const uint kModuleParameters = 24; | |||
| enum CardinalVariant { | |||
| kCardinalVariantMain, | |||
| kCardinalVariantMini, | |||
| kCardinalVariantFX, | |||
| kCardinalVariantNative, | |||
| kCardinalVariantSynth, | |||
| @@ -74,6 +75,8 @@ struct CardinalPluginContext : rack::Context { | |||
| sampleRate(p != nullptr ? p->getSampleRate() : 0.0), | |||
| #if CARDINAL_VARIANT_MAIN | |||
| variant(kCardinalVariantMain), | |||
| #elif CARDINAL_VARIANT_MINI | |||
| variant(kCardinalVariantMini), | |||
| #elif CARDINAL_VARIANT_FX | |||
| variant(kCardinalVariantFX), | |||
| #elif CARDINAL_VARIANT_NATIVE | |||
| @@ -162,7 +165,11 @@ public: | |||
| CardinalBaseUI(const uint width, const uint height) | |||
| : UI(width, height), | |||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| context(getRackContextFromPlugin(getPluginInstancePointer())), | |||
| #else | |||
| context(new CardinalPluginContext(nullptr)), | |||
| #endif | |||
| saving(false), | |||
| savingUncompressed(false), | |||
| #ifdef DISTRHO_OS_WASM | |||
| @@ -182,6 +189,9 @@ public: | |||
| context->tlw = nullptr; | |||
| context->ui = nullptr; | |||
| #if !DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| delete context; | |||
| #endif | |||
| } | |||
| }; | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Cardinal Plugin | |||
| * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com> | |||
| * 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 | |||
| @@ -15,8 +15,18 @@ | |||
| * For a full copy of the GNU General Public License see the LICENSE file. | |||
| */ | |||
| #include "DistrhoPluginInfo.h" | |||
| #ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # error wrong build | |||
| #endif | |||
| #if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| # define HEADLESS | |||
| #endif | |||
| #ifndef HEADLESS | |||
| #include "OpenGL.hpp" | |||
| # include "OpenGL.hpp" | |||
| #endif | |||
| #include "nanovg.h" | |||