diff --git a/c++/carla-backend/carla_backend.hpp b/c++/carla-backend/carla_backend.hpp index c910829..a864da3 100644 --- a/c++/carla-backend/carla_backend.hpp +++ b/c++/carla-backend/carla_backend.hpp @@ -52,7 +52,9 @@ const unsigned int MAX_PARAMETERS = 200; //!< Default value for the maximum numb * \see CarlaPlugin::hints() * @{ */ +#ifndef BUILD_BRIDGE const unsigned int PLUGIN_IS_BRIDGE = 0x001; //!< Plugin is a bridge (ie, BridgePlugin). This hint is required because "bridge" itself is not a plugin type. +#endif const unsigned int PLUGIN_IS_SYNTH = 0x002; //!< Plugin is a synthesizer (produces sound). const unsigned int PLUGIN_HAS_GUI = 0x004; //!< Plugin has its own custom GUI. const unsigned int PLUGIN_USES_CHUNKS = 0x008; //!< Plugin uses chunks to save internal data.\see CarlaPlugin::chunkData() diff --git a/c++/carla-bridge/Makefile b/c++/carla-bridge/Makefile index 5dc18e9..d6278bc 100644 --- a/c++/carla-bridge/Makefile +++ b/c++/carla-bridge/Makefile @@ -405,6 +405,9 @@ doxygen: carla_bridge.doxygen clean: rm -f *.o *.dll *.so *.exe + rm -f $(OBJS_POSIX32) + rm -f $(OBJS_POSIX64) + rm -f $(OBJS_WIN32) + rm -f $(OBJS_WIN64) 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 $(OBJS_POSIX32) $(OBJS_POSIX64) $(OBJS_WIN32) $(OBJS_WIN64) diff --git a/c++/carla-bridge/carla_bridge_client.cpp b/c++/carla-bridge/carla_bridge_client.cpp index 524fd0b..5131689 100644 --- a/c++/carla-bridge/carla_bridge_client.cpp +++ b/c++/carla-bridge/carla_bridge_client.cpp @@ -180,7 +180,7 @@ void CarlaBridgeClient::toolkitHide() m_toolkit->hide(); } -void CarlaBridgeClient::toolkitResize(int width, int height) +void CarlaBridgeClient::toolkitResize(const int width, const int height) { qDebug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height); @@ -282,12 +282,12 @@ void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const c // --------------------------------------------------------------------- -#ifdef BUILD_BRIDGE_UI void* CarlaBridgeClient::getContainerId() { return m_toolkit->getContainerId(); } +#ifdef BUILD_BRIDGE_UI bool CarlaBridgeClient::uiLibOpen(const char* const filename) { CARLA_ASSERT(! m_uiLib); diff --git a/c++/carla-bridge/carla_bridge_client.hpp b/c++/carla-bridge/carla_bridge_client.hpp index 03f5083..19fcc3f 100644 --- a/c++/carla-bridge/carla_bridge_client.hpp +++ b/c++/carla-bridge/carla_bridge_client.hpp @@ -99,7 +99,7 @@ public: void toolkitShow(); void toolkitHide(); - void toolkitResize(int width, int height); + void toolkitResize(const int width, const int height); void toolkitExec(const bool showGui); void toolkitQuit(); @@ -120,8 +120,9 @@ protected: // --------------------------------------------------------------------- -#ifdef BUILD_BRIDGE_UI void* getContainerId(); + +#ifdef BUILD_BRIDGE_UI bool uiLibOpen(const char* const filename); bool uiLibClose(); void* uiLibSymbol(const char* const symbol); diff --git a/c++/carla-bridge/carla_bridge_plugin.cpp b/c++/carla-bridge/carla_bridge_plugin.cpp index ec4d1cb..06880c6 100644 --- a/c++/carla-bridge/carla_bridge_plugin.cpp +++ b/c++/carla-bridge/carla_bridge_plugin.cpp @@ -21,7 +21,6 @@ #include "carla_bridge_toolkit.hpp" #include "carla_plugin.hpp" -//#include #include #include #include @@ -110,8 +109,9 @@ public: app = nullptr; gui = nullptr; + m_hasUI = false; m_uiQuit = false; - m_uiShow = true; + m_uiShow = false; init(); } @@ -119,8 +119,23 @@ public: ~CarlaBridgeToolkitPlugin() { qDebug("CarlaBridgeToolkitPlugin::~CarlaBridgeToolkitPlugin()"); - CARLA_ASSERT(! app); - CARLA_ASSERT(! gui); + + if (gui) + { + gui->close(); + + delete gui; + gui = nullptr; + } + + if (app) + { + if (! app->closingDown()) + app->quit(); + + delete app; + app = nullptr; + } } void init() @@ -143,7 +158,7 @@ public: if (showGui) { - if (m_uiShow) + if (m_hasUI) show(); } else @@ -164,41 +179,12 @@ public: qDebug("CarlaBridgeToolkitPlugin::quit()"); CARLA_ASSERT(app); - if (gui) - { - gui->close(); - - delete gui; - gui = nullptr; - } - - if (app) - { - if (! app->closingDown()) - app->quit(); - - delete app; - app = nullptr; - } + if (app && ! app->closingDown()) + app->quit(); } - void show() - { - qDebug("CarlaBridgeToolkitPlugin::show()"); - CARLA_ASSERT(gui); - - if (gui && m_uiShow) - gui->setVisible(true); - } - - void hide() - { - qDebug("CarlaBridgeToolkitPlugin::hide()"); - CARLA_ASSERT(gui); - - if (gui && m_uiShow) - gui->setVisible(false); - } + void show(); + void hide(); void resize(const int width, const int height) { @@ -229,9 +215,10 @@ public: return nullptr; } - void hasUI(const bool yesNo) + void setHasUI(const bool hasUI, const bool showUI) { - m_uiShow = yesNo; + m_hasUI = hasUI; + m_uiShow = showUI; } protected: @@ -241,6 +228,7 @@ protected: void guiClosedCallback(); private: + bool m_hasUI; bool m_uiQuit; bool m_uiShow; }; @@ -294,14 +282,25 @@ public: plugin->getGuiInfo(&guiType, &guiResizable); CarlaBridgeToolkitPlugin* const plugToolkit = (CarlaBridgeToolkitPlugin*)m_toolkit; - plugToolkit->hasUI(guiType != CarlaBackend::GUI_NONE); + + qWarning("----------------------------------------------------- trying..., %s", CarlaBackend::GuiType2Str(guiType)); if (guiType == CarlaBackend::GUI_INTERNAL_QT4 || guiType == CarlaBackend::GUI_INTERNAL_COCOA || guiType == CarlaBackend::GUI_INTERNAL_HWND || guiType == CarlaBackend::GUI_INTERNAL_X11) + { plugin->setGuiContainer(plugToolkit->getContainer()); + plugToolkit->setHasUI(true, true); + } + else + { + plugToolkit->setHasUI(guiType != CarlaBackend::GUI_NONE, false); + } } void quit() { + engine = nullptr; + plugin = nullptr; + if (msgTimerGUI != 0) { killTimer(msgTimerGUI); @@ -345,6 +344,14 @@ public: engine->osc_send_bridge_configure(CarlaBackend::CARLA_BRIDGE_MSG_HIDE_GUI, ""); } + void showPluginGui(const bool yesNo) + { + CARLA_ASSERT(plugin); + + if (plugin) + plugin->showGui(yesNo); + } + // --------------------------------------------------------------------- static void callback(void* const ptr, CarlaBackend::CallbackType const action, const unsigned short, const int value1, const int value2, const double value3, const char* const valueStr) @@ -570,8 +577,37 @@ protected: // ------------------------------------------------------------------------- +void CarlaBridgeToolkitPlugin::show() +{ + qDebug("----------------------------------------------------------------------------------------------------------"); + qDebug("CarlaBridgeToolkitPlugin::show()"); + CARLA_ASSERT(gui); + + CarlaPluginClient* const plugClient = (CarlaPluginClient*)client; + + plugClient->showPluginGui(true); + + if (gui && m_uiShow) + gui->setVisible(true); +} + +void CarlaBridgeToolkitPlugin::hide() +{ + qDebug("CarlaBridgeToolkitPlugin::hide()"); + CARLA_ASSERT(gui); + + CarlaPluginClient* const plugClient = (CarlaPluginClient*)client; + + if (gui && m_uiShow) + gui->setVisible(false); + + plugClient->showPluginGui(false); +} + void CarlaBridgeToolkitPlugin::guiClosedCallback() { + qDebug("CarlaBridgeToolkitPlugin::guiClosedCallback()"); + CarlaPluginClient* const plugClient = (CarlaPluginClient*)client; if (m_uiQuit) @@ -692,7 +728,13 @@ int main(int argc, char* argv[]) engine->setCallback(client.callback, &client); client.setEngine(engine); - if (! engine->init("")) + // Init engine + CarlaString engName(name ? name : label); + engName += " (master)"; + engName.toBasic(); + engName.truncate(engine->maxClientNameSize()); + + if (! engine->init(engName)) { if (const char* const lastError = engine->getLastError()) { diff --git a/c++/carla-bridge/carla_bridge_toolkit-qt.cpp b/c++/carla-bridge/carla_bridge_toolkit-qt.cpp index e7241ed..762326f 100644 --- a/c++/carla-bridge/carla_bridge_toolkit-qt.cpp +++ b/c++/carla-bridge/carla_bridge_toolkit-qt.cpp @@ -97,6 +97,7 @@ public: { qDebug("CarlaBridgeToolkitQt::~CarlaBridgeToolkitQt()"); CARLA_ASSERT(! app); + CARLA_ASSERT(! window); CARLA_ASSERT(! msgTimer); } diff --git a/c++/carla-engine/jack.cpp b/c++/carla-engine/jack.cpp index 1780721..2c56b70 100644 --- a/c++/carla-engine/jack.cpp +++ b/c++/carla-engine/jack.cpp @@ -568,6 +568,21 @@ public: return false; #else + // open temp client to get initial buffer-size and sample-rate values + if (bufferSize == 0 || sampleRate == 0.0) + { + m_client = jackbridge_client_open(clientName, JackNullOption, nullptr); + + if (m_client) + { + bufferSize = jackbridge_get_buffer_size(m_client); + sampleRate = jackbridge_get_sample_rate(m_client); + + jackbridge_client_close(m_client); + m_client = nullptr; + } + } + name = clientName; name.toBasic(); diff --git a/c++/carla-plugin/carla_plugin.cpp b/c++/carla-plugin/carla_plugin.cpp index 3d72ed0..53d5d54 100644 --- a/c++/carla-plugin/carla_plugin.cpp +++ b/c++/carla-plugin/carla_plugin.cpp @@ -1063,8 +1063,10 @@ void CarlaPlugin::updateOscData(const lo_address source, const char* const url) free((void*)host); free((void*)port); +#ifndef BUILD_BRIDGE if (m_hints & PLUGIN_IS_BRIDGE) return; +#endif osc_send_sample_rate(&osc.data, x_engine->getSampleRate()); @@ -1581,6 +1583,7 @@ CarlaPluginGUI::~CarlaPluginGUI() qDebug("CarlaPluginGUI::~CarlaPluginGUI()"); CARLA_ASSERT(m_container); + // FIXME, automatically deleted by parent ? delete m_container; } diff --git a/c++/carla-plugin/lv2.cpp b/c++/carla-plugin/lv2.cpp index 0159d0f..4aaef41 100644 --- a/c++/carla-plugin/lv2.cpp +++ b/c++/carla-plugin/lv2.cpp @@ -973,6 +973,8 @@ public: void showGui(const bool yesNo) { + qDebug("Lv2Plugin::showGui(%s)", bool2str(yesNo)); + switch(gui.type) { case GUI_NONE: @@ -4241,7 +4243,7 @@ public: break; case LV2_UI_GTK2: -#ifdef WANT_SUIL +#if defined(WANT_SUIL) || defined(BUILD_BRIDGE) if (isUiBridgeable(i) && preferUiBridges) eGtk2 = i; #else @@ -4293,8 +4295,10 @@ public: else if (iSuil >= 0) iFinal = iSuil; - const bool isBridged = false; //(iFinal == eQt4 || iFinal == eCocoa || iFinal == eHWND || iFinal == eX11 || iFinal == eGtk2 || iFinal == eGtk3); -#ifdef WANT_SUIL +#ifndef WANT_SUIL + const bool isBridged = (iFinal == eQt4 || iFinal == eCocoa || iFinal == eHWND || iFinal == eX11 || iFinal == eGtk2 || iFinal == eGtk3); +#else + const bool isBridged = false; const bool isSuil = (iFinal == iSuil && !isBridged); #endif diff --git a/c++/carla-plugin/vst.cpp b/c++/carla-plugin/vst.cpp index 02ab857..5caca2d 100644 --- a/c++/carla-plugin/vst.cpp +++ b/c++/carla-plugin/vst.cpp @@ -1549,12 +1549,16 @@ public: intptr_t handleAudioMasterGetBlockSize() { - return x_engine->getBufferSize(); + const uint32_t bufferSize = x_engine->getBufferSize(); + effect->dispatcher(effect, effSetBlockSize, 0, bufferSize, nullptr, 0.0f); + return bufferSize; } intptr_t handleAudioMasterGetSampleRate() { - return x_engine->getSampleRate(); + const double sampleRate = x_engine->getSampleRate(); + effect->dispatcher(effect, effSetSampleRate, 0, 0, nullptr, sampleRate); + return sampleRate; } intptr_t handleAudioMasterGetTime()