From c2b14654b28237553bb4198376004517c738f0cc Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 19 Sep 2012 19:08:54 +0100 Subject: [PATCH] Carla: Send error message on bridge failure, don't wait for timeout --- c++/carla-backend/carla_bridge.cpp | 29 +++++++++++++++++++ c++/carla-backend/carla_osc.cpp | 2 ++ c++/carla-backend/carla_plugin.h | 3 +- c++/carla-backend/qtcreator/carla-backend.pro | 2 +- c++/carla-bridge/carla_bridge_client.h | 6 ++++ c++/carla-bridge/carla_bridge_osc.h | 9 ++++++ c++/carla-bridge/carla_bridge_plugin.cpp | 12 +++++--- c++/carla-includes/carla_osc_includes.h | 16 ++++++++++ 8 files changed, 73 insertions(+), 6 deletions(-) diff --git a/c++/carla-backend/carla_bridge.cpp b/c++/carla-backend/carla_bridge.cpp index d9815e3..7fd3724 100644 --- a/c++/carla-backend/carla_bridge.cpp +++ b/c++/carla-backend/carla_bridge.cpp @@ -69,6 +69,7 @@ public: m_hints = PLUGIN_IS_BRIDGE; m_initiated = false; + m_initError = false; m_saved = false; info.aIns = 0; @@ -712,10 +713,28 @@ public: } case PluginBridgeUpdateNow: + { m_initiated = true; break; } + case PluginBridgeError: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(1, "s"); + + const char* const error = (const char*)&argv[0]->s; + + Q_ASSERT(error); + + m_initiated = true; + m_initError = true; + + setLastError(error); + + break; + } + } + return 0; } @@ -927,6 +946,15 @@ public: setLastError("Timeout while waiting for a response from plugin-bridge"); return false; } + else if (m_initError) + { + // unregister so it gets handled properly + x_engine->__bridgePluginRegister(m_id, nullptr); + + osc.thread->quit(); + // last error was set before + return false; + } return true; } @@ -935,6 +963,7 @@ private: const BinaryType m_binary; bool m_initiated; + bool m_initError; bool m_saved; struct { diff --git a/c++/carla-backend/carla_osc.cpp b/c++/carla-backend/carla_osc.cpp index 5b1f173..19fdbf1 100644 --- a/c++/carla-backend/carla_osc.cpp +++ b/c++/carla-backend/carla_osc.cpp @@ -242,6 +242,8 @@ int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg return plugin->setOscBridgeInfo(PluginBridgeSetChunkData, argc, argv, types); if (strcmp(method, "/bridge_update") == 0) return plugin->setOscBridgeInfo(PluginBridgeUpdateNow, argc, argv, types); + if (strcmp(method, "/bridge_error") == 0) + return plugin->setOscBridgeInfo(PluginBridgeError, argc, argv, types); } qWarning("CarlaOsc::handleMessage() - unsupported OSC method '%s'", method); diff --git a/c++/carla-backend/carla_plugin.h b/c++/carla-backend/carla_plugin.h index fc722f4..6532559 100644 --- a/c++/carla-backend/carla_plugin.h +++ b/c++/carla-backend/carla_plugin.h @@ -76,7 +76,8 @@ enum PluginBridgeInfoType { PluginBridgeSetMidiProgram, PluginBridgeSetCustomData, PluginBridgeSetChunkData, - PluginBridgeUpdateNow + PluginBridgeUpdateNow, + PluginBridgeError }; #endif diff --git a/c++/carla-backend/qtcreator/carla-backend.pro b/c++/carla-backend/qtcreator/carla-backend.pro index 16c85d0..b6bf1f3 100644 --- a/c++/carla-backend/qtcreator/carla-backend.pro +++ b/c++/carla-backend/qtcreator/carla-backend.pro @@ -6,7 +6,7 @@ CONFIG = debug link_pkgconfig qt warn_on plugin shared PKGCONFIG = liblo PKGCONFIG += jack PKGCONFIG += alsa libpulse-simple -#PKGCONFIG += fluidsynth linuxsampler +PKGCONFIG += fluidsynth linuxsampler PKGCONFIG += suil-0 TARGET = carla_backend diff --git a/c++/carla-bridge/carla_bridge_client.h b/c++/carla-bridge/carla_bridge_client.h index e64a061..d8857d7 100644 --- a/c++/carla-bridge/carla_bridge_client.h +++ b/c++/carla-bridge/carla_bridge_client.h @@ -255,6 +255,12 @@ public: qDebug("CarlaClient::sendOscBridgeUpdate()"); m_osc.sendOscBridgeUpdate(); } + + void sendOscBridgeError(const char* const error) + { + qDebug("CarlaClient::sendOscBridgeError(\"%s\")", error); + m_osc.sendOscBridgeError(error); + } #endif #ifdef BRIDGE_LV2 diff --git a/c++/carla-bridge/carla_bridge_osc.h b/c++/carla-bridge/carla_bridge_osc.h index dcdce29..10efd49 100644 --- a/c++/carla-bridge/carla_bridge_osc.h +++ b/c++/carla-bridge/carla_bridge_osc.h @@ -137,6 +137,15 @@ public: if (m_controlData.target && m_serverPath) osc_send_bridge_update(&m_controlData, m_serverPath); } + + void sendOscBridgeError(const char* const error) + { + Q_ASSERT(m_controlData.target && m_serverPath); + Q_ASSERT(error); + + if (m_controlData.target && m_serverPath) + osc_send_bridge_error(&m_controlData, error); + } #endif #ifdef BRIDGE_LV2 diff --git a/c++/carla-bridge/carla_bridge_plugin.cpp b/c++/carla-bridge/carla_bridge_plugin.cpp index 63e2961..55c4370 100644 --- a/c++/carla-bridge/carla_bridge_plugin.cpp +++ b/c++/carla-bridge/carla_bridge_plugin.cpp @@ -109,8 +109,8 @@ public: setWindowTitle(QString("%1 (GUI)").arg(pluginName)); #ifdef Q_OS_WIN - //if (! resizable) - //setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); + if (! resizable) + setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); #endif } @@ -699,8 +699,10 @@ int main(int argc, char* argv[]) if (! engine.init(engName.toUtf8().constData())) { - qWarning("Bridge engine failed to start, error was:\n%s", CarlaBackend::getLastError()); + const char* const lastError = CarlaBackend::getLastError(); + qWarning("Bridge engine failed to start, error was:\n%s", lastError); engine.close(); + client.sendOscBridgeError(lastError); client.quit(); return 2; } @@ -731,7 +733,9 @@ int main(int argc, char* argv[]) } else { - qWarning("Plugin failed to load, error was:\n%s", CarlaBackend::getLastError()); + const char* const lastError = CarlaBackend::getLastError(); + qWarning("Plugin failed to load, error was:\n%s", lastError); + client.sendOscBridgeError(lastError); ret = 1; } diff --git a/c++/carla-includes/carla_osc_includes.h b/c++/carla-includes/carla_osc_includes.h index 9c53158..81f707e 100644 --- a/c++/carla-includes/carla_osc_includes.h +++ b/c++/carla-includes/carla_osc_includes.h @@ -284,6 +284,22 @@ void osc_send_bridge_update(const CarlaOscData* const oscData, const char* const lo_send(oscData->target, targetPath, "s", url); } } + +static inline +void osc_send_bridge_error(const CarlaOscData* const oscData, const char* const error) +{ + Q_ASSERT(oscData && oscData->path); + Q_ASSERT(error); + qDebug("osc_send_bridge_error(path:\"%s\", \"%s\")", oscData->path, error); + + if (oscData->target) + { + char targetPath[strlen(oscData->path)+14]; + strcpy(targetPath, oscData->path); + strcat(targetPath, "/bridge_error"); + lo_send(oscData->target, targetPath, "s", error); + } +} #endif static inline