From 6a5bc2efda7657dd9a2f59591a6f47ec598be2bd Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 21 Apr 2014 00:54:18 +0100 Subject: [PATCH] LV2 UI Bridge fixes --- source/backend/CarlaPlugin.hpp | 8 +++++++- source/backend/engine/CarlaEngine.cpp | 1 - source/backend/plugin/CarlaPlugin.cpp | 9 +++++++++ source/backend/plugin/Lv2Plugin.cpp | 6 +++--- source/bridges/CarlaBridgeClient.cpp | 5 +++++ source/bridges/CarlaBridgeClient.hpp | 1 + source/bridges/CarlaBridgeOsc.cpp | 8 ++++++++ source/bridges/CarlaBridgeOsc.hpp | 1 + source/bridges/CarlaBridgeUI-LV2.cpp | 18 ++++++++---------- 9 files changed, 42 insertions(+), 15 deletions(-) diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 87d08b616..df66870ef 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -719,7 +719,13 @@ public: * Update the plugin's internal OSC data according to \a source and \a url.\n * This is used for OSC-GUI bridges. */ - virtual void updateOscData(const lo_address& source, const char* const url); + void updateOscData(const lo_address& source, const char* const url); + + /*! + * Update the plugin's extra OSC data, called from the start of updateOscData().\n + * The default implementation does nothing. + */ + virtual bool updateOscDataExtra(); /*! * Free the plugin's internal OSC memory data. diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index bb1803992..5f71e4c9e 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -2175,7 +2175,6 @@ bool CarlaEngine::isOscControlRegistered() const noexcept } #endif - void CarlaEngine::idleOsc() const noexcept { try { diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 723981037..7dd6c8ee4 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -1723,6 +1723,10 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) } #endif + // send possible extra data first + if (updateOscDataExtra()) + pData->engine->idleOsc(); + osc_send_sample_rate(pData->osc.data, static_cast(pData->engine->getSampleRate())); for (LinkedList::Itenerator it = pData->custom.begin(); it.valid(); it.next()) @@ -1759,6 +1763,11 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) carla_stdout("CarlaPlugin::updateOscData() - done"); } +bool CarlaPlugin::updateOscDataExtra() override +{ + return false; +} + // void CarlaPlugin::freeOscData() // { // pData->osc.data.free(); diff --git a/source/backend/plugin/Lv2Plugin.cpp b/source/backend/plugin/Lv2Plugin.cpp index b3ed587b8..1b01834e9 100644 --- a/source/backend/plugin/Lv2Plugin.cpp +++ b/source/backend/plugin/Lv2Plugin.cpp @@ -3505,14 +3505,14 @@ public: // ------------------------------------------------------------------- // OSC stuff - void updateOscData(const lo_address& source, const char* const url) override + bool updateOscDataExtra() override { - CarlaPlugin::updateOscData(source, url); - for (size_t i=CARLA_URI_MAP_ID_COUNT, count=fCustomURIDs.count(); i < count; ++i) osc_send_lv2_urid_map(pData->osc.data, static_cast(i), fCustomURIDs.getAt(i)); osc_send_lv2_urid_map(pData->osc.data, CARLA_URI_MAP_ID_NULL, "Complete"); + + return true; } // ------------------------------------------------------------------- diff --git a/source/bridges/CarlaBridgeClient.cpp b/source/bridges/CarlaBridgeClient.cpp index c8d742270..265924998 100644 --- a/source/bridges/CarlaBridgeClient.cpp +++ b/source/bridges/CarlaBridgeClient.cpp @@ -138,6 +138,11 @@ bool CarlaBridgeClient::oscIdle() const #endif } +void CarlaBridgeClient::oscWait() const +{ + fOsc.idleWait(); +} + void CarlaBridgeClient::oscClose() { carla_debug("CarlaBridgeClient::oscClose()"); diff --git a/source/bridges/CarlaBridgeClient.hpp b/source/bridges/CarlaBridgeClient.hpp index 6ca2a7ae0..1c331c6a6 100644 --- a/source/bridges/CarlaBridgeClient.hpp +++ b/source/bridges/CarlaBridgeClient.hpp @@ -75,6 +75,7 @@ public: void oscInit(const char* const url); bool oscIdle() const; + void oscWait() const; void oscClose(); bool isOscControlRegistered() const noexcept; diff --git a/source/bridges/CarlaBridgeOsc.cpp b/source/bridges/CarlaBridgeOsc.cpp index 46041c830..7a9c4b4dd 100644 --- a/source/bridges/CarlaBridgeOsc.cpp +++ b/source/bridges/CarlaBridgeOsc.cpp @@ -96,6 +96,14 @@ void CarlaBridgeOsc::idle() const for (; lo_server_recv_noblock(fServer, 0) != 0;) {} } + +void CarlaBridgeOsc::idleWait() const +{ + CARLA_SAFE_ASSERT_RETURN(fServer != nullptr,); + + lo_server_recv(fServer); +} + void CarlaBridgeOsc::close() { CARLA_ASSERT(fControlData.source == nullptr); // must never be used diff --git a/source/bridges/CarlaBridgeOsc.hpp b/source/bridges/CarlaBridgeOsc.hpp index 63de8a896..c295e1300 100644 --- a/source/bridges/CarlaBridgeOsc.hpp +++ b/source/bridges/CarlaBridgeOsc.hpp @@ -61,6 +61,7 @@ public: void init(const char* const url); void idle() const; + void idleWait() const; void close(); // ------------------------------------------------------------------- diff --git a/source/bridges/CarlaBridgeUI-LV2.cpp b/source/bridges/CarlaBridgeUI-LV2.cpp index 4846b8f9e..1cc954faf 100644 --- a/source/bridges/CarlaBridgeUI-LV2.cpp +++ b/source/bridges/CarlaBridgeUI-LV2.cpp @@ -563,15 +563,12 @@ public: { sendOscUpdate(); - if (fIsReady) - return; - - for (int i=0; i < 2000; ++i) + for (;;) { + oscWait(); + if (fIsReady) return; - oscIdle(); - carla_msleep(10); } } @@ -601,8 +598,8 @@ public: fCustomURIDs.append(carla_strdup(uri)); } - //if (isOscControlRegistered()) - sendOscLv2UridMap(urid, uri); + if (isOscControlRegistered()) + sendOscLv2UridMap(urid, uri); return urid; } @@ -668,7 +665,7 @@ public: const float value(*(const float*)buffer); - //if (isOscControlRegistered()) + if (isOscControlRegistered()) sendOscControl(portIndex, value); } else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM || CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT) @@ -679,7 +676,7 @@ public: if (bufferSize == 0 || buffer == nullptr) return; - //if (isOscControlRegistered()) + if (isOscControlRegistered()) sendOscLv2AtomTransfer(portIndex, QByteArray((const char*)buffer, bufferSize).toBase64().constData()); } else @@ -728,6 +725,7 @@ public: { if (i != urid) continue; + CARLA_SAFE_ASSERT(it.getValue() == nullptr); it.setValue(carla_strdup(uri)); break; }