mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
libobs: Lock mutex when changing filter order
Refactors the function a bit to ensure that the filter mutex is locked when changing the filter order.
This commit is contained in:
+25
-13
@@ -1349,48 +1349,60 @@ void obs_source_filter_remove(obs_source_t *source, obs_source_t *filter)
|
||||
obs_source_release(filter);
|
||||
}
|
||||
|
||||
void obs_source_filter_set_order(obs_source_t *source, obs_source_t *filter,
|
||||
enum obs_order_movement movement)
|
||||
static bool move_filter_dir(obs_source_t *source,
|
||||
obs_source_t *filter, enum obs_order_movement movement)
|
||||
{
|
||||
size_t idx, i;
|
||||
|
||||
if (!source || !filter)
|
||||
return;
|
||||
size_t idx;
|
||||
|
||||
idx = da_find(source->filters, &filter, 0);
|
||||
if (idx == DARRAY_INVALID)
|
||||
return;
|
||||
return false;
|
||||
|
||||
if (movement == OBS_ORDER_MOVE_UP) {
|
||||
if (idx == source->filters.num-1)
|
||||
return;
|
||||
return false;
|
||||
da_move_item(source->filters, idx, idx+1);
|
||||
|
||||
} else if (movement == OBS_ORDER_MOVE_DOWN) {
|
||||
if (idx == 0)
|
||||
return;
|
||||
return false;
|
||||
da_move_item(source->filters, idx, idx-1);
|
||||
|
||||
} else if (movement == OBS_ORDER_MOVE_TOP) {
|
||||
if (idx == source->filters.num-1)
|
||||
return;
|
||||
return false;
|
||||
da_move_item(source->filters, idx, source->filters.num-1);
|
||||
|
||||
} else if (movement == OBS_ORDER_MOVE_BOTTOM) {
|
||||
if (idx == 0)
|
||||
return;
|
||||
return false;
|
||||
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++) {
|
||||
for (size_t i = 0; i < source->filters.num; i++) {
|
||||
obs_source_t *next_filter = (i == source->filters.num-1) ?
|
||||
source : source->filters.array[i + 1];
|
||||
|
||||
source->filters.array[i]->filter_target = next_filter;
|
||||
}
|
||||
|
||||
obs_source_dosignal(source, NULL, "reorder_filters");
|
||||
return true;
|
||||
}
|
||||
|
||||
void obs_source_filter_set_order(obs_source_t *source, obs_source_t *filter,
|
||||
enum obs_order_movement movement)
|
||||
{
|
||||
bool success;
|
||||
if (!source || !filter)
|
||||
return;
|
||||
|
||||
pthread_mutex_lock(&source->filter_mutex);
|
||||
success = move_filter_dir(source, filter, movement);
|
||||
pthread_mutex_unlock(&source->filter_mutex);
|
||||
|
||||
if (success)
|
||||
obs_source_dosignal(source, NULL, "reorder_filters");
|
||||
}
|
||||
|
||||
obs_data_t *obs_source_get_settings(const obs_source_t *source)
|
||||
|
||||
Reference in New Issue
Block a user