Browse Source

Carla: Send error message on bridge failure, don't wait for timeout

tags/v0.9.0
falkTX 13 years ago
parent
commit
c2b14654b2
8 changed files with 73 additions and 6 deletions
  1. +29
    -0
      c++/carla-backend/carla_bridge.cpp
  2. +2
    -0
      c++/carla-backend/carla_osc.cpp
  3. +2
    -1
      c++/carla-backend/carla_plugin.h
  4. +1
    -1
      c++/carla-backend/qtcreator/carla-backend.pro
  5. +6
    -0
      c++/carla-bridge/carla_bridge_client.h
  6. +9
    -0
      c++/carla-bridge/carla_bridge_osc.h
  7. +8
    -4
      c++/carla-bridge/carla_bridge_plugin.cpp
  8. +16
    -0
      c++/carla-includes/carla_osc_includes.h

+ 29
- 0
c++/carla-backend/carla_bridge.cpp View File

@@ -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 {


+ 2
- 0
c++/carla-backend/carla_osc.cpp View File

@@ -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);


+ 2
- 1
c++/carla-backend/carla_plugin.h View File

@@ -76,7 +76,8 @@ enum PluginBridgeInfoType {
PluginBridgeSetMidiProgram, PluginBridgeSetMidiProgram,
PluginBridgeSetCustomData, PluginBridgeSetCustomData,
PluginBridgeSetChunkData, PluginBridgeSetChunkData,
PluginBridgeUpdateNow
PluginBridgeUpdateNow,
PluginBridgeError
}; };
#endif #endif




+ 1
- 1
c++/carla-backend/qtcreator/carla-backend.pro View File

@@ -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


+ 6
- 0
c++/carla-bridge/carla_bridge_client.h View File

@@ -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


+ 9
- 0
c++/carla-bridge/carla_bridge_osc.h View File

@@ -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


+ 8
- 4
c++/carla-bridge/carla_bridge_plugin.cpp View File

@@ -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;
} }




+ 16
- 0
c++/carla-includes/carla_osc_includes.h View File

@@ -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


Loading…
Cancel
Save