From 14a6673e2f1d4ea82a6570b2fcf0ac8a25638426 Mon Sep 17 00:00:00 2001 From: derrod Date: Sat, 13 May 2023 17:19:00 +0200 Subject: [PATCH] UI: Reset VCam when clearing scene data --- UI/window-basic-main-outputs.cpp | 10 ++++++++-- UI/window-basic-main-outputs.hpp | 1 + UI/window-basic-main.cpp | 10 +++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 737ab966d..5f88ea3a4 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -348,6 +348,7 @@ void BasicOutputHandler::UpdateVirtualCamOutputSource() switch (main->vcamConfig.type) { case VCamOutputType::InternalOutput: + DestroyVirtualCameraScene(); switch (main->vcamConfig.internal) { case VCamInternalType::Default: source = obs_get_output_source(0); @@ -360,10 +361,11 @@ void BasicOutputHandler::UpdateVirtualCamOutputSource() } break; case VCamOutputType::SceneOutput: + DestroyVirtualCameraScene(); source = obs_get_source_by_name(main->vcamConfig.scene.c_str()); break; case VCamOutputType::SourceOutput: - OBSSource s = + OBSSourceAutoRelease s = obs_get_source_by_name(main->vcamConfig.source.c_str()); if (!vCamSourceScene) @@ -380,7 +382,6 @@ void BasicOutputHandler::UpdateVirtualCamOutputSource() if (!vCamSourceSceneItem) { vCamSourceSceneItem = obs_scene_add(vCamSourceScene, s); - obs_source_release(s); obs_sceneitem_set_bounds_type(vCamSourceSceneItem, OBS_BOUNDS_SCALE_INNER); @@ -410,6 +411,11 @@ void BasicOutputHandler::DestroyVirtualCamView() obs_view_destroy(virtualCamView); virtualCamView = nullptr; + DestroyVirtualCameraScene(); +} + +void BasicOutputHandler::DestroyVirtualCameraScene() +{ if (!vCamSourceScene) return; diff --git a/UI/window-basic-main-outputs.hpp b/UI/window-basic-main-outputs.hpp index a67a563e9..80d580e19 100644 --- a/UI/window-basic-main-outputs.hpp +++ b/UI/window-basic-main-outputs.hpp @@ -64,6 +64,7 @@ struct BasicOutputHandler { virtual void UpdateVirtualCamOutputSource(); virtual void DestroyVirtualCamView(); + virtual void DestroyVirtualCameraScene(); inline bool Active() const { diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 86a6e3b0f..6874aa111 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1280,7 +1280,7 @@ retryScene: disableSaving--; - if (vcamEnabled && vcamConfig.internal == VCamInternalType::Preview) + if (vcamEnabled) outputHandler->UpdateVirtualCamOutputSource(); if (api) { @@ -4857,6 +4857,14 @@ void OBSBasic::ClearSceneData() for (int i = 0; i < MAX_CHANNELS; i++) obs_set_output_source(i, nullptr); + /* Reset VCam to default to clear its private scene and any references + * it holds. It will be reconfigured during loading. */ + if (vcamEnabled) { + vcamConfig.type = VCamOutputType::InternalOutput; + vcamConfig.internal = VCamInternalType::Default; + outputHandler->UpdateVirtualCamOutputSource(); + } + lastScene = nullptr; swapScene = nullptr; programScene = nullptr;