diff --git a/lib/macro/macro-script-handler.cpp b/lib/macro/macro-script-handler.cpp index 60f0d1cd..1a4021c2 100644 --- a/lib/macro/macro-script-handler.cpp +++ b/lib/macro/macro-script-handler.cpp @@ -108,6 +108,24 @@ static const std::string setTempVarValueDeclString = tempVarIdParam.data() + ", in string " + valueParam.data() + ", in int " + GetInstanceIdParamName().data() + ")"; +/* Plugin status */ + +static constexpr std::string_view stopSignalName = "advss_plugin_stopped"; +static constexpr std::string_view startSignalName = "advss_plugin_started"; +static constexpr std::string_view getRunningStatusFuncName = + "advss_plugin_running"; +static constexpr std::string_view resetIntervalSignalName = + "advss_interval_reset"; + +static const std::string stopSignalDeclString = + std::string("void ") + stopSignalName.data() + "()"; +static const std::string startSignalDeclString = + std::string("void ") + startSignalName.data() + "()"; +static const std::string resetIntervalDeclString = + std::string("void ") + resetIntervalSignalName.data() + "()"; +static const std::string getRunningStatusDeclString = + std::string("bool ") + getRunningStatusFuncName.data() + "()"; + static bool setup(); static bool setupDone = setup(); @@ -134,6 +152,25 @@ static bool setup() &ScriptHandler::DeregisterAllTempVars, nullptr); proc_handler_add(ph, setTempVarValueDeclString.c_str(), &ScriptHandler::SetTempVarValue, nullptr); + proc_handler_add(ph, getRunningStatusDeclString.c_str(), + &ScriptHandler::GetRunningStatus, nullptr); + + auto sh = obs_get_signal_handler(); + signal_handler_add(sh, stopSignalDeclString.c_str()); + signal_handler_add(sh, startSignalDeclString.c_str()); + signal_handler_add(sh, resetIntervalDeclString.c_str()); + + static constexpr auto triggerSignal = [](const std::string_view &name) { + auto sh = obs_get_signal_handler(); + struct calldata data; + calldata_init(&data); + signal_handler_signal(sh, name.data(), &data); + calldata_free(&data); + }; + + AddIntervalResetStep([]() { triggerSignal(resetIntervalSignalName); }); + AddStartStep([]() { triggerSignal(startSignalName); }); + AddStopStep([]() { triggerSignal(stopSignalName); }); return true; } @@ -476,6 +513,11 @@ void ScriptHandler::SetVariableValue(void *, calldata_t *data) RETURN_SUCCESS(); } +void ScriptHandler::GetRunningStatus(void *ctx, calldata_t *data) +{ + calldata_set_bool(data, "is_running", PluginIsRunning()); +} + void ScriptHandler::RegisterTempVar(void *, calldata_t *data) { const char *variableId; diff --git a/lib/macro/macro-script-handler.hpp b/lib/macro/macro-script-handler.hpp index d9b2846f..d7bcb0b6 100644 --- a/lib/macro/macro-script-handler.hpp +++ b/lib/macro/macro-script-handler.hpp @@ -32,6 +32,7 @@ public: static void DeregisterAllTempVars(void *ctx, calldata_t *data); static void SetTempVarValue(void *ctx, calldata_t *data); static void SetVariableValue(void *ctx, calldata_t *data); + static void GetRunningStatus(void *ctx, calldata_t *data); static bool ActionIdIsValid(const std::string &id); static bool ConditionIdIsValid(const std::string &id); diff --git a/scripting/examples.py b/scripting/examples.py index af313694..c61fe3b8 100644 --- a/scripting/examples.py +++ b/scripting/examples.py @@ -148,6 +148,39 @@ def script_load(settings): ], ) + # Other signals and procedures, which might be useful + def plugin_stop_handler(data): + obs.script_log(obs.LOG_INFO, "Hello from stop handler!") + get_running_status() + + def plugin_start_handler(data): + obs.script_log(obs.LOG_INFO, "Hello from start handler!") + get_running_status() + + def get_running_status(): + proc_handler = obs.obs_get_proc_handler() + data = obs.calldata_create() + obs.proc_handler_call(proc_handler, "advss_plugin_running", data) + success = obs.calldata_bool(data, "is_running") + obs.script_log( + obs.LOG_INFO, f"The advanced scene switcher is currently running: {success}" + ) + obs.calldata_destroy(data) + + def interval_reset_handler(data): + obs.script_log(obs.LOG_INFO, "Hello from reset handler!") + + signal_handler = obs.obs_get_signal_handler() + obs.signal_handler_connect( + signal_handler, "advss_plugin_stopped", plugin_stop_handler + ) + obs.signal_handler_connect( + signal_handler, "advss_plugin_started", plugin_start_handler + ) + obs.signal_handler_connect( + signal_handler, "advss_interval_reset", interval_reset_handler + ) + def script_unload(): # Deregistering is useful if you plan on reloading the script files