| @@ -69,6 +69,7 @@ public: | |||||
| m_hints = PLUGIN_IS_BRIDGE; | m_hints = PLUGIN_IS_BRIDGE; | ||||
| m_initiated = false; | m_initiated = false; | ||||
| m_initError = false; | |||||
| m_saved = false; | m_saved = false; | ||||
| info.aIns = 0; | info.aIns = 0; | ||||
| @@ -712,10 +713,28 @@ public: | |||||
| } | } | ||||
| case PluginBridgeUpdateNow: | case PluginBridgeUpdateNow: | ||||
| { | |||||
| m_initiated = true; | m_initiated = true; | ||||
| break; | 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; | return 0; | ||||
| } | } | ||||
| @@ -927,6 +946,15 @@ public: | |||||
| setLastError("Timeout while waiting for a response from plugin-bridge"); | setLastError("Timeout while waiting for a response from plugin-bridge"); | ||||
| return false; | 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; | return true; | ||||
| } | } | ||||
| @@ -935,6 +963,7 @@ private: | |||||
| const BinaryType m_binary; | const BinaryType m_binary; | ||||
| bool m_initiated; | bool m_initiated; | ||||
| bool m_initError; | |||||
| bool m_saved; | bool m_saved; | ||||
| struct { | struct { | ||||
| @@ -242,6 +242,8 @@ int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg | |||||
| return plugin->setOscBridgeInfo(PluginBridgeSetChunkData, argc, argv, types); | return plugin->setOscBridgeInfo(PluginBridgeSetChunkData, argc, argv, types); | ||||
| if (strcmp(method, "/bridge_update") == 0) | if (strcmp(method, "/bridge_update") == 0) | ||||
| return plugin->setOscBridgeInfo(PluginBridgeUpdateNow, argc, argv, types); | 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); | qWarning("CarlaOsc::handleMessage() - unsupported OSC method '%s'", method); | ||||
| @@ -76,7 +76,8 @@ enum PluginBridgeInfoType { | |||||
| PluginBridgeSetMidiProgram, | PluginBridgeSetMidiProgram, | ||||
| PluginBridgeSetCustomData, | PluginBridgeSetCustomData, | ||||
| PluginBridgeSetChunkData, | PluginBridgeSetChunkData, | ||||
| PluginBridgeUpdateNow | |||||
| PluginBridgeUpdateNow, | |||||
| PluginBridgeError | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -6,7 +6,7 @@ CONFIG = debug link_pkgconfig qt warn_on plugin shared | |||||
| PKGCONFIG = liblo | PKGCONFIG = liblo | ||||
| PKGCONFIG += jack | PKGCONFIG += jack | ||||
| PKGCONFIG += alsa libpulse-simple | PKGCONFIG += alsa libpulse-simple | ||||
| #PKGCONFIG += fluidsynth linuxsampler | |||||
| PKGCONFIG += fluidsynth linuxsampler | |||||
| PKGCONFIG += suil-0 | PKGCONFIG += suil-0 | ||||
| TARGET = carla_backend | TARGET = carla_backend | ||||
| @@ -255,6 +255,12 @@ public: | |||||
| qDebug("CarlaClient::sendOscBridgeUpdate()"); | qDebug("CarlaClient::sendOscBridgeUpdate()"); | ||||
| m_osc.sendOscBridgeUpdate(); | m_osc.sendOscBridgeUpdate(); | ||||
| } | } | ||||
| void sendOscBridgeError(const char* const error) | |||||
| { | |||||
| qDebug("CarlaClient::sendOscBridgeError(\"%s\")", error); | |||||
| m_osc.sendOscBridgeError(error); | |||||
| } | |||||
| #endif | #endif | ||||
| #ifdef BRIDGE_LV2 | #ifdef BRIDGE_LV2 | ||||
| @@ -137,6 +137,15 @@ public: | |||||
| if (m_controlData.target && m_serverPath) | if (m_controlData.target && m_serverPath) | ||||
| osc_send_bridge_update(&m_controlData, 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 | #endif | ||||
| #ifdef BRIDGE_LV2 | #ifdef BRIDGE_LV2 | ||||
| @@ -109,8 +109,8 @@ public: | |||||
| setWindowTitle(QString("%1 (GUI)").arg(pluginName)); | setWindowTitle(QString("%1 (GUI)").arg(pluginName)); | ||||
| #ifdef Q_OS_WIN | #ifdef Q_OS_WIN | ||||
| //if (! resizable) | |||||
| //setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); | |||||
| if (! resizable) | |||||
| setWindowFlags(windowFlags() | Qt::MSWindowsFixedSizeDialogHint); | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -699,8 +699,10 @@ int main(int argc, char* argv[]) | |||||
| if (! engine.init(engName.toUtf8().constData())) | 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(); | engine.close(); | ||||
| client.sendOscBridgeError(lastError); | |||||
| client.quit(); | client.quit(); | ||||
| return 2; | return 2; | ||||
| } | } | ||||
| @@ -731,7 +733,9 @@ int main(int argc, char* argv[]) | |||||
| } | } | ||||
| else | 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; | ret = 1; | ||||
| } | } | ||||
| @@ -284,6 +284,22 @@ void osc_send_bridge_update(const CarlaOscData* const oscData, const char* const | |||||
| lo_send(oscData->target, targetPath, "s", url); | 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 | #endif | ||||
| static inline | static inline | ||||