diff --git a/c++/carla-bridge/Makefile b/c++/carla-bridge/Makefile index 2299cf7..15cc91d 100644 --- a/c++/carla-bridge/Makefile +++ b/c++/carla-bridge/Makefile @@ -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 diff --git a/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp b/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp index 2562d45..5e9712c 100644 --- a/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp +++ b/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp @@ -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 @@ -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 diff --git a/c++/carla-bridge/carla_bridge_ui-lv2.cpp b/c++/carla-bridge/carla_bridge_ui-lv2.cpp index 79cee91..7028f9e 100644 --- a/c++/carla-bridge/carla_bridge_ui-lv2.cpp +++ b/c++/carla-bridge/carla_bridge_ui-lv2.cpp @@ -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; } diff --git a/c++/carla-bridge/carla_bridge_ui-vst.cpp b/c++/carla-bridge/carla_bridge_ui-vst.cpp index eaa51a6..40a5ea3 100644 --- a/c++/carla-bridge/carla_bridge_ui-vst.cpp +++ b/c++/carla-bridge/carla_bridge_ui-vst.cpp @@ -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(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[]) diff --git a/c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro b/c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro index 949575c..f332305 100644 --- a/c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro +++ b/c++/carla-bridge/qtcreator/carla-bridge-lv2-gtk2.pro @@ -27,7 +27,8 @@ HEADERS = \ ../../carla-utils/carla_lv2_utils.hpp INCLUDEPATH = .. \ - ../../carla-includes + ../../carla-includes \ + ../../carla-utils LIBS = \ ../../carla-lilv/carla_lilv.a \ diff --git a/c++/carla-plugin/vst.cpp b/c++/carla-plugin/vst.cpp index 0c4569f..02ab857 100644 --- a/c++/carla-plugin/vst.cpp +++ b/c++/carla-plugin/vst.cpp @@ -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);