Browse Source

UI: Add preload callbacks to frontend API

Allows loading data before actually loading any scene data.
jp9000 8 years ago
parent
commit
5645c02c8f

+ 30 - 0
UI/api-interface.cpp

@@ -49,6 +49,7 @@ struct OBSStudioAPI : obs_frontend_callbacks {
 	OBSBasic *main;
 	vector<OBSStudioCallback<obs_frontend_event_cb>> callbacks;
 	vector<OBSStudioCallback<obs_frontend_save_cb>> saveCallbacks;
+	vector<OBSStudioCallback<obs_frontend_save_cb>> 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

+ 14 - 0
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())

+ 5 - 0
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);
 

+ 6 - 0
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;
 };

+ 6 - 4
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())