From aae15fc497fa63495bd99ee24ca8d4dd715d3ca2 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Wed, 20 Jul 2022 03:44:43 -0500 Subject: [PATCH] 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. --- UI/window-basic-main-transitions.cpp | 3 +- UI/window-basic-main.cpp | 57 +++++++++++++--------------- UI/window-basic-main.hpp | 4 +- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index 8a8d709fe..a82e7b8b8 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -1765,7 +1765,8 @@ obs_data_array_t *OBSBasic::SaveTransitions() 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); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 7736e03bf..e9cf9075c 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -956,6 +956,15 @@ void OBSBasic::Load(const char *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) { ClearSceneData(); @@ -1024,10 +1033,11 @@ void OBSBasic::LoadData(obs_data_t *data, const char *file) 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) - LoadTransitions(transitions); + LoadTransitions(transitions, AddMissingFiles, files); if (sceneOrder) LoadSceneListOrder(sceneOrder); @@ -1149,7 +1159,7 @@ retryScene: LogScenes(); if (!App()->IsMissingFilesCheckDisabled()) - on_actionShowMissingFiles_triggered(); + ShowMissingFilesDialog(files); disableSaving--; @@ -4854,34 +4864,8 @@ void OBSBasic::on_action_Settings_triggered() } } -static inline void AddMissingFiles(void *data, obs_source_t *source) +void OBSBasic::ShowMissingFilesDialog(obs_missing_files_t *files) { - 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() -{ - 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) { /* When loading the missing files dialog on launch, the * 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() { if (advAudioWindow != nullptr) { diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index d16dad7cd..3dee95a4a 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -446,7 +446,8 @@ private: obs_source_t *FindTransition(const char *name); OBSSource GetCurrentTransition(); 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 *cutTransition; @@ -621,6 +622,7 @@ private: bool drawSafeAreas = false; void CenterSelectedSceneItems(const CenterType ¢erType); + void ShowMissingFilesDialog(obs_missing_files_t *files); public slots: void DeferSaveBegin();