diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index bc5c12b3b..dd17db0b8 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -49,6 +49,7 @@ struct OBSStudioAPI : obs_frontend_callbacks { OBSBasic *main; vector> callbacks; vector> saveCallbacks; + vector> preloadCallbacks; inline OBSStudioAPI(OBSBasic *main_) : main(main_) {} @@ -348,6 +349,26 @@ struct OBSStudioAPI : obs_frontend_callbacks { saveCallbacks.erase(saveCallbacks.begin() + idx); } + void obs_frontend_add_preload_callback(obs_frontend_save_cb callback, + void *private_data) override + { + size_t idx = GetCallbackIdx(preloadCallbacks, callback, + private_data); + if (idx == (size_t)-1) + preloadCallbacks.emplace_back(callback, private_data); + } + + void obs_frontend_remove_preload_callback(obs_frontend_save_cb callback, + void *private_data) override + { + size_t idx = GetCallbackIdx(preloadCallbacks, callback, + private_data); + if (idx == (size_t)-1) + return; + + preloadCallbacks.erase(preloadCallbacks.begin() + idx); + } + void obs_frontend_push_ui_translation( obs_frontend_translate_ui_cb translate) override { @@ -409,6 +430,15 @@ struct OBSStudioAPI : obs_frontend_callbacks { { for (auto cb : saveCallbacks) cb.callback(settings, false, cb.private_data); + } + } + + void on_preload(obs_data_t *settings) override + { + for (size_t i = preloadCallbacks.size(); i > 0; i--) { + auto cb = preloadCallbacks[i - 1]; + cb.callback(settings, false, cb.private_data); + } } void on_save(obs_data_t *settings) override diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp index c86a51333..9c1b421d6 100644 --- a/UI/obs-frontend-api/obs-frontend-api.cpp +++ b/UI/obs-frontend-api/obs-frontend-api.cpp @@ -311,6 +311,20 @@ void obs_frontend_remove_save_callback(obs_frontend_save_cb callback, c->obs_frontend_remove_save_callback(callback, private_data); } +void obs_frontend_add_preload_callback(obs_frontend_save_cb callback, + void *private_data) +{ + if (callbacks_valid()) + c->obs_frontend_add_preload_callback(callback, private_data); +} + +void obs_frontend_remove_preload_callback(obs_frontend_save_cb callback, + void *private_data) +{ + if (callbacks_valid()) + c->obs_frontend_remove_preload_callback(callback, private_data); +} + void obs_frontend_push_ui_translation(obs_frontend_translate_ui_cb translate) { if (callbacks_valid()) diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h index 51dd05930..9fe925692 100644 --- a/UI/obs-frontend-api/obs-frontend-api.h +++ b/UI/obs-frontend-api/obs-frontend-api.h @@ -135,6 +135,11 @@ EXPORT obs_output_t *obs_frontend_get_replay_buffer_output(void); EXPORT config_t *obs_frontend_get_profile_config(void); EXPORT config_t *obs_frontend_get_global_config(void); +EXPORT void obs_frontend_add_preload_callback(obs_frontend_save_cb callback, + void *private_data); +EXPORT void obs_frontend_remove_preload_callback(obs_frontend_save_cb callback, + void *private_data); + typedef bool (*obs_frontend_translate_ui_cb)(const char *text, const char **out); diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp index 805856857..575753d9a 100644 --- a/UI/obs-frontend-api/obs-frontend-internal.hpp +++ b/UI/obs-frontend-api/obs-frontend-internal.hpp @@ -67,6 +67,11 @@ struct obs_frontend_callbacks { virtual void obs_frontend_remove_save_callback( obs_frontend_save_cb callback, void *private_data)=0; + virtual void obs_frontend_add_preload_callback( + obs_frontend_save_cb callback, void *private_data)=0; + virtual void obs_frontend_remove_preload_callback( + obs_frontend_save_cb callback, void *private_data)=0; + virtual void obs_frontend_push_ui_translation( obs_frontend_translate_ui_cb translate)=0; virtual void obs_frontend_pop_ui_translation(void)=0; @@ -83,6 +88,7 @@ struct obs_frontend_callbacks { virtual void obs_frontend_set_current_preview_scene(obs_source_t *scene)=0; virtual void on_load(obs_data_t *settings)=0; + virtual void on_preload(obs_data_t *settings)=0; virtual void on_save(obs_data_t *settings)=0; virtual void on_event(enum obs_frontend_event event)=0; }; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index a32c8c6d9..3ebe2c30b 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -762,6 +762,10 @@ void OBSBasic::Load(const char *file) ClearSceneData(); InitDefaultTransitions(); + obs_data_t *modulesObj = obs_data_get_obj(data, "modules"); + if (api) + api->on_preload(modulesObj); + obs_data_array_t *sceneOrder = obs_data_get_array(data, "scene_order"); obs_data_array_t *sources = obs_data_get_array(data, "sources"); obs_data_array_t *transitions= obs_data_get_array(data, "transitions"); @@ -925,12 +929,10 @@ retryScene: /* ---------------------- */ - if (api) { - obs_data_t *modulesObj = obs_data_get_obj(data, "modules"); + if (api) api->on_load(modulesObj); - obs_data_release(modulesObj); - } + obs_data_release(modulesObj); obs_data_release(data); if (!opt_starting_scene.empty())