libobs: Don't keep the sources mutex in tick_sources

Allow other threads to use sources while the graphics thread does
video_tick, update, activate and deactivate on sources
This commit is contained in:
Exeldro 2023-06-09 08:51:45 +02:00 committed by Lain
parent 9178ec6a8d
commit a77789b266
3 changed files with 20 additions and 11 deletions

View file

@ -420,6 +420,7 @@ struct obs_core_data {
volatile bool valid;
DARRAY(char *) protocols;
DARRAY(obs_source_t *) sources_to_tick;
};
/* user hotkeys */

View file

@ -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;
}

View file

@ -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[] = {