diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 0f154604..b7322957 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -334,6 +334,7 @@ AdvSceneSwitcher.action.macro.type.pause="Pause" AdvSceneSwitcher.action.macro.type.unpause="Unpause" AdvSceneSwitcher.action.macro.type.resetCounter="Reset counter" AdvSceneSwitcher.action.macro.type.run="Run" +AdvSceneSwitcher.action.macro.type.stop="Stop" AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}" AdvSceneSwitcher.action.pluginState="Plugin state" AdvSceneSwitcher.action.pluginState.type.stop="Stop the Advanced Scene Switcher plugin" diff --git a/src/headers/macro-action-macro.hpp b/src/headers/macro-action-macro.hpp index 32c0ab54..0e00f2ee 100644 --- a/src/headers/macro-action-macro.hpp +++ b/src/headers/macro-action-macro.hpp @@ -9,6 +9,7 @@ enum class PerformMacroAction { UNPAUSE, RESET_COUNTER, RUN, + STOP, }; class MacroActionMacro : public MacroRefAction { diff --git a/src/headers/macro.hpp b/src/headers/macro.hpp index e2d95293..37cb116f 100644 --- a/src/headers/macro.hpp +++ b/src/headers/macro.hpp @@ -88,6 +88,7 @@ public: bool MatchOnChange() { return _matchOnChange; } int GetCount() { return _count; }; void ResetCount() { _count = 0; }; + void Stop() { _stop = true; } std::deque> &Conditions() { return _conditions; @@ -126,6 +127,7 @@ private: obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID; + bool _die = false; bool _stop = false; bool _done = true; std::thread _thread; diff --git a/src/macro-action-macro.cpp b/src/macro-action-macro.cpp index 799d23a1..e97db31e 100644 --- a/src/macro-action-macro.cpp +++ b/src/macro-action-macro.cpp @@ -16,6 +16,7 @@ const static std::map actionTypes = { {PerformMacroAction::RESET_COUNTER, "AdvSceneSwitcher.action.macro.type.resetCounter"}, {PerformMacroAction::RUN, "AdvSceneSwitcher.action.macro.type.run"}, + {PerformMacroAction::STOP, "AdvSceneSwitcher.action.macro.type.stop"}, }; bool MacroActionMacro::PerformAction() @@ -37,6 +38,9 @@ bool MacroActionMacro::PerformAction() case PerformMacroAction::RUN: _macro->PerformAction(); break; + case PerformMacroAction::STOP: + _macro->Stop(); + break; default: break; } @@ -63,6 +67,9 @@ void MacroActionMacro::LogAction() vblog(LOG_INFO, "run nested macro \"%s\"", _macro->Name().c_str()); break; + case PerformMacroAction::STOP: + vblog(LOG_INFO, "stopped macro \"%s\"", _macro->Name().c_str()); + break; default: break; } diff --git a/src/macro.cpp b/src/macro.cpp index 4da66433..2a13b8e8 100644 --- a/src/macro.cpp +++ b/src/macro.cpp @@ -29,7 +29,7 @@ Macro::Macro(const std::string &name) Macro::~Macro() { - _stop = true; + _die = true; if (_thread.joinable()) { _thread.join(); } @@ -121,9 +121,9 @@ bool Macro::PerformAction(bool forceParallel, bool ignorePause) vblog(LOG_INFO, "macro %s already running", _name.c_str()); return !forceParallel; } - - bool ret = true; + _stop = false; _done = false; + bool ret = true; if (_runInParallel || forceParallel) { if (_thread.joinable()) { _thread.join(); @@ -155,7 +155,7 @@ void Macro::RunActions(bool &retVal, bool ignorePause) for (auto &a : _actions) { a->LogAction(); ret = ret && a->PerformAction(); - if (!ret || _stop || (_paused && !ignorePause)) { + if (!ret || (_paused && !ignorePause) || _stop || _die) { retVal = ret; _done = true; return;