| @@ -17,7 +17,7 @@ ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
| BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | |||
| endif | |||
| ifeq ($(HAVE_QT5), true) | |||
| ifeq ($(HAVE_QT5),true) | |||
| QT_UI_FLAGS = $(shell pkg-config --cflags QtWidgets) | |||
| QT_UI_LIBS = $(shell pkg-config --libs QtWidgets) | |||
| else | |||
| @@ -28,23 +28,22 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # 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 += $(shell pkg-config --cflags jack) $(QT_UI_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 | |||
| @@ -82,7 +81,7 @@ LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||
| # -------------------------------------------------------------- | |||
| 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) | |||
| ui_lv2-gtk2: carla-bridge-lv2-gtk2 | |||
| @@ -96,9 +95,17 @@ else | |||
| ui_lv2-gtk3: | |||
| 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_vst-hwnd: carla-bridge-vst-hwnd.exe | |||
| ui_vst-x11: carla-bridge-vst-x11 | |||
| @@ -114,7 +121,7 @@ win32: carla-bridge-win32.exe | |||
| win64: carla-bridge-win64.exe | |||
| # -------------------------------------------------------------- | |||
| # common | |||
| # UI common | |||
| carla_bridge_osc__lv2.o: carla_bridge_osc.cpp | |||
| $(CXX) $< $(BUILD_UI_LV2_FLAGS) -c -o $@ | |||
| @@ -125,139 +132,97 @@ carla_bridge_osc__vst.o: carla_bridge_osc.cpp | |||
| # -------------------------------------------------------------- | |||
| # 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-bridge-lv2-gtk2: $(OBJS_UI_LV2_GTK2) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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-bridge-lv2-gtk3: $(OBJS_UI_LV2_GTK3) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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-bridge-lv2-qt4: $(OBJS_UI_LV2_QT4) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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-bridge-lv2-qt5: $(OBJS_UI_LV2_QT5) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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-bridge-lv2-x11: $(OBJS_UI_LV2_X11) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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_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) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| # 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_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) | |||
| $(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 $@ | |||
| # -------------------------------------------------------------- | |||
| @@ -497,5 +462,5 @@ doxygen: carla_bridge.doxygen | |||
| clean: | |||
| 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 | |||
| @@ -16,9 +16,10 @@ | |||
| */ | |||
| #include "carla_bridge_client.hpp" | |||
| #include "carla_bridge_toolkit.hpp" | |||
| #if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11) | |||
| # error Cocoa/HWND/X11 UI uses Qt | |||
| # error Embed UI uses Qt | |||
| #endif | |||
| #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: | |||
| 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; | |||
| @@ -51,38 +65,35 @@ public: | |||
| void 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); | |||
| m_client = client; | |||
| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |||
| gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget()); | |||
| 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_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); | |||
| 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); | |||
| } | |||
| } | |||
| @@ -93,7 +104,7 @@ public: | |||
| if (showGui) | |||
| show(); | |||
| else | |||
| m_client->sendOscUpdate(); | |||
| client->sendOscUpdate(); | |||
| // Main loop | |||
| gtk_main(); | |||
| @@ -110,8 +121,6 @@ public: | |||
| window = nullptr; | |||
| } | |||
| m_client = nullptr; | |||
| } | |||
| void show() | |||
| @@ -155,12 +164,11 @@ protected: | |||
| qDebug("CarlaToolkitGtk::handleDestroy()"); | |||
| 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(); | |||
| } | |||
| @@ -172,7 +180,8 @@ protected: | |||
| 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 | |||
| @@ -98,11 +98,11 @@ struct Lv2PluginOptions { | |||
| Lv2PluginOptions lv2Options; | |||
| class CarlaLv2Client : public CarlaClient | |||
| class CarlaLv2Client : public CarlaBridgeClient | |||
| { | |||
| public: | |||
| CarlaLv2Client(CarlaToolkit* const toolkit) | |||
| : CarlaClient(toolkit) | |||
| CarlaLv2Client(const char* const uiTitle) | |||
| : CarlaBridgeClient(uiTitle) | |||
| { | |||
| handle = nullptr; | |||
| widget = nullptr; | |||
| @@ -328,7 +328,7 @@ public: | |||
| // ----------------------------------------------------------------- | |||
| // init | |||
| CarlaClient::init(pluginURI, uiURI); | |||
| CarlaBridgeClient::init(pluginURI, uiURI); | |||
| // ----------------------------------------------------------------- | |||
| // get plugin from lv2_rdf (lilv) | |||
| @@ -357,13 +357,13 @@ public: | |||
| // ----------------------------------------------------------------- | |||
| // open DLL | |||
| if (! libOpen(rdf_ui_descriptor->Binary)) | |||
| if (! uiLibOpen(rdf_ui_descriptor->Binary)) | |||
| return false; | |||
| // ----------------------------------------------------------------- | |||
| // 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) | |||
| return false; | |||
| @@ -425,12 +425,12 @@ public: | |||
| void close() | |||
| { | |||
| CarlaClient::close(); | |||
| CarlaBridgeClient::close(); | |||
| if (handle && descriptor && descriptor->cleanup) | |||
| descriptor->cleanup(handle); | |||
| libClose(); | |||
| uiLibClose(); | |||
| } | |||
| // --------------------------------------------------------------------- | |||
| @@ -1077,18 +1077,12 @@ int main(int argc, char* argv[]) | |||
| if (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 | |||
| if (useOsc && ! client.oscInit(oscUrl)) | |||
| { | |||
| toolkit->quit(); | |||
| delete toolkit; | |||
| return -1; | |||
| } | |||
| @@ -1097,7 +1091,7 @@ int main(int argc, char* argv[]) | |||
| if (client.init(pluginURI, uiURI)) | |||
| { | |||
| toolkit->exec(&client, !useOsc); | |||
| client.toolkitExec(!useOsc); | |||
| ret = 0; | |||
| } | |||
| else | |||
| @@ -1112,13 +1106,9 @@ int main(int argc, char* argv[]) | |||
| client.oscClose(); | |||
| } | |||
| // Close LV2-UI | |||
| // Close LV2 client | |||
| client.close(); | |||
| // Close toolkit | |||
| toolkit->quit(); | |||
| delete toolkit; | |||
| return ret; | |||
| } | |||
| @@ -48,8 +48,10 @@ public: | |||
| effect = nullptr; | |||
| idleTimer = 0; | |||
| needIdle = false; | |||
| // make client valid | |||
| srand(uiTitle[0]); | |||
| unique1 = unique2 = rand(); | |||
| } | |||
| @@ -92,7 +94,9 @@ public: | |||
| // ----------------------------------------------------------------- | |||
| // initialize plugin | |||
| lastVstPlugin = this; | |||
| effect = vstFn(hostCallback); | |||
| lastVstPlugin = nullptr; | |||
| if (! (effect && effect->magic == kEffectMagic)) | |||
| return false; | |||
| @@ -103,7 +107,7 @@ public: | |||
| #ifdef VESTIGE_HEADER | |||
| effect->ptr1 = this; | |||
| #else | |||
| effect->resvd1 = (intptr_t)this; | |||
| effect->resvd1 = ToVstPtr(this); | |||
| #endif | |||
| int32_t value = 0; | |||
| @@ -112,6 +116,8 @@ public: | |||
| #endif | |||
| effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | |||
| effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f); | |||
| #if ! VST_FORCE_DEPRECATED | |||
| effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, bufferSize, nullptr, sampleRate); | |||
| #endif | |||
| @@ -217,6 +223,39 @@ public: | |||
| 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) | |||
| { | |||
| if (isOscControlRegistered()) | |||
| @@ -310,20 +349,46 @@ public: | |||
| qDebug("CarlaVstClient::hostCallback(%p, %s, %i, " P_INTPTR ", %p, %f", effect, vstMasterOpcode2str(opcode), index, value, ptr, opt); | |||
| #endif | |||
| // Check if 'resvd1' points to this client | |||
| // Check if 'resvd1' points to this client, or register ourselfs if possible | |||
| 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 | |||
| 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 | |||
| if (self->unique1 != self->unique2) | |||
| self = nullptr; | |||
| self = lastVstPlugin; | |||
| } | |||
| } | |||
| intptr_t ret = 0; | |||
| @@ -441,7 +506,9 @@ protected: | |||
| { | |||
| 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); | |||
| } | |||
| @@ -450,11 +517,19 @@ protected: | |||
| private: | |||
| int unique1; | |||
| AEffect* effect; | |||
| VstTimeInfo_R vstTimeInfo; | |||
| int idleTimer; | |||
| bool needIdle; | |||
| static CarlaVstClient* lastVstPlugin; | |||
| int unique2; | |||
| }; | |||
| CarlaVstClient* CarlaVstClient::lastVstPlugin = nullptr; | |||
| CARLA_BRIDGE_END_NAMESPACE | |||
| int main(int argc, char* argv[]) | |||
| @@ -27,7 +27,8 @@ HEADERS = \ | |||
| ../../carla-utils/carla_lv2_utils.hpp | |||
| INCLUDEPATH = .. \ | |||
| ../../carla-includes | |||
| ../../carla-includes \ | |||
| ../../carla-utils | |||
| LIBS = \ | |||
| ../../carla-lilv/carla_lilv.a \ | |||
| @@ -454,16 +454,16 @@ public: | |||
| void idleGui() | |||
| { | |||
| #ifdef VESTIGE_HEADER | |||
| if (effect && effect->ptr1) | |||
| if (effect /*&& effect->ptr1*/) | |||
| #else | |||
| if (effect && effect->resvd1) | |||
| if (effect /*&& effect->resvd1*/) | |||
| #endif | |||
| { | |||
| if (gui.type != GUI_EXTERNAL_OSC) | |||
| effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); | |||
| if (needIdle) | |||
| 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(); | |||
| @@ -2268,7 +2268,7 @@ public: | |||
| #ifdef VESTIGE_HEADER | |||
| effect->ptr1 = this; | |||
| #else | |||
| effect->resvd1 = ToVstPtr(this); | |||
| effect->resvd1 = getAddressFromPointer(this); | |||
| #endif | |||
| effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); | |||