From 0317d45ea82da292ccd4e823a96964e87d213fec Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Mon, 1 Jan 2024 23:45:50 +0100 Subject: [PATCH] Reduce dependencies to macro internals --- src/advanced-scene-switcher.cpp | 4 +- src/general.cpp | 7 +- src/macro-core/macro-action-audio.cpp | 10 +-- src/macro-core/macro-action-random.cpp | 8 +-- src/macro-core/macro-action-scene-switch.cpp | 5 +- src/macro-core/macro-action-sequence.cpp | 12 ++-- src/macro-core/macro-action-timer.cpp | 18 ++--- src/macro-core/macro-action-wait.cpp | 3 +- src/macro-core/macro-condition-audio.cpp | 6 +- src/macro-core/macro-condition-date.cpp | 4 +- src/macro-core/macro-condition-media.cpp | 33 ++++----- src/macro-core/macro-condition-slideshow.cpp | 4 +- src/macro-core/macro-helpers.cpp | 68 +++++++++++++++++++ src/macro-core/macro-helpers.hpp | 44 ++++++++++++ src/macro-core/macro-properties.cpp | 1 + src/macro-core/macro-properties.hpp | 3 +- src/macro-core/macro.hpp | 3 +- .../openvr/macro-condition-openvr.hpp | 2 +- .../video/macro-condition-video.hpp | 2 +- src/utils/macro-list.cpp | 3 +- 20 files changed, 180 insertions(+), 60 deletions(-) diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 1c1343fd..90bb1277 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -429,8 +429,8 @@ bool SwitcherData::CheckForMatch(OBSWeakSource &scene, static void ResetMacros() { for (auto &m : GetMacros()) { - m->ResetRunCount(); - m->ResetTimers(); + ResetMacroRunCount(m.get()); + ResetMacroConditionTimers(m.get()); } } diff --git a/src/general.cpp b/src/general.cpp index f9a27c62..2910483d 100644 --- a/src/general.cpp +++ b/src/general.cpp @@ -1,10 +1,11 @@ #include "advanced-scene-switcher.hpp" -#include "switcher-data.hpp" -#include "status-control.hpp" #include "file-selection.hpp" #include "filter-combo-box.hpp" -#include "variable.hpp" +#include "macro.hpp" +#include "status-control.hpp" +#include "switcher-data.hpp" #include "utility.hpp" +#include "variable.hpp" #include "version.h" #include diff --git a/src/macro-core/macro-action-audio.cpp b/src/macro-core/macro-action-audio.cpp index 5d294f6c..68f5ef17 100644 --- a/src/macro-core/macro-action-audio.cpp +++ b/src/macro-core/macro-action-audio.cpp @@ -1,5 +1,5 @@ #include "macro-action-audio.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" #include @@ -168,7 +168,8 @@ void MacroActionAudio::FadeVolume() const int step = 0; auto fadeId = GetFadeIdPtr(); int expectedFadeId = ++(*fadeId); - for (; step < nrSteps && !macro->GetStop() && expectedFadeId == *fadeId; + for (; step < nrSteps && !MacroIsStopped(macro) && + expectedFadeId == *fadeId; ++step) { curVol = (volIncrease) ? curVol + volStep : curVol - volStep; SetVolume(curVol); @@ -203,8 +204,9 @@ void MacroActionAudio::StartFade() const if (_wait) { FadeVolume(); } else { - GetMacro()->AddHelperThread( - std::thread(&MacroActionAudio::FadeVolume, this)); + AddMacroHelperThread(GetMacro(), + std::thread(&MacroActionAudio::FadeVolume, + this)); } } diff --git a/src/macro-core/macro-action-random.cpp b/src/macro-core/macro-action-random.cpp index cca04195..72fb4d24 100644 --- a/src/macro-core/macro-action-random.cpp +++ b/src/macro-core/macro-action-random.cpp @@ -1,5 +1,5 @@ #include "macro-action-random.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" #include @@ -15,7 +15,7 @@ bool MacroActionRandom::_registered = MacroActionFactory::Register( static bool validNextMacro(const std::shared_ptr ¯o) { - return macro && !macro->Paused(); + return !MacroIsPaused(macro.get()); } static std::vector> @@ -54,12 +54,12 @@ bool MacroActionRandom::PerformAction() } if (macros.size() == 1) { lastRandomMacro = macros[0]; - return macros[0]->PerformActions(true); + return RunMacroActions(macros[0].get()); } srand((unsigned int)time(0)); size_t idx = std::rand() % (macros.size()); lastRandomMacro = macros[idx]; - return macros[idx]->PerformActions(true); + return RunMacroActions(macros[idx].get()); } void MacroActionRandom::LogAction() const diff --git a/src/macro-core/macro-action-scene-switch.cpp b/src/macro-core/macro-action-scene-switch.cpp index 126bd525..27a48121 100644 --- a/src/macro-core/macro-action-scene-switch.cpp +++ b/src/macro-core/macro-action-scene-switch.cpp @@ -1,7 +1,6 @@ #include "macro-action-scene-switch.hpp" #include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" -#include "macro.hpp" #include "scene-switch-helpers.hpp" #include "utility.hpp" @@ -36,7 +35,7 @@ static void waitForTransitionChange(OBSWeakSource &transition, bool stillTransitioning = true; while (stillTransitioning && !MacroWaitShouldAbort() && - !macro->GetStop()) { + !MacroIsStopped(macro)) { GetMacroTransitionCV().wait_for(*lock, time); float t = obs_transition_get_time(source); stillTransitioning = t < 1.0f && t > 0.0f; @@ -51,7 +50,7 @@ static void waitForTransitionChangeFixedDuration( auto time = std::chrono::high_resolution_clock::now() + std::chrono::milliseconds(duration); - while (!MacroWaitShouldAbort() && !macro->GetStop()) { + while (!MacroWaitShouldAbort() && !MacroIsStopped(macro)) { if (GetMacroTransitionCV().wait_until(*lock, time) == std::cv_status::timeout) { break; diff --git a/src/macro-core/macro-action-sequence.cpp b/src/macro-core/macro-action-sequence.cpp index e4affb86..47170d21 100644 --- a/src/macro-core/macro-action-sequence.cpp +++ b/src/macro-core/macro-action-sequence.cpp @@ -1,5 +1,5 @@ #include "macro-action-sequence.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" namespace advss { @@ -15,7 +15,7 @@ static int getNextUnpausedMacroIdx(std::vector ¯os, int startIdx) { for (; (int)macros.size() > startIdx; ++startIdx) { auto macro = macros[startIdx].GetMacro(); - if (macro && !macro->Paused()) { + if (!MacroIsPaused(macro.get())) { return startIdx; } } @@ -66,7 +66,7 @@ bool MacroActionSequence::PerformAction() return true; } - return macro->PerformActions(true); + return RunMacroActions(macro.get()); } void MacroActionSequence::LogAction() const @@ -254,11 +254,13 @@ void MacroActionSequenceEdit::UpdateStatusLine() obs_module_text("AdvSceneSwitcher.action.sequence.status.none"); if (_entryData) { if (auto macro = _entryData->_lastSequenceMacro.GetMacro()) { - lastMacroName = QString::fromStdString(macro->Name()); + lastMacroName = QString::fromStdString( + GetMacroName(macro.get())); } auto next = _entryData->GetNextMacro(false).GetMacro(); if (next) { - nextMacroName = QString::fromStdString(next->Name()); + nextMacroName = QString::fromStdString( + GetMacroName(next.get())); } } diff --git a/src/macro-core/macro-action-timer.cpp b/src/macro-core/macro-action-timer.cpp index a6970eae..e1f3ec40 100644 --- a/src/macro-core/macro-action-timer.cpp +++ b/src/macro-core/macro-action-timer.cpp @@ -1,6 +1,6 @@ #include "macro-action-timer.hpp" #include "macro-condition-timer.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" #include @@ -28,12 +28,13 @@ bool MacroActionTimer::PerformAction() if (!macro) { return true; } - for (auto c : macro->Conditions()) { - if (c->GetId() != "timer") { + auto conditions = *GetMacroConditions(macro.get()); + for (auto condition : conditions) { + if (condition->GetId() != id) { continue; } auto timerCondition = - dynamic_cast(c.get()); + dynamic_cast(condition.get()); if (!timerCondition) { continue; } @@ -68,20 +69,21 @@ void MacroActionTimer::LogAction() const switch (_actionType) { case TimerAction::PAUSE: vblog(LOG_INFO, "paused timers on \"%s\"", - macro->Name().c_str()); + GetMacroName(macro.get()).c_str()); break; case TimerAction::CONTINUE: vblog(LOG_INFO, "continued timers on \"%s\"", - macro->Name().c_str()); + GetMacroName(macro.get()).c_str()); break; case TimerAction::RESET: vblog(LOG_INFO, "reset timers on \"%s\"", - macro->Name().c_str()); + GetMacroName(macro.get()).c_str()); break; case TimerAction::SET_TIME_REMAINING: vblog(LOG_INFO, "set time remaining of timers on \"%s\" to \"%s\"", - macro->Name().c_str(), _duration.ToString().c_str()); + GetMacroName(macro.get()).c_str(), + _duration.ToString().c_str()); break; default: break; diff --git a/src/macro-core/macro-action-wait.cpp b/src/macro-core/macro-action-wait.cpp index f8b95896..e7678563 100644 --- a/src/macro-core/macro-action-wait.cpp +++ b/src/macro-core/macro-action-wait.cpp @@ -1,6 +1,5 @@ #include "macro-action-wait.hpp" #include "macro-helpers.hpp" -#include "macro.hpp" #include "sync-helpers.hpp" #include "utility.hpp" @@ -28,7 +27,7 @@ static std::default_random_engine re(rd()); static void waitHelper(std::unique_lock *lock, Macro *macro, std::chrono::high_resolution_clock::time_point &time) { - while (!MacroWaitShouldAbort() && !macro->GetStop()) { + while (!MacroWaitShouldAbort() && !MacroIsStopped(macro)) { if (GetMacroWaitCV().wait_until(*lock, time) == std::cv_status::timeout) { break; diff --git a/src/macro-core/macro-condition-audio.cpp b/src/macro-core/macro-condition-audio.cpp index 8fd7898a..d5fe3c2c 100644 --- a/src/macro-core/macro-condition-audio.cpp +++ b/src/macro-core/macro-condition-audio.cpp @@ -1,5 +1,5 @@ #include "macro-condition-audio.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" namespace advss { @@ -281,9 +281,9 @@ void MacroConditionAudio::SetVolumeLevel(void *data, const float *, const float peak[MAX_AUDIO_CHANNELS], const float *) { - MacroConditionAudio *c = static_cast(data); + auto c = static_cast(data); const auto macro = c->GetMacro(); - if (macro && macro->Paused()) { + if (MacroIsPaused(macro)) { return; } diff --git a/src/macro-core/macro-condition-date.cpp b/src/macro-core/macro-condition-date.cpp index 0925a894..964cfbce 100644 --- a/src/macro-core/macro-condition-date.cpp +++ b/src/macro-core/macro-condition-date.cpp @@ -1,5 +1,5 @@ #include "macro-condition-date.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" #include @@ -180,7 +180,7 @@ bool MacroConditionDate::CheckCondition() if (!m) { return false; } - auto msSinceLastCheck = m->MsSinceLastCheck(); + auto msSinceLastCheck = MillisecondsSinceMacroConditionCheck(m); if (_dayOfWeekCheck) { return CheckDayOfWeek(msSinceLastCheck); } diff --git a/src/macro-core/macro-condition-media.cpp b/src/macro-core/macro-condition-media.cpp index eb38ba36..193e5e09 100644 --- a/src/macro-core/macro-condition-media.cpp +++ b/src/macro-core/macro-condition-media.cpp @@ -1,5 +1,5 @@ #include "macro-condition-media.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "plugin-state-helpers.hpp" #include "scene-switch-helpers.hpp" #include "utility.hpp" @@ -13,20 +13,21 @@ bool MacroConditionMedia::_registered = MacroConditionFactory::Register( {MacroConditionMedia::Create, MacroConditionMediaEdit::Create, "AdvSceneSwitcher.condition.media"}); -static std::map mediaTimeRestrictions = { - {MacroConditionMedia::Time::TIME_RESTRICTION_NONE, - "AdvSceneSwitcher.mediaTab.timeRestriction.none"}, - {MacroConditionMedia::Time::TIME_RESTRICTION_SHORTER, - "AdvSceneSwitcher.mediaTab.timeRestriction.shorter"}, - {MacroConditionMedia::Time::TIME_RESTRICTION_LONGER, - "AdvSceneSwitcher.mediaTab.timeRestriction.longer"}, - {MacroConditionMedia::Time::TIME_RESTRICTION_REMAINING_SHORTER, - "AdvSceneSwitcher.mediaTab.timeRestriction.remainShorter"}, - {MacroConditionMedia::Time::TIME_RESTRICTION_REMAINING_LONGER, - "AdvSceneSwitcher.mediaTab.timeRestriction.remainLonger"}, +static const std::map + mediaTimeRestrictions = { + {MacroConditionMedia::Time::TIME_RESTRICTION_NONE, + "AdvSceneSwitcher.mediaTab.timeRestriction.none"}, + {MacroConditionMedia::Time::TIME_RESTRICTION_SHORTER, + "AdvSceneSwitcher.mediaTab.timeRestriction.shorter"}, + {MacroConditionMedia::Time::TIME_RESTRICTION_LONGER, + "AdvSceneSwitcher.mediaTab.timeRestriction.longer"}, + {MacroConditionMedia::Time::TIME_RESTRICTION_REMAINING_SHORTER, + "AdvSceneSwitcher.mediaTab.timeRestriction.remainShorter"}, + {MacroConditionMedia::Time::TIME_RESTRICTION_REMAINING_LONGER, + "AdvSceneSwitcher.mediaTab.timeRestriction.remainLonger"}, }; -static std::map mediaStates = { +static const std::map mediaStates = { {MacroConditionMedia::State::OBS_MEDIA_STATE_NONE, "AdvSceneSwitcher.mediaTab.states.none"}, {MacroConditionMedia::State::OBS_MEDIA_STATE_PLAYING, @@ -332,7 +333,7 @@ void MacroConditionMedia::MediaStopped(void *data, calldata_t *) { MacroConditionMedia *media = static_cast(data); const auto macro = media->GetMacro(); - if (macro && macro->Paused()) { + if (MacroIsPaused(macro)) { return; } media->_stopped = true; @@ -342,7 +343,7 @@ void MacroConditionMedia::MediaEnded(void *data, calldata_t *) { MacroConditionMedia *media = static_cast(data); const auto macro = media->GetMacro(); - if (macro && macro->Paused()) { + if (MacroIsPaused(macro)) { return; } media->_ended = true; @@ -352,7 +353,7 @@ void MacroConditionMedia::MediaNext(void *data, calldata_t *) { MacroConditionMedia *media = static_cast(data); const auto macro = media->GetMacro(); - if (macro && macro->Paused()) { + if (MacroIsPaused(macro)) { return; } media->_next = true; diff --git a/src/macro-core/macro-condition-slideshow.cpp b/src/macro-core/macro-condition-slideshow.cpp index f605dd06..d67ca999 100644 --- a/src/macro-core/macro-condition-slideshow.cpp +++ b/src/macro-core/macro-condition-slideshow.cpp @@ -1,5 +1,5 @@ #include "macro-condition-slideshow.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "utility.hpp" namespace advss { @@ -121,7 +121,7 @@ void MacroConditionSlideshow::SlideChanged(void *c, calldata_t *data) { auto condition = static_cast(c); const auto macro = condition->GetMacro(); - if (macro && macro->Paused()) { + if (MacroIsPaused(macro)) { return; } diff --git a/src/macro-core/macro-helpers.cpp b/src/macro-core/macro-helpers.cpp index 4fa56e43..227eee9c 100644 --- a/src/macro-core/macro-helpers.cpp +++ b/src/macro-core/macro-helpers.cpp @@ -1,4 +1,5 @@ #include "macro-helpers.hpp" +#include "macro.hpp" #include "plugin-state-helpers.hpp" namespace advss { @@ -7,6 +8,24 @@ static std::atomic_bool abortMacroWait = {false}; static std::atomic_bool macroSceneSwitched = {false}; static std::atomic_int shutdownConditionCount = {0}; +std::optional>> +GetMacroActions(Macro *macro) +{ + if (!macro) { + return {}; + } + return macro->Actions(); +} + +std::optional>> +GetMacroConditions(Macro *macro) +{ + if (!macro) { + return {}; + } + return macro->Conditions(); +} + std::condition_variable &GetMacroWaitCV() { static std::condition_variable cv; @@ -56,4 +75,53 @@ bool MacroSwitchedScene() return macroSceneSwitched; } +std::string GetMacroName(Macro *macro) +{ + return macro ? macro->Name() : ""; +} + +int64_t MillisecondsSinceMacroConditionCheck(Macro *macro) +{ + return macro ? macro->MsSinceLastCheck() : 0; +} + +bool MacroIsStopped(Macro *macro) +{ + return macro ? macro->GetStop() : true; +} + +bool MacroIsPaused(Macro *macro) +{ + return macro ? macro->Paused() : true; +} + +void AddMacroHelperThread(Macro *macro, std::thread &&newThread) +{ + if (!macro) { + return; + } + macro->AddHelperThread(std::move(newThread)); +} + +bool RunMacroActions(Macro *macro) +{ + return macro && macro->PerformActions(true); +} + +void ResetMacroConditionTimers(Macro *macro) +{ + if (!macro) { + return; + } + macro->ResetTimers(); +} + +void ResetMacroRunCount(Macro *macro) +{ + if (!macro) { + return; + } + macro->ResetRunCount(); +} + } // namespace advss diff --git a/src/macro-core/macro-helpers.hpp b/src/macro-core/macro-helpers.hpp index 8a607c46..1965841d 100644 --- a/src/macro-core/macro-helpers.hpp +++ b/src/macro-core/macro-helpers.hpp @@ -1,21 +1,65 @@ #pragma once #include #include +#include +#include #include +#include + +struct obs_data; +typedef struct obs_data obs_data_t; namespace advss { +class Macro; +class MacroAction; +class MacroCondition; + +std::deque> &GetMacros(); + +std::optional>> +GetMacroActions(Macro *); +std::optional>> +GetMacroConditions(Macro *); + constexpr std::string_view GetSceneSwitchActionId() { return "scene_switch"; } + +constexpr auto macro_func = 10; + std::condition_variable &GetMacroWaitCV(); std::condition_variable &GetMacroTransitionCV(); + std::atomic_bool &MacroWaitShouldAbort(); void SetMacroAbortWait(bool); + bool ShutdownCheckIsNecessary(); std::atomic_int &GetShutdownConditionCount(); + void SetMacroSwitchedScene(bool value); bool MacroSwitchedScene(); +std::string GetMacroName(Macro *); + +int64_t MillisecondsSinceMacroConditionCheck(Macro *); + +bool MacroIsStopped(Macro *); +bool MacroIsPaused(Macro *); + +void AddMacroHelperThread(Macro *, std::thread &&); + +bool CheckMacros(); + +bool RunMacroActions(Macro *); +bool RunMacros(); + +void LoadMacros(obs_data_t *obj); +void SaveMacros(obs_data_t *obj); + +void InvalidateMacroTempVarValues(); +void ResetMacroConditionTimers(Macro *); +void ResetMacroRunCount(Macro *); + } // namespace advss diff --git a/src/macro-core/macro-properties.cpp b/src/macro-core/macro-properties.cpp index b7542660..ccf8dfa4 100644 --- a/src/macro-core/macro-properties.cpp +++ b/src/macro-core/macro-properties.cpp @@ -1,4 +1,5 @@ #include "macro-properties.hpp" +#include "macro.hpp" #include "obs-module-helper.hpp" #include "utility.hpp" diff --git a/src/macro-core/macro-properties.hpp b/src/macro-core/macro-properties.hpp index 1e9af45c..9e8566d8 100644 --- a/src/macro-core/macro-properties.hpp +++ b/src/macro-core/macro-properties.hpp @@ -1,5 +1,4 @@ #pragma once -#include "macro.hpp" #include "variable-line-edit.hpp" #include @@ -12,6 +11,8 @@ namespace advss { +class Macro; + class MacroProperties { public: void Save(obs_data_t *obj) const; diff --git a/src/macro-core/macro.hpp b/src/macro-core/macro.hpp index bda2699a..6fe0f568 100644 --- a/src/macro-core/macro.hpp +++ b/src/macro-core/macro.hpp @@ -1,6 +1,7 @@ #pragma once #include "macro-action.hpp" #include "macro-condition.hpp" +#include "macro-helpers.hpp" #include "macro-ref.hpp" #include "variable-string.hpp" #include "temp-variable.hpp" @@ -17,8 +18,6 @@ namespace advss { -constexpr auto macro_func = 10; - class MacroDock; class Macro { diff --git a/src/macro-external/openvr/macro-condition-openvr.hpp b/src/macro-external/openvr/macro-condition-openvr.hpp index f9fd13a9..44debc3b 100644 --- a/src/macro-external/openvr/macro-condition-openvr.hpp +++ b/src/macro-external/openvr/macro-condition-openvr.hpp @@ -1,5 +1,5 @@ #pragma once -#include +#include #include #include diff --git a/src/macro-external/video/macro-condition-video.hpp b/src/macro-external/video/macro-condition-video.hpp index 6f68e3fa..2d100201 100644 --- a/src/macro-external/video/macro-condition-video.hpp +++ b/src/macro-external/video/macro-condition-video.hpp @@ -4,7 +4,7 @@ #include "preview-dialog.hpp" #include "paramerter-wrappers.hpp" -#include +#include #include #include #include diff --git a/src/utils/macro-list.cpp b/src/utils/macro-list.cpp index 2b79d22d..d38e422c 100644 --- a/src/utils/macro-list.cpp +++ b/src/utils/macro-list.cpp @@ -1,6 +1,7 @@ #include "macro-list.hpp" -#include "macro.hpp" +#include "macro-helpers.hpp" #include "macro-selection.hpp" +#include "obs-module-helper.hpp" #include "utility.hpp" namespace advss {