Browse Source

frontend: Restart multitrack output if stream key has become invalid

Dennis Sädtler 1 year ago
parent
commit
7e24a6093c

+ 12 - 2
frontend/utility/MultitrackVideoOutput.cpp

@@ -292,6 +292,9 @@ void MultitrackVideoOutput::PrepareStreaming(QWidget *parent, const char *servic
 			return;
 		}
 	}
+
+	restart_on_error = false;
+
 	std::optional<GoLiveApi::Config> go_live_config;
 	std::optional<GoLiveApi::Config> custom;
 	bool is_custom_config = custom_config.has_value();
@@ -456,6 +459,8 @@ void MultitrackVideoOutput::StartedStreaming()
 
 void MultitrackVideoOutput::StopStreaming()
 {
+	restart_on_error = false;
+
 	OBSOutputAutoRelease current_output;
 	{
 		const std::lock_guard current_lock{current_mutex};
@@ -765,8 +770,7 @@ void SetupSignalHandlers(bool recording, MultitrackVideoOutput *self, obs_output
 {
 	auto handler = obs_output_get_signal_handler(output);
 
-	if (recording)
-		start.Connect(handler, "start", RecordingStartHandler, self);
+	start.Connect(handler, "start", !recording ? StreamStartHandler : RecordingStartHandler, self);
 
 	stop.Connect(handler, "stop", !recording ? StreamStopHandler : RecordingStopHandler, self);
 }
@@ -797,6 +801,12 @@ void MultitrackVideoOutput::ReleaseOnMainThread(std::optional<OBSOutputObjects>
 		QApplication::instance()->thread(), [objects = std::move(objects)] {}, Qt::QueuedConnection);
 }
 
+void StreamStartHandler(void *arg, calldata_t *)
+{
+	auto self = static_cast<MultitrackVideoOutput *>(arg);
+	self->restart_on_error = true;
+}
+
 void StreamStopHandler(void *arg, calldata_t *data)
 {
 	auto self = static_cast<MultitrackVideoOutput *>(arg);

+ 6 - 0
frontend/utility/MultitrackVideoOutput.hpp

@@ -14,6 +14,7 @@
 class QString;
 class QWidget;
 
+void StreamStartHandler(void *arg, calldata_t *);
 void StreamStopHandler(void *arg, calldata_t *data);
 
 void RecordingStartHandler(void *arg, calldata_t *data);
@@ -41,6 +42,8 @@ public:
 		return current ? obs_output_get_ref(current->output_) : nullptr;
 	}
 
+	bool RestartOnError() { return restart_on_error; }
+
 private:
 	struct OBSOutputObjects {
 		OBSOutputAutoRelease output_;
@@ -61,6 +64,9 @@ private:
 	std::mutex current_stream_dump_mutex;
 	std::optional<OBSOutputObjects> current_stream_dump;
 
+	bool restart_on_error = false;
+
+	friend void StreamStartHandler(void *arg, calldata_t *data);
 	friend void StreamStopHandler(void *arg, calldata_t *data);
 	friend void RecordingStartHandler(void *arg, calldata_t *data);
 	friend void RecordingStopHandler(void *arg, calldata_t *);

+ 10 - 0
frontend/widgets/OBSBasic_Streaming.cpp

@@ -281,6 +281,14 @@ void OBSBasic::StreamingStop(int code, QString last_error)
 	DStr errorMessage;
 	bool use_last_error = false;
 	bool encode_error = false;
+	bool should_reconnect = false;
+
+	/* Ignore stream key error for multitrack output if its internal reconnect handling is active. */
+	if (code == OBS_OUTPUT_INVALID_STREAM && outputHandler->multitrackVideo &&
+	    outputHandler->multitrackVideo->RestartOnError()) {
+		code = OBS_OUTPUT_SUCCESS;
+		should_reconnect = true;
+	}
 
 	switch (code) {
 	case OBS_OUTPUT_BAD_PATH:
@@ -358,6 +366,8 @@ void OBSBasic::StreamingStop(int code, QString last_error)
 	// Reset broadcast button state/text
 	if (!broadcastActive)
 		SetBroadcastFlowEnabled(auth && auth->broadcastFlow());
+	if (should_reconnect)
+		QMetaObject::invokeMethod(this, "StartStreaming", Qt::QueuedConnection);
 }
 
 void OBSBasic::StreamActionTriggered()