Add conditions "stream starting" and "stream stopping"

This commit is contained in:
WarmUpTill
2021-10-31 11:55:17 +01:00
committed by WarmUpTill
parent 7459793fe3
commit 4b17314c66
5 changed files with 50 additions and 0 deletions

View File

@@ -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"

View File

@@ -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;
}

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -13,11 +13,21 @@ bool MacroConditionStream::_registered = MacroConditionFactory::Register(
static std::map<StreamState, std::string> 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;
}