diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 2cd6faa6d..1ade31b0d 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -420,6 +420,7 @@ struct obs_core_data { volatile bool valid; DARRAY(char *) protocols; + DARRAY(obs_source_t *) sources_to_tick; }; /* user hotkeys */ diff --git a/libobs/obs-video.c b/libobs/obs-video.c index 282f2a5d5..2ca57dc02 100644 --- a/libobs/obs-video.c +++ b/libobs/obs-video.c @@ -45,35 +45,42 @@ static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time) /* ------------------------------------- */ /* call tick callbacks */ - pthread_mutex_lock(&obs->data.draw_callbacks_mutex); + pthread_mutex_lock(&data->draw_callbacks_mutex); - for (size_t i = obs->data.tick_callbacks.num; i > 0; i--) { + for (size_t i = data->tick_callbacks.num; i > 0; i--) { struct tick_callback *callback; - callback = obs->data.tick_callbacks.array + (i - 1); + callback = data->tick_callbacks.array + (i - 1); callback->tick(callback->param, seconds); } - pthread_mutex_unlock(&obs->data.draw_callbacks_mutex); + pthread_mutex_unlock(&data->draw_callbacks_mutex); /* ------------------------------------- */ - /* call the tick function of each source */ + /* get an array of all sources to tick */ + + data->sources_to_tick.num = 0; pthread_mutex_lock(&data->sources_mutex); source = data->sources; while (source) { obs_source_t *s = obs_source_get_ref(source); - - if (s) { - obs_source_video_tick(s, seconds); - obs_source_release(s); - } - + if (s) + da_push_back(data->sources_to_tick, &s); source = (struct obs_source *)source->context.hh_uuid.next; } pthread_mutex_unlock(&data->sources_mutex); + /* ------------------------------------- */ + /* call the tick function of each source */ + + for (size_t i = 0; i < data->sources_to_tick.num; i++) { + obs_source_t *s = data->sources_to_tick.array[i]; + obs_source_video_tick(s, seconds); + obs_source_release(s); + } + return cur_time; } diff --git a/libobs/obs.c b/libobs/obs.c index 14ea82b66..f1f1fab09 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -1083,6 +1083,7 @@ static void obs_free_data(void) for (size_t i = 0; i < data->protocols.num; i++) bfree(data->protocols.array[i]); da_free(data->protocols); + da_free(data->sources_to_tick); } static const char *obs_signals[] = {