static void remove_all_items(struct obs_scene *scene) { struct obs_scene_item *item; DARRAY(struct obs_scene_item*) items; da_init(items); full_lock(scene); item = scene->first_item; while (item) { struct obs_scene_item *del_item = item; item = item->next; remove_without_release(del_item); da_push_back(items, &del_item); } full_unlock(scene); for (size_t i = 0; i < items.num; i++) obs_sceneitem_release(items.array[i]); da_free(items); }
void obs_sceneitem_remove(obs_sceneitem_t item) { obs_scene_t scene; if (!item) return; scene = item->parent; if (scene) pthread_mutex_lock(&scene->mutex); if (item->removed) { if (scene) pthread_mutex_unlock(&scene->mutex); return; } item->removed = true; signal_item_remove(item); detach_sceneitem(item); if (scene) pthread_mutex_unlock(&scene->mutex); obs_sceneitem_release(item); }
static void scene_video_render(void *data, gs_effect_t *effect) { DARRAY(struct obs_scene_item*) remove_items; struct obs_scene *scene = data; struct obs_scene_item *item; da_init(remove_items); video_lock(scene); item = scene->first_item; gs_blend_state_push(); gs_reset_blend_state(); while (item) { if (obs_source_removed(item->source)) { struct obs_scene_item *del_item = item; item = item->next; remove_without_release(del_item); da_push_back(remove_items, &del_item); continue; } if (source_size_changed(item)) update_item_transform(item); if (item->user_visible) { gs_matrix_push(); gs_matrix_mul(&item->draw_transform); obs_source_video_render(item->source); gs_matrix_pop(); } item = item->next; } gs_blend_state_pop(); video_unlock(scene); for (size_t i = 0; i < remove_items.num; i++) obs_sceneitem_release(remove_items.array[i]); da_free(remove_items); UNUSED_PARAMETER(effect); }
static void scene_enum_sources(void *data, obs_source_enum_proc_t enum_callback, void *param) { struct obs_scene *scene = data; struct obs_scene_item *item; struct obs_scene_item *next; full_lock(scene); item = scene->first_item; while (item) { next = item->next; obs_sceneitem_addref(item); if (os_atomic_load_long(&item->active_refs) > 0) enum_callback(scene->source, item->source, param); obs_sceneitem_release(item); item = next; } full_unlock(scene); }
void obs_scene_enum_items(obs_scene_t scene, bool (*callback)(obs_scene_t, obs_sceneitem_t, void*), void *param) { struct obs_scene_item *item; pthread_mutex_lock(&scene->mutex); item = scene->first_item; while (item) { struct obs_scene_item *next = item->next; obs_sceneitem_addref(item); if (!callback(scene, item, param)) break; obs_sceneitem_release(item); item = next; } pthread_mutex_unlock(&scene->mutex); }