From 4b17314c66a0a60efd1482808b5514d3edd8e0a5 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 31 Oct 2021 11:55:17 +0100 Subject: [PATCH] Add conditions "stream starting" and "stream stopping" --- data/locale/en-US.ini | 2 ++ src/advanced-scene-switcher.cpp | 18 ++++++++++++++++++ src/headers/macro-condition-streaming.hpp | 5 +++++ src/headers/switcher-data-structs.hpp | 2 ++ src/macro-condition-streaming.cpp | 23 +++++++++++++++++++++++ 5 files changed, 50 insertions(+) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 2b2f035d..4b12cd20 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -140,6 +140,8 @@ AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduce CPU lo AdvSceneSwitcher.condition.stream="Streaming" AdvSceneSwitcher.condition.stream.state.start="Stream running" AdvSceneSwitcher.condition.stream.state.stop="Stream stopped" +AdvSceneSwitcher.condition.stream.state.starting="Stream starting" +AdvSceneSwitcher.condition.stream.state.stopping="Stream stopping" AdvSceneSwitcher.condition.stream.entry="{{streamState}}" AdvSceneSwitcher.condition.record="Recording" AdvSceneSwitcher.condition.record.state.start="Recording running" diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index a0d5e17f..ad997d52 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -566,6 +566,18 @@ void setTranstionEnd() std::chrono::high_resolution_clock::now(); } +void setStreamStarting() +{ + switcher->lastStreamStartingTime = + std::chrono::high_resolution_clock::now(); +} + +void setStreamStopping() +{ + switcher->lastStreamStoppingTime = + std::chrono::high_resolution_clock::now(); +} + // Note to future self: // be careful using switcher->m here as there is potential for deadlocks when using // frontend functions such as obs_frontend_set_current_scene() @@ -605,6 +617,12 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher) case OBS_FRONTEND_EVENT_TRANSITION_STOPPED: setTranstionEnd(); break; + case OBS_FRONTEND_EVENT_STREAMING_STARTING: + setStreamStarting(); + break; + case OBS_FRONTEND_EVENT_STREAMING_STOPPING: + setStreamStopping(); + break; default: break; } diff --git a/src/headers/macro-condition-streaming.hpp b/src/headers/macro-condition-streaming.hpp index 845823f9..39b8c9d8 100644 --- a/src/headers/macro-condition-streaming.hpp +++ b/src/headers/macro-condition-streaming.hpp @@ -6,6 +6,8 @@ enum class StreamState { STOP, START, + STARTING, + STOPPING, }; class MacroConditionStream : public MacroCondition { @@ -22,6 +24,9 @@ public: StreamState _streamState; private: + std::chrono::high_resolution_clock::time_point _lastStreamStartingTime{}; + std::chrono::high_resolution_clock::time_point _lastStreamStoppingTime{}; + static bool _registered; static const std::string id; }; diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index 20f16fe3..60f0db67 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -82,6 +82,8 @@ struct SwitcherData { OBSWeakSource previousScene = nullptr; std::chrono::high_resolution_clock::time_point lastSceneChangeTime{}; std::chrono::high_resolution_clock::time_point lastTransitionEndTime{}; + std::chrono::high_resolution_clock::time_point lastStreamStartingTime{}; + std::chrono::high_resolution_clock::time_point lastStreamStoppingTime{}; OBSWeakSource lastRandomScene; SceneGroup *lastRandomSceneGroup; OBSWeakSource nonMatchingScene; diff --git a/src/macro-condition-streaming.cpp b/src/macro-condition-streaming.cpp index a975a33f..d6dee98f 100644 --- a/src/macro-condition-streaming.cpp +++ b/src/macro-condition-streaming.cpp @@ -13,11 +13,21 @@ bool MacroConditionStream::_registered = MacroConditionFactory::Register( static std::map streamStates = { {StreamState::STOP, "AdvSceneSwitcher.condition.stream.state.stop"}, {StreamState::START, "AdvSceneSwitcher.condition.stream.state.start"}, + {StreamState::STARTING, + "AdvSceneSwitcher.condition.stream.state.starting"}, + {StreamState::STOPPING, + "AdvSceneSwitcher.condition.stream.state.stopping"}, }; bool MacroConditionStream::CheckCondition() { bool stateMatch = false; + + bool streamStarting = switcher->lastStreamStartingTime != + _lastStreamStartingTime; + bool streamStopping = switcher->lastStreamStoppingTime != + _lastStreamStoppingTime; + switch (_streamState) { case StreamState::STOP: stateMatch = !obs_frontend_streaming_active(); @@ -25,9 +35,22 @@ bool MacroConditionStream::CheckCondition() case StreamState::START: stateMatch = obs_frontend_streaming_active(); break; + case StreamState::STARTING: + stateMatch = streamStarting; + break; + case StreamState::STOPPING: + stateMatch = streamStopping; + break; default: break; } + + if (streamStarting) { + _lastStreamStartingTime = switcher->lastStreamStartingTime; + } + if (streamStopping) { + _lastStreamStoppingTime = switcher->lastStreamStoppingTime; + } return stateMatch; }