diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index ab72870b..7051fc49 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -618,11 +618,6 @@ static void handlePeviewSceneChange() } } -static void setReplayBufferSaved() -{ - switcher->replayBufferSaved = true; -} - static void handleTransitionEnd() { GetMacroTransitionCV().notify_all(); @@ -694,11 +689,6 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher) case OBS_FRONTEND_EVENT_STREAMING_STOPPED: resetLiveTime(); break; -#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(26, 0, 0) - case OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED: - setReplayBufferSaved(); - break; -#endif case OBS_FRONTEND_EVENT_TRANSITION_STOPPED: handleTransitionEnd(); break; diff --git a/src/macro-core/macro-condition-replay-buffer.cpp b/src/macro-core/macro-condition-replay-buffer.cpp index 75355770..6eb28295 100644 --- a/src/macro-core/macro-condition-replay-buffer.cpp +++ b/src/macro-core/macro-condition-replay-buffer.cpp @@ -1,5 +1,4 @@ #include "macro-condition-replay-buffer.hpp" -#include "switcher-data.hpp" #include "utility.hpp" namespace advss { @@ -11,35 +10,63 @@ bool MacroConditionReplayBuffer::_registered = MacroConditionFactory::Register( MacroConditionReplayBufferEdit::Create, "AdvSceneSwitcher.condition.replay"}); -const static std::map ReplayBufferStates = { - {ReplayBufferState::STOP, - "AdvSceneSwitcher.condition.replay.state.stopped"}, - {ReplayBufferState::START, - "AdvSceneSwitcher.condition.replay.state.started"}, - {ReplayBufferState::SAVE, - "AdvSceneSwitcher.condition.replay.state.saved"}, +const static std::map + conditions = { + {MacroConditionReplayBuffer::Condition::STOP, + "AdvSceneSwitcher.condition.replay.state.stopped"}, + {MacroConditionReplayBuffer::Condition::START, + "AdvSceneSwitcher.condition.replay.state.started"}, + {MacroConditionReplayBuffer::Condition::SAVE, + "AdvSceneSwitcher.condition.replay.state.saved"}, }; +static bool replayBufferSaved = false; + +static std::chrono::high_resolution_clock::time_point replayBufferSaveTime{}; +static bool setupReplayBufferEventHandler(); +static bool replayBufferEventHandlerIsSetup = setupReplayBufferEventHandler(); + +static bool setupReplayBufferEventHandler() +{ + static auto handleReplayBufferEvent = [](enum obs_frontend_event event, + void *) { + switch (event) { + case OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED: + replayBufferSaveTime = + std::chrono::high_resolution_clock::now(); + break; + default: + break; + }; + }; + obs_frontend_add_event_callback(handleReplayBufferEvent, nullptr); + return true; +} + +bool MacroConditionReplayBuffer::ReplayBufferWasSaved() +{ + bool timersAreInitialized = + _saveTime.time_since_epoch().count() != 0 && + replayBufferSaveTime.time_since_epoch().count() != 0; + bool newSaveOccurred = timersAreInitialized && + _saveTime != replayBufferSaveTime; + _saveTime = replayBufferSaveTime; + return newSaveOccurred; +} + bool MacroConditionReplayBuffer::CheckCondition() { - bool stateMatch = false; switch (_state) { - case ReplayBufferState::STOP: - stateMatch = !obs_frontend_replay_buffer_active(); - break; - case ReplayBufferState::START: - stateMatch = obs_frontend_replay_buffer_active(); - break; - case ReplayBufferState::SAVE: - if (switcher->replayBufferSaved) { - stateMatch = true; - switcher->replayBufferSaved = false; - } - break; + case Condition::STOP: + return !obs_frontend_replay_buffer_active(); + case Condition::START: + return obs_frontend_replay_buffer_active(); + case Condition::SAVE: + return ReplayBufferWasSaved(); default: break; } - return stateMatch; + return false; } bool MacroConditionReplayBuffer::Save(obs_data_t *obj) const @@ -52,37 +79,30 @@ bool MacroConditionReplayBuffer::Save(obs_data_t *obj) const bool MacroConditionReplayBuffer::Load(obs_data_t *obj) { MacroCondition::Load(obj); - _state = static_cast(obs_data_get_int(obj, "state")); + _state = static_cast(obs_data_get_int(obj, "state")); return true; } static inline void populateStateSelection(QComboBox *list) { - for (auto entry : ReplayBufferStates) { + for (const auto &entry : conditions) { list->addItem(obs_module_text(entry.second.c_str())); } } MacroConditionReplayBufferEdit::MacroConditionReplayBufferEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), _state(new QComboBox()) { - _state = new QComboBox(); - QWidget::connect(_state, SIGNAL(currentIndexChanged(int)), this, SLOT(StateChanged(int))); populateStateSelection(_state); - QHBoxLayout *mainLayout = new QHBoxLayout; - - std::unordered_map widgetPlaceholders = { - {"{{state}}", _state}, - }; - + auto layout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.condition.replay.entry"), - mainLayout, widgetPlaceholders); - setLayout(mainLayout); + layout, {{"{{state}}", _state}}); + setLayout(layout); _entryData = entryData; UpdateEntryData(); @@ -96,7 +116,8 @@ void MacroConditionReplayBufferEdit::StateChanged(int value) } auto lock = LockContext(); - _entryData->_state = static_cast(value); + _entryData->_state = + static_cast(value); } void MacroConditionReplayBufferEdit::UpdateEntryData() diff --git a/src/macro-core/macro-condition-replay-buffer.hpp b/src/macro-core/macro-condition-replay-buffer.hpp index 797e49f5..8e34e67a 100644 --- a/src/macro-core/macro-condition-replay-buffer.hpp +++ b/src/macro-core/macro-condition-replay-buffer.hpp @@ -6,12 +6,6 @@ namespace advss { -enum class ReplayBufferState { - STOP, - START, - SAVE, -}; - class MacroConditionReplayBuffer : public MacroCondition { public: MacroConditionReplayBuffer(Macro *m) : MacroCondition(m) {} @@ -24,9 +18,18 @@ public: return std::make_shared(m); } - ReplayBufferState _state = ReplayBufferState::STOP; + enum class Condition { + STOP, + START, + SAVE, + }; + + Condition _state = Condition::STOP; private: + bool ReplayBufferWasSaved(); + + std::chrono::high_resolution_clock::time_point _saveTime = {}; static bool _registered; static const std::string id; }; diff --git a/src/switcher-data.hpp b/src/switcher-data.hpp index f5e02a2c..77722c9c 100644 --- a/src/switcher-data.hpp +++ b/src/switcher-data.hpp @@ -111,7 +111,6 @@ public: bool firstBoot = true; bool transitionActive = false; bool sceneColletionStop = false; - bool replayBufferSaved = false; bool obsIsShuttingDown = false; bool firstInterval = true; bool firstIntervalAfterStop = true;