| @@ -17,7 +17,7 @@ ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||||
| BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | ||||
| endif | endif | ||||
| ifeq ($(HAVE_QT5), true) | |||||
| ifeq ($(HAVE_QT5),true) | |||||
| QT_UI_FLAGS = $(shell pkg-config --cflags QtWidgets) | QT_UI_FLAGS = $(shell pkg-config --cflags QtWidgets) | ||||
| QT_UI_LIBS = $(shell pkg-config --libs QtWidgets) | QT_UI_LIBS = $(shell pkg-config --libs QtWidgets) | ||||
| else | else | ||||
| @@ -28,23 +28,22 @@ endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Plugin bridges | # Plugin bridges | ||||
| BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) | |||||
| BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN | |||||
| BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) -DBUILD_BRIDGE_PLUGIN | |||||
| BUILD_PLUGIN_FLAGS += -DCARLA_ENGINE_JACK -I../carla-backend -I../carla-engine -I../carla-jackbridge -I../carla-plugin | BUILD_PLUGIN_FLAGS += -DCARLA_ENGINE_JACK -I../carla-backend -I../carla-engine -I../carla-jackbridge -I../carla-plugin | ||||
| BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags jack) $(QT_UI_FLAGS) | BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags jack) $(QT_UI_FLAGS) | ||||
| LINK_PLUGIN_FLAGS = $(LINK_FLAGS) | LINK_PLUGIN_FLAGS = $(LINK_FLAGS) | ||||
| LINK_PLUGIN_FLAGS += $(shell pkg-config --libs QtGui) | |||||
| LINK_PLUGIN_FLAGS += $(QT_UI_LIBS) | |||||
| POSIX_BUILD_FLAGS = $(BUILD_PLUGIN_FLAGS) | |||||
| POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu | |||||
| POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu | |||||
| POSIX_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) $(shell pkg-config --libs jack) -ldl | |||||
| POSIX_BUILD_FLAGS = $(BUILD_PLUGIN_FLAGS) | |||||
| POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu | |||||
| POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu | |||||
| POSIX_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) $(shell pkg-config --libs jack) -ldl | |||||
| WIN_BUILD_FLAGS = $(BUILD_PLUGIN_FLAGS) -DJACKBRIDGE_EXPORT -DPTW32_STATIC_LIB | |||||
| WIN_32BIT_FLAGS = $(32BIT_FLAGS) | |||||
| WIN_64BIT_FLAGS = $(64BIT_FLAGS) | |||||
| WIN_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) -mwindows -L../carla-jackbridge -lpthread | |||||
| WIN_BUILD_FLAGS = $(BUILD_PLUGIN_FLAGS) -DJACKBRIDGE_EXPORT -DPTW32_STATIC_LIB | |||||
| WIN_32BIT_FLAGS = $(32BIT_FLAGS) | |||||
| WIN_64BIT_FLAGS = $(64BIT_FLAGS) | |||||
| WIN_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) -mwindows -L../carla-jackbridge -lpthread | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # UI bridges | # UI bridges | ||||
| @@ -82,7 +81,7 @@ LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| ifeq ($(CARLA_PLUGIN_SUPPORT),true) | ifeq ($(CARLA_PLUGIN_SUPPORT),true) | ||||
| all: ui_lv2-gtk2 ui_lv2-gtk3 ui_lv2-qt4 ui_lv2-x11 ui_vst-x11 | |||||
| all: ui_lv2-gtk2 ui_lv2-gtk3 ui_lv2-qt4 ui_lv2-qt5 ui_lv2-x11 ui_vst-x11 | |||||
| ifeq ($(shell pkg-config --exists gtk+-2.0 && echo true),true) | ifeq ($(shell pkg-config --exists gtk+-2.0 && echo true),true) | ||||
| ui_lv2-gtk2: carla-bridge-lv2-gtk2 | ui_lv2-gtk2: carla-bridge-lv2-gtk2 | ||||
| @@ -96,9 +95,17 @@ else | |||||
| ui_lv2-gtk3: | ui_lv2-gtk3: | ||||
| endif | endif | ||||
| ui_lv2-qt4: carla-bridge-lv2-qt4 | |||||
| ui_lv2-qt5: carla-bridge-lv2-qt5 | |||||
| ifneq ($(HAVE_QT5),true) | |||||
| ui_lv2-qt4: carla-bridge-lv2-qt4 | |||||
| ui_lv2-qt5: | |||||
| else | |||||
| ui_lv2-qt4: | |||||
| ui_lv2-qt5: carla-bridge-lv2-qt5 | |||||
| endif | |||||
| ui_lv2-hwnd: carla-bridge-lv2-hwnd.exe | |||||
| ui_lv2-x11: carla-bridge-lv2-x11 | ui_lv2-x11: carla-bridge-lv2-x11 | ||||
| ui_vst-hwnd: carla-bridge-vst-hwnd.exe | ui_vst-hwnd: carla-bridge-vst-hwnd.exe | ||||
| ui_vst-x11: carla-bridge-vst-x11 | ui_vst-x11: carla-bridge-vst-x11 | ||||
| @@ -114,7 +121,7 @@ win32: carla-bridge-win32.exe | |||||
| win64: carla-bridge-win64.exe | win64: carla-bridge-win64.exe | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # common | |||||
| # UI common | |||||
| carla_bridge_osc__lv2.o: carla_bridge_osc.cpp | carla_bridge_osc__lv2.o: carla_bridge_osc.cpp | ||||
| $(CXX) $< $(BUILD_UI_LV2_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_FLAGS) -c -o $@ | ||||
| @@ -125,139 +132,97 @@ carla_bridge_osc__vst.o: carla_bridge_osc.cpp | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_lv2-gtk2 | # ui_lv2-gtk2 | ||||
| OBJS_UI_LV2_GTK2 = \ | |||||
| carla_bridge_ui-lv2__lv2-gtk2.o carla_bridge_toolkit-gtk2__lv2-gtk2.o carla_bridge_osc__lv2.o \ | |||||
| OBJS_UI_LV2_GTK2 = carla_bridge_ui-lv2__lv2-gtk2.o \ | |||||
| carla_bridge_client__lv2-gtk2.o carla_bridge_osc__lv2.o \ | |||||
| carla_bridge_toolkit__lv2-gtk2.o carla_bridge_toolkit-gtk__lv2-gtk2.o \ | |||||
| ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ||||
| carla-bridge-lv2-gtk2: $(OBJS_UI_LV2_GTK2) | carla-bridge-lv2-gtk2: $(OBJS_UI_LV2_GTK2) | ||||
| $(CXX) $^ $(LINK_UI_LV2_GTK2_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_LV2_GTK2_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_ui-lv2__lv2-gtk2.o: carla_bridge_ui-lv2.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_GTK2_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-gtk2__lv2-gtk2.o: carla_bridge_toolkit-gtk2.cpp | |||||
| %__lv2-gtk2.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_GTK2_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_GTK2_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_lv2-gtk3 | # ui_lv2-gtk3 | ||||
| OBJS_UI_LV2_GTK3 = \ | |||||
| carla_bridge_ui-lv2__lv2-gtk3.o carla_bridge_toolkit-gtk3__lv2-gtk3.o carla_bridge_osc__lv2.o \ | |||||
| OBJS_UI_LV2_GTK3 = carla_bridge_ui-lv2__lv2-gtk3.o \ | |||||
| carla_bridge_client__lv2-gtk3.o carla_bridge_osc__lv2.o \ | |||||
| carla_bridge_toolkit__lv2-gtk3.o carla_bridge_toolkit-gtk__lv2-gtk3.o \ | |||||
| ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ||||
| carla-bridge-lv2-gtk3: $(OBJS_UI_LV2_GTK3) | carla-bridge-lv2-gtk3: $(OBJS_UI_LV2_GTK3) | ||||
| $(CXX) $^ $(LINK_UI_LV2_GTK3_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_LV2_GTK3_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_ui-lv2__lv2-gtk3.o: carla_bridge_ui-lv2.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_GTK3_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-gtk3__lv2-gtk3.o: carla_bridge_toolkit-gtk3.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_GTK3_FLAGS) -c -o $@ | |||||
| carla_bridge_osc__lv2-gtk3.o: carla_bridge_osc.cpp | |||||
| %__lv2-gtk3.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_GTK3_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_GTK3_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_lv2-qt4 | # ui_lv2-qt4 | ||||
| OBJS_UI_LV2_QT4 = \ | |||||
| carla_bridge_ui-lv2__lv2-qt4.o carla_bridge_toolkit-qt__lv2-qt4.o carla_bridge_osc__lv2.o \ | |||||
| OBJS_UI_LV2_QT4 = carla_bridge_ui-lv2__lv2-qt4.o \ | |||||
| carla_bridge_client__lv2-qt4.o carla_bridge_osc__lv2.o \ | |||||
| carla_bridge_toolkit__lv2-qt4.o carla_bridge_toolkit-qt__lv2-qt4.o \ | |||||
| ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ||||
| carla-bridge-lv2-qt4: $(OBJS_UI_LV2_QT4) | carla-bridge-lv2-qt4: $(OBJS_UI_LV2_QT4) | ||||
| $(CXX) $^ $(LINK_UI_LV2_QT4_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_LV2_QT4_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_ui-lv2__lv2-qt4.o: carla_bridge_ui-lv2.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT4_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-qt__lv2-qt4.o: carla_bridge_toolkit-qt.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT4_FLAGS) -c -o $@ | |||||
| carla_bridge_osc__lv2-qt4.o: carla_bridge_osc.cpp | |||||
| %__lv2-qt4.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT4_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_QT4_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_lv2-qt5 | # ui_lv2-qt5 | ||||
| OBJS_UI_LV2_QT5 = \ | |||||
| carla_bridge_ui-lv2__lv2-qt5.o carla_bridge_toolkit-qt__lv2-qt5.o carla_bridge_osc__lv2.o \ | |||||
| OBJS_UI_LV2_QT5 = carla_bridge_ui-lv2__lv2-qt5.o \ | |||||
| carla_bridge_client__lv2-qt5.o carla_bridge_osc__lv2.o \ | |||||
| carla_bridge_toolkit__lv2-qt5.o carla_bridge_toolkit-qt__lv2-qt5.o \ | |||||
| ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ||||
| carla-bridge-lv2-qt5: $(OBJS_UI_LV2_QT5) | carla-bridge-lv2-qt5: $(OBJS_UI_LV2_QT5) | ||||
| $(CXX) $^ $(LINK_UI_LV2_QT5_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_LV2_QT5_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_ui-lv2__lv2-qt5.o: carla_bridge_ui-lv2.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT5_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-qt__lv2-qt5.o: carla_bridge_toolkit-qt.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT5_FLAGS) -c -o $@ | |||||
| carla_bridge_osc__lv2-qt5.o: carla_bridge_osc.cpp | |||||
| %__lv2-qt5.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_QT5_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_QT5_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_lv2-x11 | # ui_lv2-x11 | ||||
| OBJS_UI_LV2_X11 = \ | |||||
| carla_bridge_ui-lv2__lv2-x11.o carla_bridge_toolkit-qt__lv2-x11.o carla_bridge_osc__lv2.o \ | |||||
| OBJS_UI_LV2_X11 = carla_bridge_ui-lv2__lv2-x11.o \ | |||||
| carla_bridge_client__lv2-x11.o carla_bridge_osc__lv2.o \ | |||||
| carla_bridge_toolkit__lv2-x11.o carla_bridge_toolkit-qt__lv2-x11.o \ | |||||
| ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ../carla-lilv/carla_lilv.a ../carla-rtmempool/carla_rtmempool.a | ||||
| carla-bridge-lv2-x11: $(OBJS_UI_LV2_X11) | carla-bridge-lv2-x11: $(OBJS_UI_LV2_X11) | ||||
| $(CXX) $^ $(LINK_UI_LV2_X11_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_LV2_X11_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_ui-lv2__lv2-x11.o: carla_bridge_ui-lv2.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_X11_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-qt__lv2-x11.o: carla_bridge_toolkit-qt.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_X11_FLAGS) -c -o $@ | |||||
| carla_bridge_osc__lv2-x11.o: carla_bridge_osc.cpp | |||||
| %__lv2-x11.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_LV2_X11_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_LV2_X11_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_vst-hwnd | # ui_vst-hwnd | ||||
| OBJS_UI_VST_HWND = \ | |||||
| OBJS_UI_VST_HWND = carla_bridge_ui-vst__vst-hwnd.o \ | |||||
| carla_bridge_client__vst-hwnd.o carla_bridge_osc__vst.o \ | carla_bridge_client__vst-hwnd.o carla_bridge_osc__vst.o \ | ||||
| carla_bridge_toolkit__vst-hwnd.o carla_bridge_toolkit-qt__vst-hwnd.o \ | |||||
| carla_bridge_ui-vst__vst-hwnd.o | |||||
| carla_bridge_toolkit__vst-hwnd.o carla_bridge_toolkit-qt__vst-hwnd.o | |||||
| carla-bridge-vst-hwnd.exe: $(OBJS_UI_VST_HWND) | carla-bridge-vst-hwnd.exe: $(OBJS_UI_VST_HWND) | ||||
| $(CXX) $^ $(LINK_UI_VST_HWND_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_VST_HWND_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_client__vst-hwnd.o: carla_bridge_client.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit__vst-hwnd.o: carla_bridge_toolkit.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-qt__vst-hwnd.o: carla_bridge_toolkit-qt.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ | |||||
| carla_bridge_ui-vst__vst-hwnd.o: carla_bridge_ui-vst.cpp | |||||
| %__vst-hwnd.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_VST_HWND_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # ui_vst-x11 | # ui_vst-x11 | ||||
| OBJS_UI_VST_X11 = \ | |||||
| OBJS_UI_VST_X11 = carla_bridge_ui-vst__vst-x11.o \ | |||||
| carla_bridge_client__vst-x11.o carla_bridge_osc__vst.o \ | carla_bridge_client__vst-x11.o carla_bridge_osc__vst.o \ | ||||
| carla_bridge_toolkit__vst-x11.o carla_bridge_toolkit-qt__vst-x11.o \ | |||||
| carla_bridge_ui-vst__vst-x11.o | |||||
| carla_bridge_toolkit__vst-x11.o carla_bridge_toolkit-qt__vst-x11.o | |||||
| carla-bridge-vst-x11: $(OBJS_UI_VST_X11) | carla-bridge-vst-x11: $(OBJS_UI_VST_X11) | ||||
| $(CXX) $^ $(LINK_UI_VST_X11_FLAGS) -o $@ && $(STRIP) $@ | $(CXX) $^ $(LINK_UI_VST_X11_FLAGS) -o $@ && $(STRIP) $@ | ||||
| carla_bridge_client__vst-x11.o: carla_bridge_client.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit__vst-x11.o: carla_bridge_toolkit.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | |||||
| carla_bridge_toolkit-qt__vst-x11.o: carla_bridge_toolkit-qt.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | |||||
| carla_bridge_ui-vst__vst-x11.o: carla_bridge_ui-vst.cpp | |||||
| %__vst-x11.o: %.cpp | |||||
| $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | $(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| @@ -497,5 +462,5 @@ doxygen: carla_bridge.doxygen | |||||
| clean: | clean: | ||||
| rm -f *.o *.dll *.so *.exe | rm -f *.o *.dll *.so *.exe | ||||
| rm -f carla-bridge-lv2-gtk2 carla-bridge-lv2-gtk3 carla-bridge-lv2-qt4 carla-bridge-lv2-x11 carla-bridge-vst-x11 | |||||
| rm -f carla-bridge-lv2-gtk2 carla-bridge-lv2-gtk3 carla-bridge-lv2-qt4 carla-bridge-lv2-qt5 carla-bridge-lv2-x11 carla-bridge-vst-x11 | |||||
| rm -f carla-bridge-posix32 carla-bridge-posix64 | rm -f carla-bridge-posix32 carla-bridge-posix64 | ||||
| @@ -16,9 +16,10 @@ | |||||
| */ | */ | ||||
| #include "carla_bridge_client.hpp" | #include "carla_bridge_client.hpp" | ||||
| #include "carla_bridge_toolkit.hpp" | |||||
| #if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11) | #if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11) | ||||
| # error Cocoa/HWND/X11 UI uses Qt | |||||
| # error Embed UI uses Qt | |||||
| #endif | #endif | ||||
| #include <gtk/gtk.h> | #include <gtk/gtk.h> | ||||
| @@ -28,14 +29,27 @@ CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| class CarlaToolkitGtk : public CarlaToolkit | |||||
| #if defined(BRIDGE_GTK2) | |||||
| static const char* const appName = "Carla-Gtk2UIs"; | |||||
| #elif defined(BRIDGE_GTK3) | |||||
| static const char* const appName = "Carla-Gtk3UIs"; | |||||
| #else | |||||
| static const char* const appName = "Carla-UIs"; | |||||
| #endif | |||||
| static int gargc = 0; | |||||
| static char** gargv = {}; | |||||
| // ------------------------------------------------------------------------- | |||||
| class CarlaToolkitGtk : public CarlaBridgeToolkit | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaToolkitGtk(const char* const title) | |||||
| : CarlaToolkit(title), | |||||
| settings("Cadence", "Carla-Gtk2UIs") | |||||
| CarlaToolkitGtk(CarlaBridgeClient* const client, const char* const uiTitle) | |||||
| : CarlaBridgeToolkit(client, uiTitle), | |||||
| settings("Cadence", appName) | |||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::CarlaToolkitGtk(%s)", title); | |||||
| qDebug("CarlaToolkitGtk::CarlaToolkitGtk(%p, \"%s\")", client, uiTitle); | |||||
| window = nullptr; | window = nullptr; | ||||
| @@ -51,38 +65,35 @@ public: | |||||
| void init() | void init() | ||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::init()"); | qDebug("CarlaToolkitGtk::init()"); | ||||
| CARLA_ASSERT(! window); | |||||
| static int argc = 0; | |||||
| static char** argv = { nullptr }; | |||||
| gtk_init(&argc, &argv); | |||||
| gtk_init(&gargc, &gargv); | |||||
| } | } | ||||
| void exec(CarlaClient* const client, const bool showGui) | |||||
| void exec(const bool showGui) | |||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::exec(%p)", client); | |||||
| qDebug("CarlaToolkitGtk::exec(%s)", bool2str(showGui)); | |||||
| CARLA_ASSERT(client); | CARLA_ASSERT(client); | ||||
| m_client = client; | |||||
| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | ||||
| gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget()); | gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget()); | ||||
| gtk_window_set_resizable(GTK_WINDOW(window), client->isResizable()); | gtk_window_set_resizable(GTK_WINDOW(window), client->isResizable()); | ||||
| gtk_window_set_title(GTK_WINDOW(window), m_title); | |||||
| gtk_window_set_title(GTK_WINDOW(window), uiTitle); | |||||
| gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY); | gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY); | ||||
| gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | ||||
| if (settings.contains(QString("%1/pos_x").arg(m_title))) | |||||
| if (settings.contains(QString("%1/pos_x").arg(uiTitle))) | |||||
| { | { | ||||
| lastX = settings.value(QString("%1/pos_x").arg(m_title), lastX).toInt(); | |||||
| lastY = settings.value(QString("%1/pos_y").arg(m_title), lastY).toInt(); | |||||
| lastX = settings.value(QString("%1/pos_x").arg(uiTitle), lastX).toInt(); | |||||
| lastY = settings.value(QString("%1/pos_y").arg(uiTitle), lastY).toInt(); | |||||
| gtk_window_move(GTK_WINDOW(window), lastX, lastY); | gtk_window_move(GTK_WINDOW(window), lastX, lastY); | ||||
| if (client->isResizable()) | if (client->isResizable()) | ||||
| { | { | ||||
| lastWidth = settings.value(QString("%1/width").arg(m_title), lastWidth).toInt(); | |||||
| lastHeight = settings.value(QString("%1/height").arg(m_title), lastHeight).toInt(); | |||||
| lastWidth = settings.value(QString("%1/width").arg(uiTitle), lastWidth).toInt(); | |||||
| lastHeight = settings.value(QString("%1/height").arg(uiTitle), lastHeight).toInt(); | |||||
| gtk_window_resize(GTK_WINDOW(window), lastWidth, lastHeight); | gtk_window_resize(GTK_WINDOW(window), lastWidth, lastHeight); | ||||
| } | } | ||||
| } | } | ||||
| @@ -93,7 +104,7 @@ public: | |||||
| if (showGui) | if (showGui) | ||||
| show(); | show(); | ||||
| else | else | ||||
| m_client->sendOscUpdate(); | |||||
| client->sendOscUpdate(); | |||||
| // Main loop | // Main loop | ||||
| gtk_main(); | gtk_main(); | ||||
| @@ -110,8 +121,6 @@ public: | |||||
| window = nullptr; | window = nullptr; | ||||
| } | } | ||||
| m_client = nullptr; | |||||
| } | } | ||||
| void show() | void show() | ||||
| @@ -155,12 +164,11 @@ protected: | |||||
| qDebug("CarlaToolkitGtk::handleDestroy()"); | qDebug("CarlaToolkitGtk::handleDestroy()"); | ||||
| window = nullptr; | window = nullptr; | ||||
| m_client = nullptr; | |||||
| settings.setValue(QString("%1/pos_x").arg(m_title), lastX); | |||||
| settings.setValue(QString("%1/pos_y").arg(m_title), lastY); | |||||
| settings.setValue(QString("%1/width").arg(m_title), lastWidth); | |||||
| settings.setValue(QString("%1/height").arg(m_title), lastHeight); | |||||
| settings.setValue(QString("%1/pos_x").arg(uiTitle), lastX); | |||||
| settings.setValue(QString("%1/pos_y").arg(uiTitle), lastY); | |||||
| settings.setValue(QString("%1/width").arg(uiTitle), lastWidth); | |||||
| settings.setValue(QString("%1/height").arg(uiTitle), lastHeight); | |||||
| settings.sync(); | settings.sync(); | ||||
| } | } | ||||
| @@ -172,7 +180,8 @@ protected: | |||||
| gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | ||||
| } | } | ||||
| return m_client ? m_client->oscIdle() : false; | |||||
| // FIXME | |||||
| return client->isOscControlRegistered() ? client->oscIdle() : false; | |||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| @@ -200,9 +209,9 @@ private: | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| CarlaToolkit* CarlaToolkit::createNew(const char* const title) | |||||
| CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(CarlaBridgeClient* const client, const char* const uiTitle) | |||||
| { | { | ||||
| return new CarlaToolkitGtk(title); | |||||
| return new CarlaToolkitGtk(client, uiTitle); | |||||
| } | } | ||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| @@ -98,11 +98,11 @@ struct Lv2PluginOptions { | |||||
| Lv2PluginOptions lv2Options; | Lv2PluginOptions lv2Options; | ||||
| class CarlaLv2Client : public CarlaClient | |||||
| class CarlaLv2Client : public CarlaBridgeClient | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaLv2Client(CarlaToolkit* const toolkit) | |||||
| : CarlaClient(toolkit) | |||||
| CarlaLv2Client(const char* const uiTitle) | |||||
| : CarlaBridgeClient(uiTitle) | |||||
| { | { | ||||
| handle = nullptr; | handle = nullptr; | ||||
| widget = nullptr; | widget = nullptr; | ||||
| @@ -328,7 +328,7 @@ public: | |||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||
| // init | // init | ||||
| CarlaClient::init(pluginURI, uiURI); | |||||
| CarlaBridgeClient::init(pluginURI, uiURI); | |||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||
| // get plugin from lv2_rdf (lilv) | // get plugin from lv2_rdf (lilv) | ||||
| @@ -357,13 +357,13 @@ public: | |||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||
| // open DLL | // open DLL | ||||
| if (! libOpen(rdf_ui_descriptor->Binary)) | |||||
| if (! uiLibOpen(rdf_ui_descriptor->Binary)) | |||||
| return false; | return false; | ||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||
| // get DLL main entry | // get DLL main entry | ||||
| const LV2UI_DescriptorFunction ui_descFn = (LV2UI_DescriptorFunction)libSymbol("lv2ui_descriptor"); | |||||
| const LV2UI_DescriptorFunction ui_descFn = (LV2UI_DescriptorFunction)uiLibSymbol("lv2ui_descriptor"); | |||||
| if (! ui_descFn) | if (! ui_descFn) | ||||
| return false; | return false; | ||||
| @@ -425,12 +425,12 @@ public: | |||||
| void close() | void close() | ||||
| { | { | ||||
| CarlaClient::close(); | |||||
| CarlaBridgeClient::close(); | |||||
| if (handle && descriptor && descriptor->cleanup) | if (handle && descriptor && descriptor->cleanup) | ||||
| descriptor->cleanup(handle); | descriptor->cleanup(handle); | ||||
| libClose(); | |||||
| uiLibClose(); | |||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| @@ -1077,18 +1077,12 @@ int main(int argc, char* argv[]) | |||||
| if (sampleRateStr) | if (sampleRateStr) | ||||
| sampleRate = atof(sampleRateStr); | sampleRate = atof(sampleRateStr); | ||||
| // Init toolkit | |||||
| CarlaToolkit* const toolkit = CarlaToolkit::createNew(uiTitle); | |||||
| toolkit->init(); | |||||
| // Init LV2-UI | |||||
| CarlaLv2Client client(toolkit); | |||||
| // Init LV2 client | |||||
| CarlaLv2Client client(uiTitle); | |||||
| // Init OSC | // Init OSC | ||||
| if (useOsc && ! client.oscInit(oscUrl)) | if (useOsc && ! client.oscInit(oscUrl)) | ||||
| { | { | ||||
| toolkit->quit(); | |||||
| delete toolkit; | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -1097,7 +1091,7 @@ int main(int argc, char* argv[]) | |||||
| if (client.init(pluginURI, uiURI)) | if (client.init(pluginURI, uiURI)) | ||||
| { | { | ||||
| toolkit->exec(&client, !useOsc); | |||||
| client.toolkitExec(!useOsc); | |||||
| ret = 0; | ret = 0; | ||||
| } | } | ||||
| else | else | ||||
| @@ -1112,13 +1106,9 @@ int main(int argc, char* argv[]) | |||||
| client.oscClose(); | client.oscClose(); | ||||
| } | } | ||||
| // Close LV2-UI | |||||
| // Close LV2 client | |||||
| client.close(); | client.close(); | ||||
| // Close toolkit | |||||
| toolkit->quit(); | |||||
| delete toolkit; | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -48,8 +48,10 @@ public: | |||||
| effect = nullptr; | effect = nullptr; | ||||
| idleTimer = 0; | idleTimer = 0; | ||||
| needIdle = false; | |||||
| // make client valid | // make client valid | ||||
| srand(uiTitle[0]); | |||||
| unique1 = unique2 = rand(); | unique1 = unique2 = rand(); | ||||
| } | } | ||||
| @@ -92,7 +94,9 @@ public: | |||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||
| // initialize plugin | // initialize plugin | ||||
| lastVstPlugin = this; | |||||
| effect = vstFn(hostCallback); | effect = vstFn(hostCallback); | ||||
| lastVstPlugin = nullptr; | |||||
| if (! (effect && effect->magic == kEffectMagic)) | if (! (effect && effect->magic == kEffectMagic)) | ||||
| return false; | return false; | ||||
| @@ -103,7 +107,7 @@ public: | |||||
| #ifdef VESTIGE_HEADER | #ifdef VESTIGE_HEADER | ||||
| effect->ptr1 = this; | effect->ptr1 = this; | ||||
| #else | #else | ||||
| effect->resvd1 = (intptr_t)this; | |||||
| effect->resvd1 = ToVstPtr(this); | |||||
| #endif | #endif | ||||
| int32_t value = 0; | int32_t value = 0; | ||||
| @@ -112,6 +116,8 @@ public: | |||||
| #endif | #endif | ||||
| effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | ||||
| effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f); | |||||
| #if ! VST_FORCE_DEPRECATED | #if ! VST_FORCE_DEPRECATED | ||||
| effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, bufferSize, nullptr, sampleRate); | effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, bufferSize, nullptr, sampleRate); | ||||
| #endif | #endif | ||||
| @@ -217,6 +223,39 @@ public: | |||||
| return kVstProcessLevelUser; | return kVstProcessLevelUser; | ||||
| } | } | ||||
| intptr_t handleAudioMasterGetBlockSize() | |||||
| { | |||||
| return bufferSize; | |||||
| } | |||||
| intptr_t handleAudioMasterGetSampleRate() | |||||
| { | |||||
| return sampleRate; | |||||
| } | |||||
| intptr_t handleAudioMasterGetTime() | |||||
| { | |||||
| memset(&vstTimeInfo, 0, sizeof(VstTimeInfo_R)); | |||||
| vstTimeInfo.sampleRate = sampleRate; | |||||
| // Tempo | |||||
| vstTimeInfo.tempo = 120.0; | |||||
| vstTimeInfo.flags |= kVstTempoValid; | |||||
| // Time Signature | |||||
| vstTimeInfo.timeSigNumerator = 4; | |||||
| vstTimeInfo.timeSigDenominator = 4; | |||||
| vstTimeInfo.flags |= kVstTimeSigValid; | |||||
| return (intptr_t)&vstTimeInfo; | |||||
| } | |||||
| void handleAudioMasterNeedIdle() | |||||
| { | |||||
| needIdle = true; | |||||
| } | |||||
| intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents) | intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents) | ||||
| { | { | ||||
| if (isOscControlRegistered()) | if (isOscControlRegistered()) | ||||
| @@ -310,20 +349,46 @@ public: | |||||
| qDebug("CarlaVstClient::hostCallback(%p, %s, %i, " P_INTPTR ", %p, %f", effect, vstMasterOpcode2str(opcode), index, value, ptr, opt); | qDebug("CarlaVstClient::hostCallback(%p, %s, %i, " P_INTPTR ", %p, %f", effect, vstMasterOpcode2str(opcode), index, value, ptr, opt); | ||||
| #endif | #endif | ||||
| // Check if 'resvd1' points to this client | |||||
| // Check if 'resvd1' points to this client, or register ourselfs if possible | |||||
| CarlaVstClient* self = nullptr; | CarlaVstClient* self = nullptr; | ||||
| #ifdef VESTIGE_HEADER | |||||
| if (effect && effect->ptr1) | |||||
| if (effect) | |||||
| { | { | ||||
| self = (CarlaVstClient*)effect->ptr1; | |||||
| #ifdef VESTIGE_HEADER | |||||
| if (effect && effect->ptr1) | |||||
| { | |||||
| self = (CarlaVstClient*)effect->ptr1; | |||||
| #else | #else | ||||
| if (effect && effect->resvd1) | |||||
| { | |||||
| self = (CarlaVstClient*)effect->resvd1; | |||||
| if (effect && effect->resvd1) | |||||
| { | |||||
| self = FromVstPtr<CarlaVstClient>(effect->resvd1); | |||||
| #endif | |||||
| if (self->unique1 != self->unique2) | |||||
| self = nullptr; | |||||
| } | |||||
| if (self) | |||||
| { | |||||
| if (! self->effect) | |||||
| self->effect = effect; | |||||
| CARLA_ASSERT(self->effect == effect); | |||||
| if (self->effect != effect) | |||||
| { | |||||
| qWarning("CarlaVstClient::hostCallback() - host pointer mismatch: %p != %p", self->effect, effect); | |||||
| self = nullptr; | |||||
| } | |||||
| } | |||||
| else if (lastVstPlugin) | |||||
| { | |||||
| #ifdef VESTIGE_HEADER | |||||
| effect->ptr1 = lastVstPlugin; | |||||
| #else | |||||
| effect->resvd1 = ToVstPtr(lastVstPlugin); | |||||
| #endif | #endif | ||||
| if (self->unique1 != self->unique2) | |||||
| self = nullptr; | |||||
| self = lastVstPlugin; | |||||
| } | |||||
| } | } | ||||
| intptr_t ret = 0; | intptr_t ret = 0; | ||||
| @@ -441,7 +506,9 @@ protected: | |||||
| { | { | ||||
| if (event->timerId() == idleTimer && effect) | if (event->timerId() == idleTimer && effect) | ||||
| { | { | ||||
| effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); | |||||
| if (needIdle) | |||||
| effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); | |||||
| effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); | effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); | ||||
| } | } | ||||
| @@ -450,11 +517,19 @@ protected: | |||||
| private: | private: | ||||
| int unique1; | int unique1; | ||||
| AEffect* effect; | AEffect* effect; | ||||
| VstTimeInfo_R vstTimeInfo; | |||||
| int idleTimer; | int idleTimer; | ||||
| bool needIdle; | |||||
| static CarlaVstClient* lastVstPlugin; | |||||
| int unique2; | int unique2; | ||||
| }; | }; | ||||
| CarlaVstClient* CarlaVstClient::lastVstPlugin = nullptr; | |||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||||
| @@ -27,7 +27,8 @@ HEADERS = \ | |||||
| ../../carla-utils/carla_lv2_utils.hpp | ../../carla-utils/carla_lv2_utils.hpp | ||||
| INCLUDEPATH = .. \ | INCLUDEPATH = .. \ | ||||
| ../../carla-includes | |||||
| ../../carla-includes \ | |||||
| ../../carla-utils | |||||
| LIBS = \ | LIBS = \ | ||||
| ../../carla-lilv/carla_lilv.a \ | ../../carla-lilv/carla_lilv.a \ | ||||
| @@ -454,16 +454,16 @@ public: | |||||
| void idleGui() | void idleGui() | ||||
| { | { | ||||
| #ifdef VESTIGE_HEADER | #ifdef VESTIGE_HEADER | ||||
| if (effect && effect->ptr1) | |||||
| if (effect /*&& effect->ptr1*/) | |||||
| #else | #else | ||||
| if (effect && effect->resvd1) | |||||
| if (effect /*&& effect->resvd1*/) | |||||
| #endif | #endif | ||||
| { | { | ||||
| if (gui.type != GUI_EXTERNAL_OSC) | |||||
| effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); | |||||
| if (needIdle) | if (needIdle) | ||||
| effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); | effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); | ||||
| if (gui.type != GUI_EXTERNAL_OSC) | |||||
| effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); | |||||
| } | } | ||||
| CarlaPlugin::idleGui(); | CarlaPlugin::idleGui(); | ||||
| @@ -2268,7 +2268,7 @@ public: | |||||
| #ifdef VESTIGE_HEADER | #ifdef VESTIGE_HEADER | ||||
| effect->ptr1 = this; | effect->ptr1 = this; | ||||
| #else | #else | ||||
| effect->resvd1 = ToVstPtr(this); | |||||
| effect->resvd1 = getAddressFromPointer(this); | |||||
| #endif | #endif | ||||
| effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | ||||