From 10fc206f98d79a03d44345a0072cc1e2e9c8145c Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 7 Mar 2018 16:27:43 -0800 Subject: [PATCH] libobs: Refactor obs_scene_add to allow adding internally Allows using obs_scene_add_internal to add without sending signals. --- libobs/obs-scene.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 2b7a7f016..c9baa2a4a 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -1338,12 +1338,11 @@ static inline bool source_has_audio(obs_source_t *source) (OBS_SOURCE_AUDIO | OBS_SOURCE_COMPOSITE)) != 0; } -obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) +static obs_sceneitem_t *obs_scene_add_internal(obs_scene_t *scene, + obs_source_t *source, obs_sceneitem_t *insert_after) { struct obs_scene_item *last; struct obs_scene_item *item; - struct calldata params; - uint8_t stack[128]; pthread_mutex_t mutex; struct item_action action = { @@ -1403,15 +1402,23 @@ obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) full_lock(scene); - last = scene->first_item; - if (!last) { - scene->first_item = item; + if (insert_after) { + obs_sceneitem_t *next = insert_after->next; + if (next) next->prev = item; + item->next = insert_after->next; + item->prev = insert_after; + insert_after->next = item; } else { - while (last->next) - last = last->next; + last = scene->first_item; + if (!last) { + scene->first_item = item; + } else { + while (last->next) + last = last->next; - last->next = item; - item->prev = last; + last->next = item; + item->prev = last; + } } full_unlock(scene); @@ -1419,12 +1426,20 @@ obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) if (!scene->source->context.private) init_hotkeys(scene, item, obs_source_get_name(source)); + return item; +} + +obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) +{ + obs_sceneitem_t *item = obs_scene_add_internal(scene, source, NULL); + struct calldata params; + uint8_t stack[128]; + calldata_init_fixed(¶ms, stack, sizeof(stack)); calldata_set_ptr(¶ms, "scene", scene); calldata_set_ptr(¶ms, "item", item); signal_handler_signal(scene->source->context.signals, "item_add", ¶ms); - return item; }