From bbb82b8530c77c427a0aa14c365f0178f730f705 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 18 Dec 2018 22:44:14 +0000 Subject: [PATCH] Working wine-native bridge, needs testing Signed-off-by: falkTX --- source/backend/engine/CarlaEngine.cpp | 5 + source/plugin/Makefile | 103 +++++++++++++-------- source/plugin/carla-vst-export-bridged.cpp | 76 +++++++++++++++ 3 files changed, 146 insertions(+), 38 deletions(-) create mode 100644 source/plugin/carla-vst-export-bridged.cpp diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 3350095c8..1d28c895a 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -2075,6 +2075,11 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc) // check old stuff, unhandled now if (tag == "AU_PATH" || tag == "VST3_PATH" || tag == "GIG_PATH") continue; + // ignored tags + if (tag == "LADSPA_PATH" || tag == "DSSI_PATH" || tag == "LV2_PATH" || tag == "VST2_PATH") + continue; + if (tag == "SF2_PATH" || tag == "SFZ_PATH") + continue; // hmm something is wrong.. carla_stderr2("CarlaEngine::loadProjectInternal() - Unhandled option '%s'", tag.toRawUTF8()); diff --git a/source/plugin/Makefile b/source/plugin/Makefile index 1b3a10b3b..4656249b7 100644 --- a/source/plugin/Makefile +++ b/source/plugin/Makefile @@ -62,16 +62,17 @@ endif # --------------------------------------------------------------------------------------------------------------------- # Link flags -LINK_FLAGS += $(JACKBRIDGE_LIBS) -LINK_FLAGS += $(LILV_LIBS) -LINK_FLAGS += $(RTMEMPOOL_LIBS) -LINK_FLAGS += $(WATER_LIBS) -LINK_FLAGS += $(NATIVE_PLUGINS_LIBS) - -LINK_FLAGS += $(FLUIDSYNTH_LIBS) -LINK_FLAGS += $(LIBLO_LIBS) -LINK_FLAGS += $(MAGIC_LIBS) -LINK_FLAGS += $(X11_LIBS) +NATIVE_LINK_FLAGS = $(LINK_FLAGS) +NATIVE_LINK_FLAGS += $(JACKBRIDGE_LIBS) +NATIVE_LINK_FLAGS += $(LILV_LIBS) +NATIVE_LINK_FLAGS += $(RTMEMPOOL_LIBS) +NATIVE_LINK_FLAGS += $(WATER_LIBS) +NATIVE_LINK_FLAGS += $(NATIVE_PLUGINS_LIBS) + +NATIVE_LINK_FLAGS += $(FLUIDSYNTH_LIBS) +NATIVE_LINK_FLAGS += $(LIBLO_LIBS) +NATIVE_LINK_FLAGS += $(MAGIC_LIBS) +NATIVE_LINK_FLAGS += $(X11_LIBS) ifeq ($(MACOS),true) SYMBOLS_NATIVE = -Wl,-exported_symbol,_carla_get_native_rack_plugin @@ -96,7 +97,7 @@ LIBS_wine += $(MODULEDIR)/water.files.a WINE_LINK_FLAGS = $(LINK_FLAGS) WINE_LINK_FLAGS += -L$(BINDIR) -lcarla_native-plugin -WINE_LINK_FLAGS += -lstdc++ -lopengl32 -lgdi32 +WINE_LINK_FLAGS += -lstdc++ -lopengl32 -lgdi32 -ldl WINE_LINK_FLAGS += -Wl,-rpath,/usr/local/lib/carla WINE_LINK_FLAGS += -Wl,-rpath,/usr/lib/carla @@ -137,8 +138,10 @@ endif all: $(TARGETS) -ifneq ($(WIN32),true) -wine: $(BINDIR)/CarlaVstShell.dll $(BINDIR)/CarlaVstFXShell.dll +ifeq ($(WIN32),true) +wine: $(BINDIR)/CarlaVstShellBridged.dll $(BINDIR)/CarlaVstFxShellBridged.dll +else +wine: $(BINDIR)/CarlaVstShellBridged.dll.so $(BINDIR)/CarlaVstFxShellBridged.dll.so endif # --------------------------------------------------------------------------------------------------------------------- @@ -156,78 +159,90 @@ debug: $(BINDIR)/carla-native-plugin$(APP_EXT): $(OBJDIR)/carla-native-plugin.cpp.o -@mkdir -p $(BINDIR) @echo "Linking carla-native-plugin$(APP_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(LINK_FLAGS) -o $@ + @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/libcarla_native-plugin$(LIB_EXT): $(OBJDIR)/carla-native-plugin.cpp.o -@mkdir -p $(BINDIR) @echo "Linking libcarla-native-plugin$(LIB_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(SYMBOLS_NATIVE) $(LINK_FLAGS) -o $@ + @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(SYMBOLS_NATIVE) $(NATIVE_LINK_FLAGS) -o $@ # --------------------------------------------------------------------------------------------------------------------- $(BINDIR)/carla.lv2/carla$(LIB_EXT): $(OBJDIR)/carla-lv2.cpp.o -@mkdir -p $(BINDIR)/carla.lv2 @echo "Linking carla.lv2/carla$(LIB_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(SYMBOLS_LV2) $(LINK_FLAGS) -o $@ + @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(SYMBOLS_LV2) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/carla.lv2/carla-ui$(LIB_EXT): $(OBJDIR)/carla-lv2-ui.cpp.o $(LIBS_ui) -@mkdir -p $(BINDIR)/carla.lv2 @echo "Linking carla.lv2/carla-ui$(LIB_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS_ui) $(LIBS_END) $(SHARED) $(SYMBOLS_LV2_UI) $(LINK_FLAGS) -o $@ + @$(CXX) $< $(LIBS_START) $(LIBS_ui) $(LIBS_END) $(SHARED) $(SYMBOLS_LV2_UI) $(NATIVE_LINK_FLAGS) -o $@ # --------------------------------------------------------------------------------------------------------------------- $(BINDIR)/CarlaRack$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.rack-syn.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaRack$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaRackFX$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.rack-fx.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaRackFX$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaPatchbay$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.patchbay-syn.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaPatchbay$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaPatchbay16$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.patchbay-syn16.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaPatchbay16$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaPatchbay32$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.patchbay-syn32.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaPatchbay32$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaPatchbayFX$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.patchbay-fx.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaPatchbayFX$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ -ifneq ($(WIN32),true) -$(BINDIR)/CarlaVstShell.dll: $(OBJDIR)/carla-vst.cpp.shell.o $(OBJDIR)/carla-vst-export.cpp.dll.o carla-vst-export.def - -@mkdir -p $(BINDIR) - @echo "Linking CarlaRackVstShell.dll" - @$(WINECC) $^ $(LIBS_START) $(LIBS_wine) $(LIBS_END) $(SHARED) $(WINE_LINK_FLAGS) -o $@ - -$(BINDIR)/CarlaVstFXShell.dll: $(OBJDIR)/carla-vst.cpp.shellfx.o $(OBJDIR)/carla-vst-export.cpp.dll.o carla-vst-export.def - -@mkdir -p $(BINDIR) - @echo "Linking CarlaVstFXShell.dll" - @$(WINECC) $^ $(LIBS_START) $(LIBS_wine) $(LIBS_END) $(SHARED) $(WINE_LINK_FLAGS) -o $@ -endif +# --------------------------------------------------------------------------------------------------------------------- $(BINDIR)/CarlaVstShell$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.shell.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaVstShell$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ $(BINDIR)/CarlaVstFxShell$(LIB_EXT): $(OBJDIR)/carla-vst.cpp.shellfx.o $(OBJDIR)/carla-vst-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking CarlaVstFxShell$(LIB_EXT)" - @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(LINK_FLAGS) -o $@ + @$(CXX) $^ $(LIBS_START) $(LIBS) $(LIBS_END) $(SHARED) $(NATIVE_LINK_FLAGS) -o $@ + +ifeq ($(WIN32),true) +$(BINDIR)/CarlaVstShellBridged.dll: $(OBJDIR)/carla-vst-export-bridged.cpp.synth.o carla-vst-export.def + -@mkdir -p $(BINDIR) + @echo "Linking CarlaVstShellBridged.dll" + @$(CXX) $^ $(SHARED) $(LINK_FLAGS) -o $@ + +$(BINDIR)/CarlaVstFxShellBridged.dll: $(OBJDIR)/carla-vst-export-bridged.cpp.fx.o carla-vst-export.def + -@mkdir -p $(BINDIR) + @echo "Linking CarlaVstFxShellBridged.dll" + @$(CXX) $^ $(SHARED) $(LINK_FLAGS) -o $@ +else +$(BINDIR)/CarlaVstShellBridged.dll.so: $(OBJDIR)/carla-vst.cpp.shell.o $(OBJDIR)/carla-vst-export.cpp.dll.o carla-vst-export.def + -@mkdir -p $(BINDIR) + @echo "Linking CarlaVstShellBridged.dll.so" + @$(WINECC) $^ $(LIBS_START) $(LIBS_wine) $(LIBS_END) $(SHARED) $(WINE_LINK_FLAGS) -o $@ + +$(BINDIR)/CarlaVstFxShellBridged.dll.so: $(OBJDIR)/carla-vst.cpp.shellfx.o $(OBJDIR)/carla-vst-export.cpp.dll.o carla-vst-export.def + -@mkdir -p $(BINDIR) + @echo "Linking CarlaVstFxShellBridged.dll.so" + @$(WINECC) $^ $(LIBS_START) $(LIBS_wine) $(LIBS_END) $(SHARED) $(WINE_LINK_FLAGS) -o $@ +endif # --------------------------------------------------------------------------------------------------------------------- @@ -290,6 +305,16 @@ $(OBJDIR)/carla-vst.cpp.shellfx.o: carla-vst.cpp @echo "Compiling $< (VstShell)" @$(CXX) $< $(BUILD_CXX_FLAGS) -DCARLA_VST_SHELL=1 -DCARLA_PLUGIN_SYNTH=0 -c -o $@ +$(OBJDIR)/carla-vst-export-bridged.cpp.fx.o: carla-vst-export-bridged.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CXX) $< $(BUILD_CXX_FLAGS) -DCARLA_PLUGIN_SYNTH=0 -c -o $@ + +$(OBJDIR)/carla-vst-export-bridged.cpp.synth.o: carla-vst-export-bridged.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CXX) $< $(BUILD_CXX_FLAGS) -DCARLA_PLUGIN_SYNTH=1 -c -o $@ + $(OBJDIR)/carla-vst-export.cpp.o: carla-vst-export.cpp -@mkdir -p $(OBJDIR) @echo "Compiling $<" @@ -305,7 +330,7 @@ $(OBJDIR)/carla-vst-export.cpp.dll.o: carla-vst-export.cpp $(BINDIR)/carla.lv2/manifest.ttl: $(OBJDIR)/carla-lv2-export.cpp.o -@mkdir -p $(BINDIR)/carla.lv2 @echo "Linking carla-lv2-export$(APP_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(LINK_FLAGS) -o $(BINDIR)/carla-lv2-export$(APP_EXT) + @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(NATIVE_LINK_FLAGS) -o $(BINDIR)/carla-lv2-export$(APP_EXT) @echo "Generating LV2 ttl data" ifeq ($(BUILDING_FOR_WINDOWS),true) @@ -318,7 +343,7 @@ endif $(BINDIR)/carla-lv2-export$(APP_EXT): $(OBJDIR)/carla-lv2-export.cpp.o -@mkdir -p $(BINDIR) @echo "Linking carla-lv2-export$(APP_EXT)" - @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(LINK_FLAGS) -o $@ + @$(CXX) $< $(LIBS_START) $(LIBS) $(LIBS_END) $(NATIVE_LINK_FLAGS) -o $@ $(OBJDIR)/carla-lv2-export.cpp.o: carla-lv2-export.cpp -@mkdir -p $(OBJDIR) @@ -338,5 +363,7 @@ $(OBJDIR)/carla-lv2-export.cpp.o: carla-lv2-export.cpp -include $(OBJDIR)/carla-vst.cpp.shell.d -include $(OBJDIR)/carla-vst-export.cpp.d -include $(OBJDIR)/carla-vst-export.cpp.dll.d +-include $(OBJDIR)/carla-vst-export-bridged.cpp.fx.d +-include $(OBJDIR)/carla-vst-export-bridged.cpp.synth.d # --------------------------------------------------------------------------------------------------------------------- diff --git a/source/plugin/carla-vst-export-bridged.cpp b/source/plugin/carla-vst-export-bridged.cpp new file mode 100644 index 000000000..8034c9d55 --- /dev/null +++ b/source/plugin/carla-vst-export-bridged.cpp @@ -0,0 +1,76 @@ +/* + * Carla Native Plugins + * Copyright (C) 2013-2018 Filipe Coelho + * + * 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 2 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 doc/GPL.txt file. + */ + +#include "CarlaLibUtils.hpp" +#include "vestige/vestige.h" + +#ifdef __WINE__ +#error This file is not meant to be used by wine! +#endif +#ifndef CARLA_OS_WIN +#error This file is only meant to be used by mingw compilers! +#endif +#ifndef CARLA_PLUGIN_SYNTH +#error CARLA_PLUGIN_SYNTH undefined +#endif + +typedef const AEffect* (__cdecl *MainCallback)(audioMasterCallback); + +static HINSTANCE currentModuleHandle = nullptr; + +HINSTANCE getCurrentModuleInstanceHandle() noexcept +{ + if (currentModuleHandle == nullptr) + currentModuleHandle = GetModuleHandleA(nullptr); + + return currentModuleHandle; +} + +CARLA_EXPORT +BOOL WINAPI DllMain(HINSTANCE hInst, DWORD, LPVOID) +{ + currentModuleHandle = hInst; + return 1; +} + +CARLA_EXPORT __cdecl +const AEffect* VSTPluginMain(audioMasterCallback audioMaster) +{ + static MainCallback sCallback = nullptr; + + if (sCallback == nullptr) + { + CHAR filename[MAX_PATH + 256]; + filename[0] = 0; + GetModuleFileName(getCurrentModuleInstanceHandle(), filename, MAX_PATH + 256); + strcat(filename, ".so"); + + + carla_stdout("FILENAME: '%s'", filename); + static const lib_t lib = lib_open(filename); + if (lib == nullptr) + { + carla_stderr2("lib_open failed: %s", lib_error(filename)); + return nullptr; + } + + sCallback = lib_symbol(lib, "VSTPluginMain"); + } + + CARLA_SAFE_ASSERT_RETURN(sCallback != nullptr, nullptr); + return sCallback(audioMaster); +}