UI: Add preload callbacks to frontend API

Allows loading data before actually loading any scene data.
This commit is contained in:
jp9000 2017-12-25 13:23:39 -08:00
parent 260fb571b8
commit 5645c02c8f
5 changed files with 61 additions and 4 deletions

View file

@ -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

View file

@ -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())

View file

@ -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);

View file

@ -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;
};

View file

@ -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())