diff --git a/source/bridges-plugin/CarlaBridgePlugin.cpp b/source/bridges-plugin/CarlaBridgePlugin.cpp index 843e11883..45b579084 100644 --- a/source/bridges-plugin/CarlaBridgePlugin.cpp +++ b/source/bridges-plugin/CarlaBridgePlugin.cpp @@ -73,6 +73,7 @@ static bool gIsInitiated = false; static volatile bool gCloseBridge = false; static volatile bool gCloseSignal = false; static volatile bool gSaveNow = false; +static volatile bool gLoadNow = false; #if defined(CARLA_OS_UNIX) static void closeSignalHandler(int) noexcept @@ -83,6 +84,10 @@ static void saveSignalHandler(int) noexcept { gSaveNow = true; } +static void loadSignalHandler(int) noexcept +{ + gLoadNow = true; +} #elif defined(CARLA_OS_WIN) static LONG WINAPI winExceptionFilter(_EXCEPTION_POINTERS*) { @@ -116,6 +121,11 @@ static void initSignalHandler() sig.sa_flags = SA_RESTART; sigemptyset(&sig.sa_mask); sigaction(SIGUSR1, &sig, nullptr); + + sig.sa_handler = loadSignalHandler; + sig.sa_flags = SA_RESTART; + sigemptyset(&sig.sa_mask); + sigaction(SIGUSR2, &sig, nullptr); #elif defined(CARLA_OS_WIN) SetConsoleCtrlHandler(winSignalHandler, TRUE); SetErrorMode(SEM_NOGPFAULTERRORBOX); @@ -128,6 +138,31 @@ static void initSignalHandler() static String gProjectFilename; static CarlaHostHandle gHostHandle; +static void gLoadPluginState() +{ + if (File(gProjectFilename).existsAsFile()) + { + if (carla_load_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) + carla_stdout("Plugin state loaded successfully"); + else + carla_stderr("Plugin state load failed, error was:\n%s", carla_get_last_error(gHostHandle)); + } + else + { + carla_stdout("Previous plugin state in '%s' is non-existent, will use default state", + gProjectFilename.toRawUTF8()); + } +} + +static void gSavePluginState() +{ + if (gProjectFilename.isNotEmpty()) + { + if (! carla_save_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) + carla_stderr("Plugin preset save failed, error was:\n%s", carla_get_last_error(gHostHandle)); + } +} + static void gIdle() { carla_engine_idle(gHostHandle); @@ -135,12 +170,13 @@ static void gIdle() if (gSaveNow) { gSaveNow = false; + gSavePluginState(); + } - if (gProjectFilename.isNotEmpty()) - { - if (! carla_save_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) - carla_stderr("Plugin preset save failed, error was:\n%s", carla_get_last_error(gHostHandle)); - } + if (gLoadNow) + { + gLoadNow = false; + gLoadPluginState(); } } @@ -215,18 +251,7 @@ public: if (! File::isAbsolutePath(gProjectFilename)) gProjectFilename = File::getCurrentWorkingDirectory().getChildFile(gProjectFilename).getFullPathName(); - if (File(gProjectFilename).existsAsFile()) - { - if (carla_load_plugin_state(gHostHandle, 0, gProjectFilename.toRawUTF8())) - carla_stdout("Plugin state loaded successfully"); - else - carla_stderr("Plugin state load failed, error was:\n%s", carla_get_last_error(gHostHandle)); - } - else - { - carla_stdout("Previous plugin state in '%s' is non-existent, will start from default state", - gProjectFilename.toRawUTF8()); - } + gLoadPluginState(); } gIsInitiated = true;