void obs_source_filter_add(obs_source_t source, obs_source_t filter) { if (!source || !filter) return; pthread_mutex_lock(&source->filter_mutex); if (da_find(source->filters, &filter, 0) != DARRAY_INVALID) { blog(LOG_WARNING, "Tried to add a filter that was already " "present on the source"); return; } if (source->filters.num) { obs_source_t *back = da_end(source->filters); (*back)->filter_target = filter; } da_push_back(source->filters, &filter); pthread_mutex_unlock(&source->filter_mutex); filter->filter_parent = source; filter->filter_target = source; }
void obs_source_remove(obs_source_t source) { struct obs_core_data *data = &obs->data; size_t id; bool exists; pthread_mutex_lock(&data->sources_mutex); if (!source || source->removed) { pthread_mutex_unlock(&data->sources_mutex); return; } source->removed = true; obs_source_addref(source); id = da_find(data->user_sources, &source, 0); exists = (id != DARRAY_INVALID); if (exists) { da_erase(data->user_sources, id); obs_source_release(source); } pthread_mutex_unlock(&data->sources_mutex); if (exists) obs_source_dosignal(source, "source_remove", "remove"); obs_source_release(source); }
void obs_source_filter_remove(obs_source_t source, obs_source_t filter) { size_t idx; if (!source || !filter) return; pthread_mutex_lock(&source->filter_mutex); idx = da_find(source->filters, &filter, 0); if (idx == DARRAY_INVALID) return; if (idx > 0) { obs_source_t prev = source->filters.array[idx-1]; prev->filter_target = filter->filter_target; } da_erase(source->filters, idx); pthread_mutex_unlock(&source->filter_mutex); filter->filter_parent = NULL; filter->filter_target = NULL; }
void obs_source_remove(obs_source_t source) { struct obs_program_data *data = &obs->data; size_t id; pthread_mutex_lock(&data->sources_mutex); if (!source || source->removed) return; source->removed = true; obs_source_addref(source); id = da_find(data->sources, &source, 0); if (id != DARRAY_INVALID) { da_erase_item(data->sources, &source); obs_source_release(source); } pthread_mutex_unlock(&data->sources_mutex); obs_source_dosignal(source, "source-remove"); obs_source_release(source); }
static void push_audio_tree(obs_source_t *parent, obs_source_t *source, void *p) { struct obs_core_audio *audio = p; if (da_find(audio->render_order, &source, 0) == DARRAY_INVALID) { obs_source_addref(source); da_push_back(audio->render_order, &source); } UNUSED_PARAMETER(parent); }
void da_add(struct da *da, const char *str, int len) { int i; int prev_idx = 1; for (i = 0; i < len; i++) { int idx = da_find(da, (const unsigned char *)str, i + 1); if (idx == 0) { idx = do_add(da, prev_idx, str[i]); } prev_idx = idx; } }
void obs_source_remove(obs_source_t source) { struct obs_data *data = &obs->data; size_t id; source->removed = true; pthread_mutex_lock(&data->sources_mutex); id = da_find(data->sources, &source, 0); if (id != DARRAY_INVALID) { da_erase_item(data->sources, &source); obs_source_release(source); } pthread_mutex_unlock(&data->sources_mutex); }
void obs_source_filter_setorder(obs_source_t source, obs_source_t filter, enum order_movement movement) { size_t idx, i; if (!source || !filter) return; idx = da_find(source->filters, &filter, 0); if (idx == DARRAY_INVALID) return; if (movement == ORDER_MOVE_UP) { if (idx == source->filters.num-1) return; da_move_item(source->filters, idx, idx+1); } else if (movement == ORDER_MOVE_DOWN) { if (idx == 0) return; da_move_item(source->filters, idx, idx-1); } else if (movement == ORDER_MOVE_TOP) { if (idx == source->filters.num-1) return; da_move_item(source->filters, idx, source->filters.num-1); } else if (movement == ORDER_MOVE_BOTTOM) { if (idx == 0) return; da_move_item(source->filters, idx, 0); } /* reorder filter targets, not the nicest way of dealing with things */ for (i = 0; i < source->filters.num; i++) { obs_source_t next_filter = (i == source->filters.num-1) ? source : source->filters.array[idx+1]; source->filters.array[i]->filter_target = next_filter; } }