Explorar o código

UI: Reset VCam when clearing scene data

derrod %!s(int64=2) %!d(string=hai) anos
pai
achega
dfc35603cf

+ 8 - 2
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;
 

+ 1 - 0
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
 	{

+ 9 - 1
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;