frontend: Restart multitrack output if stream key has become invalid

This commit is contained in:
Dennis Sädtler 2024-09-23 12:45:04 +02:00 • committed by Ryan Foster
commit 7e24a6093c
3 changed files with 28 additions and 2 deletions

View file

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

View file

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

View file

@ -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()