From 218b936b1dae5daf20edcb82484891665ce7c7fc Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Sep 2020 05:19:08 -0700 Subject: [PATCH] UI: Fix crash when starting vcam before other outputs The BasicOutputHandler::Active() function was used for checking whether outputs had started or not. However, the virtual camera is not used in the subclasses; instead it's a part of the base class. Because of that fact, when the virtual camera is started, the procedures used to start up the other outputs are never called, causing outputs to crash because they hadn't been initialized properly. For example, starting the virtual camera, then starting stream/recording would crash. So, as a simple fix to this, when checking the active status in the derived classes, do not factor in the virtual camera. --- UI/window-basic-main-outputs.cpp | 10 +++++----- UI/window-basic-main-outputs.hpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 708cb270a..a4e44d192 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -725,7 +725,7 @@ const char *FindAudioEncoderFromCodec(const char *type) bool SimpleOutput::StartStreaming(obs_service_t *service) { - if (!Active()) + if (!Active(false)) SetupOutputs(); Auth *auth = main->GetAuth(); @@ -885,7 +885,7 @@ void SimpleOutput::UpdateRecording() Update(); } - if (!Active()) + if (!Active(false)) SetupOutputs(); if (!ffmpegOutput) { @@ -1507,7 +1507,7 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) UpdateAudioSettings(); - if (!Active()) + if (!Active(false)) SetupOutputs(); Auth *auth = main->GetAuth(); @@ -1671,7 +1671,7 @@ bool AdvancedOutput::StartRecording() UpdateAudioSettings(); - if (!Active()) + if (!Active(false)) SetupOutputs(); if (!ffmpegOutput || ffmpegRecording) { @@ -1740,7 +1740,7 @@ bool AdvancedOutput::StartReplayBuffer() UpdateAudioSettings(); - if (!Active()) + if (!Active(false)) SetupOutputs(); if (!ffmpegOutput || ffmpegRecording) { diff --git a/UI/window-basic-main-outputs.hpp b/UI/window-basic-main-outputs.hpp index dc8b77f9a..8988d132b 100644 --- a/UI/window-basic-main-outputs.hpp +++ b/UI/window-basic-main-outputs.hpp @@ -51,10 +51,10 @@ struct BasicOutputHandler { virtual void Update() = 0; - inline bool Active() const + inline bool Active(bool check_vcam = true) const { return streamingActive || recordingActive || delayActive || - replayBufferActive || virtualCamActive; + replayBufferActive || (check_vcam && virtualCamActive); } };