frontend: Restart multitrack output if stream key has become invalid
This commit is contained in:
parent
d026c871e0
commit
7e24a6093c
3 changed files with 28 additions and 2 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue