Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SIGUSR2 handler in bridge plugin to re-load state. #1658

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 42 additions & 17 deletions source/bridges-plugin/CarlaBridgePlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ using water::String;
static bool gIsInitiated = false;
static volatile bool gCloseNow = false;
static volatile bool gSaveNow = false;
static volatile bool gLoadNow = false;

#if defined(CARLA_OS_UNIX)
static void closeSignalHandler(int) noexcept
Expand All @@ -84,6 +85,10 @@ static void saveSignalHandler(int) noexcept
{
gSaveNow = true;
}
static void loadSignalHandler(int) noexcept
{
gLoadNow = true;
}
#elif defined(CARLA_OS_WIN)
static BOOL WINAPI winSignalHandler(DWORD dwCtrlType) noexcept
{
Expand Down Expand Up @@ -112,6 +117,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);
#endif
Expand All @@ -122,19 +132,45 @@ 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);

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();
}
}

Expand Down Expand Up @@ -212,18 +248,7 @@ class CarlaBridgePlugin
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;
Expand Down