diff --git a/c++/carla-backend/carla_backend.h b/c++/carla-backend/carla_backend.h index aff5274..cdfcb46 100644 --- a/c++/carla-backend/carla_backend.h +++ b/c++/carla-backend/carla_backend.h @@ -499,10 +499,15 @@ enum CallbackType { */ CALLBACK_NSM_SAVE = 18, + /*! + * An error occurred, show last error to user. + */ + CALLBACK_ERROR = 19, + /*! * The engine has crashed or malfunctioned and will no longer work. */ - CALLBACK_QUIT = 19 + CALLBACK_QUIT = 20 }; /*! diff --git a/c++/carla-backend/carla_threads.cpp b/c++/carla-backend/carla_threads.cpp index 1bd562f..55e8411 100644 --- a/c++/carla-backend/carla_threads.cpp +++ b/c++/carla-backend/carla_threads.cpp @@ -287,8 +287,17 @@ void CarlaPluginThread::run() m_process->waitForFinished(-1); if (m_process->exitCode() != 0) + { qWarning("CarlaPluginThread::run() - bridge crashed"); + QString errorString = QString("Plugin '%1' has crashed!\n" + "Saving now will lose its current settings.\n" + "Please remove this plugin, and not rely on it from this point.").arg(plugin->name()); + CarlaBackend::setLastError(errorString.toUtf8().constData()); + + engine->callback(CarlaBackend::CALLBACK_ERROR, plugin->id(), 0, 0, 0.0); + } + break; } } diff --git a/src/carla.py b/src/carla.py index 6d600d0..d66c111 100755 --- a/src/carla.py +++ b/src/carla.py @@ -1220,6 +1220,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.connect(self, SIGNAL("NSM_Open1Callback()"), SLOT("slot_handleNSM_Open1Callback()")) self.connect(self, SIGNAL("NSM_Open2Callback()"), SLOT("slot_handleNSM_Open2Callback()")) self.connect(self, SIGNAL("NSM_SaveCallback()"), SLOT("slot_handleNSM_SaveCallback()")) + self.connect(self, SIGNAL("ErrorCallback(QString)"), SLOT("slot_handleErrorCallback(QString)")) self.connect(self, SIGNAL("QuitCallback()"), SLOT("slot_handleQuitCallback()")) self.TIMER_GUI_STUFF = self.startTimer(self.m_savedSettings["Main/RefreshInterval"]) # Peaks @@ -1503,6 +1504,10 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.save_project() Carla.Host.nsm_reply_save() + @pyqtSlot(str) + def slot_handleErrorCallback(self, error): + QMessageBox.critical(self, self.tr("Error"), error) + @pyqtSlot() def slot_handleQuitCallback(self): CustomMessageBox(self, QMessageBox.Warning, self.tr("Warning"), @@ -2071,6 +2076,8 @@ def callback_function(ptr, action, pluginId, value1, value2, value3): Carla.gui.emit(SIGNAL("NSM_Open2Callback()")) elif action == CALLBACK_NSM_SAVE: Carla.gui.emit(SIGNAL("NSM_SaveCallback()")) + elif action == CALLBACK_ERROR: + Carla.gui.emit(SIGNAL("ErrorCallback(QString)"), cString(Carla.Host.get_last_error())) elif action == CALLBACK_QUIT: Carla.gui.emit(SIGNAL("QuitCallback()")) diff --git a/src/shared_carla.py b/src/shared_carla.py index ad9ea0c..31a481e 100644 --- a/src/shared_carla.py +++ b/src/shared_carla.py @@ -193,7 +193,8 @@ CALLBACK_NSM_ANNOUNCE = 15 CALLBACK_NSM_OPEN1 = 16 CALLBACK_NSM_OPEN2 = 17 CALLBACK_NSM_SAVE = 18 -CALLBACK_QUIT = 19 +CALLBACK_ERROR = 19 +CALLBACK_QUIT = 20 # enum ProcessModeType PROCESS_MODE_SINGLE_CLIENT = 0