Browse Source

UI: Fix bugs with missing files refactor

With https://github.com/obsproject/obs-studio/pull/5148, it was
brought up that the loading of the missing files was not thread
safe, as the missing files were being loaded late in the loading
process. This PR tries to fix that problem, while still simplifying
the original missing files code.
Clayton Groeneveld 3 years ago
parent
commit
aae15fc497
3 changed files with 32 additions and 32 deletions
  1. 2 1
      UI/window-basic-main-transitions.cpp
  2. 27 30
      UI/window-basic-main.cpp
  3. 3 1
      UI/window-basic-main.hpp

+ 2 - 1
UI/window-basic-main-transitions.cpp

@@ -1765,7 +1765,8 @@ obs_data_array_t *OBSBasic::SaveTransitions()
 	return transitions;
 	return transitions;
 }
 }
 
 
-void OBSBasic::LoadTransitions(obs_data_array_t *transitions)
+void OBSBasic::LoadTransitions(obs_data_array_t *transitions,
+			       obs_load_source_cb cb, void *private_data)
 {
 {
 	size_t count = obs_data_array_count(transitions);
 	size_t count = obs_data_array_count(transitions);
 
 

+ 27 - 30
UI/window-basic-main.cpp

@@ -956,6 +956,15 @@ void OBSBasic::Load(const char *file)
 	LoadData(data, file);
 	LoadData(data, file);
 }
 }
 
 
+static inline void AddMissingFiles(void *data, obs_source_t *source)
+{
+	obs_missing_files_t *f = (obs_missing_files_t *)data;
+	obs_missing_files_t *sf = obs_source_get_missing_files(source);
+
+	obs_missing_files_append(f, sf);
+	obs_missing_files_destroy(sf);
+}
+
 void OBSBasic::LoadData(obs_data_t *data, const char *file)
 void OBSBasic::LoadData(obs_data_t *data, const char *file)
 {
 {
 	ClearSceneData();
 	ClearSceneData();
@@ -1024,10 +1033,11 @@ void OBSBasic::LoadData(obs_data_t *data, const char *file)
 		obs_data_array_push_back_array(sources, groups);
 		obs_data_array_push_back_array(sources, groups);
 	}
 	}
 
 
-	obs_load_sources(sources, nullptr, nullptr);
+	obs_missing_files_t *files = obs_missing_files_create();
+	obs_load_sources(sources, AddMissingFiles, files);
 
 
 	if (transitions)
 	if (transitions)
-		LoadTransitions(transitions);
+		LoadTransitions(transitions, AddMissingFiles, files);
 	if (sceneOrder)
 	if (sceneOrder)
 		LoadSceneListOrder(sceneOrder);
 		LoadSceneListOrder(sceneOrder);
 
 
@@ -1149,7 +1159,7 @@ retryScene:
 	LogScenes();
 	LogScenes();
 
 
 	if (!App()->IsMissingFilesCheckDisabled())
 	if (!App()->IsMissingFilesCheckDisabled())
-		on_actionShowMissingFiles_triggered();
+		ShowMissingFilesDialog(files);
 
 
 	disableSaving--;
 	disableSaving--;
 
 
@@ -4854,34 +4864,8 @@ void OBSBasic::on_action_Settings_triggered()
 	}
 	}
 }
 }
 
 
-static inline void AddMissingFiles(void *data, obs_source_t *source)
-{
-	obs_missing_files_t *f = (obs_missing_files_t *)data;
-	obs_missing_files_t *sf = obs_source_get_missing_files(source);
-
-	obs_missing_files_append(f, sf);
-	obs_missing_files_destroy(sf);
-}
-
-void OBSBasic::on_actionShowMissingFiles_triggered()
+void OBSBasic::ShowMissingFilesDialog(obs_missing_files_t *files)
 {
 {
-	obs_missing_files_t *files = obs_missing_files_create();
-
-	auto cb_sources = [](void *data, obs_source_t *source) {
-		AddMissingFiles(data, source);
-		return true;
-	};
-	obs_enum_sources(cb_sources, files);
-
-	auto cb_transitions = [](void *data, obs_source_t *source) {
-		if (obs_source_get_type(source) != OBS_SOURCE_TYPE_TRANSITION)
-			return true;
-
-		AddMissingFiles(data, source);
-		return true;
-	};
-	obs_enum_all_sources(cb_transitions, files);
-
 	if (obs_missing_files_count(files) > 0) {
 	if (obs_missing_files_count(files) > 0) {
 		/* When loading the missing files dialog on launch, the
 		/* When loading the missing files dialog on launch, the
 		* window hasn't fully initialized by this point on macOS,
 		* window hasn't fully initialized by this point on macOS,
@@ -4904,6 +4888,19 @@ void OBSBasic::on_actionShowMissingFiles_triggered()
 	}
 	}
 }
 }
 
 
+void OBSBasic::on_actionShowMissingFiles_triggered()
+{
+	obs_missing_files_t *files = obs_missing_files_create();
+
+	auto cb_sources = [](void *data, obs_source_t *source) {
+		AddMissingFiles(data, source);
+		return true;
+	};
+
+	obs_enum_all_sources(cb_sources, files);
+	ShowMissingFilesDialog(files);
+}
+
 void OBSBasic::on_actionAdvAudioProperties_triggered()
 void OBSBasic::on_actionAdvAudioProperties_triggered()
 {
 {
 	if (advAudioWindow != nullptr) {
 	if (advAudioWindow != nullptr) {

+ 3 - 1
UI/window-basic-main.hpp

@@ -446,7 +446,8 @@ private:
 	obs_source_t *FindTransition(const char *name);
 	obs_source_t *FindTransition(const char *name);
 	OBSSource GetCurrentTransition();
 	OBSSource GetCurrentTransition();
 	obs_data_array_t *SaveTransitions();
 	obs_data_array_t *SaveTransitions();
-	void LoadTransitions(obs_data_array_t *transitions);
+	void LoadTransitions(obs_data_array_t *transitions,
+			     obs_load_source_cb cb, void *private_data);
 
 
 	obs_source_t *fadeTransition;
 	obs_source_t *fadeTransition;
 	obs_source_t *cutTransition;
 	obs_source_t *cutTransition;
@@ -621,6 +622,7 @@ private:
 	bool drawSafeAreas = false;
 	bool drawSafeAreas = false;
 
 
 	void CenterSelectedSceneItems(const CenterType &centerType);
 	void CenterSelectedSceneItems(const CenterType &centerType);
+	void ShowMissingFilesDialog(obs_missing_files_t *files);
 
 
 public slots:
 public slots:
 	void DeferSaveBegin();
 	void DeferSaveBegin();