diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 044e6e3ab..20babccb3 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -279,6 +279,7 @@ struct SimpleOutput : BasicOutputHandler { void UpdateRecording(); bool ConfigureRecording(bool useReplayBuffer); + virtual bool SetupStreaming(obs_service_t *service) override; virtual bool StartStreaming(obs_service_t *service) override; virtual bool StartRecording() override; virtual bool StartReplayBuffer() override; @@ -726,7 +727,7 @@ const char *FindAudioEncoderFromCodec(const char *type) return nullptr; } -bool SimpleOutput::StartStreaming(obs_service_t *service) +bool SimpleOutput::SetupStreaming(obs_service_t *service) { if (!Active()) SetupOutputs(); @@ -820,9 +821,11 @@ bool SimpleOutput::StartStreaming(obs_service_t *service) obs_output_set_video_encoder(streamOutput, h264Streaming); obs_output_set_audio_encoder(streamOutput, aacStreaming, 0); obs_output_set_service(streamOutput, service); + return true; +} - /* --------------------- */ - +bool SimpleOutput::StartStreaming(obs_service_t *service) +{ bool reconnect = config_get_bool(main->Config(), "Output", "Reconnect"); int retryDelay = config_get_uint(main->Config(), "Output", "RetryDelay"); @@ -871,6 +874,7 @@ bool SimpleOutput::StartStreaming(obs_service_t *service) else lastError = string(); + const char *type = obs_service_get_output_type(service); blog(LOG_WARNING, "Stream output type '%s' failed to start!%s%s", type, hasLastError ? " Last Error: " : "", hasLastError ? error : ""); return false; @@ -1064,6 +1068,7 @@ struct AdvancedOutput : BasicOutputHandler { void SetupOutputs() override; int GetAudioBitrate(size_t i) const; + virtual bool SetupStreaming(obs_service_t *service) override; virtual bool StartStreaming(obs_service_t *service) override; virtual bool StartRecording() override; virtual bool StartReplayBuffer() override; @@ -1498,7 +1503,7 @@ int AdvancedOutput::GetAudioBitrate(size_t i) const return FindClosestAvailableAACBitrate(bitrate); } -bool AdvancedOutput::StartStreaming(obs_service_t *service) +bool AdvancedOutput::SetupStreaming(obs_service_t *service) { int streamTrack = config_get_int(main->Config(), "AdvOut", "TrackIndex") - 1; @@ -1600,9 +1605,11 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) obs_output_set_video_encoder(streamOutput, h264Streaming); obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0); + return true; +} - /* --------------------- */ - +bool AdvancedOutput::StartStreaming(obs_service_t *service) +{ obs_output_set_service(streamOutput, service); bool reconnect = config_get_bool(main->Config(), "Output", "Reconnect"); @@ -1651,6 +1658,7 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) else lastError = string(); + const char *type = obs_service_get_output_type(service); blog(LOG_WARNING, "Stream output type '%s' failed to start!%s%s", type, hasLastError ? " Last Error: " : "", hasLastError ? error : ""); return false; diff --git a/UI/window-basic-main-outputs.hpp b/UI/window-basic-main-outputs.hpp index 4aecdd410..802d32b1e 100644 --- a/UI/window-basic-main-outputs.hpp +++ b/UI/window-basic-main-outputs.hpp @@ -36,6 +36,7 @@ struct BasicOutputHandler { virtual ~BasicOutputHandler(){}; + virtual bool SetupStreaming(obs_service_t *service) = 0; virtual bool StartStreaming(obs_service_t *service) = 0; virtual bool StartRecording() = 0; virtual bool StartReplayBuffer() { return false; } diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 16b5960c3..4b430fe0f 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5496,6 +5496,23 @@ void OBSBasic::OpenSceneFilters() #define VIRTUAL_CAM_STOP \ "==== Virtual Camera Stop ===========================================" +void OBSBasic::DisplayStreamStartError() +{ + QString message = !outputHandler->lastError.empty() + ? QTStr(outputHandler->lastError.c_str()) + : QTStr("Output.StartFailedGeneric"); + ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); + ui->streamButton->setEnabled(true); + ui->streamButton->setChecked(false); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } + + QMessageBox::critical(this, QTStr("Output.StartStreamFailed"), message); +} + void OBSBasic::StartStreaming() { if (outputHandler->StreamingActive()) @@ -5503,6 +5520,11 @@ void OBSBasic::StartStreaming() if (disableOutputsRef) return; + if (!outputHandler->SetupStreaming(service)) { + DisplayStreamStartError(); + return; + } + if (api) api->on_event(OBS_FRONTEND_EVENT_STREAMING_STARTING); @@ -5518,21 +5540,7 @@ void OBSBasic::StartStreaming() } if (!outputHandler->StartStreaming(service)) { - QString message = - !outputHandler->lastError.empty() - ? QTStr(outputHandler->lastError.c_str()) - : QTStr("Output.StartFailedGeneric"); - ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); - ui->streamButton->setEnabled(true); - ui->streamButton->setChecked(false); - - if (sysTrayStream) { - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); - } - - QMessageBox::critical(this, QTStr("Output.StartStreamFailed"), - message); + DisplayStreamStartError(); return; } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index c4d3bb777..450811063 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -544,6 +544,8 @@ public slots: void DeferSaveBegin(); void DeferSaveEnd(); + void DisplayStreamStartError(); + void StartStreaming(); void StopStreaming(); void ForceStopStreaming();