diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index a0fbd2380..66fa8ede7 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -270,6 +270,7 @@ struct obs_core_audio { /* user sources, output channels, and displays */ struct obs_core_data { struct obs_source *first_source; + struct obs_source *first_audio_source; struct obs_display *first_display; struct obs_output *first_output; struct obs_encoder *first_encoder; @@ -280,6 +281,7 @@ struct obs_core_data { pthread_mutex_t outputs_mutex; pthread_mutex_t encoders_mutex; pthread_mutex_t services_mutex; + pthread_mutex_t audio_sources_mutex; struct obs_view main_view; @@ -493,6 +495,8 @@ struct obs_source { /* audio */ bool audio_failed; bool muted; + struct obs_source *next_audio_source; + struct obs_source **prev_next_audio_source; struct resample_info sample_info; audio_resampler_t *resampler; audio_line_t *audio_line; diff --git a/libobs/obs-source.c b/libobs/obs-source.c index d731f97e7..54bbdc9f2 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -149,6 +149,18 @@ bool obs_source_init(struct obs_source *source, "source '%s'", source->context.name); return false; } + + pthread_mutex_lock(&obs->data.audio_sources_mutex); + + source->next_audio_source = obs->data.first_audio_source; + source->prev_next_audio_source = + &obs->data.first_audio_source; + if (obs->data.first_audio_source) + obs->data.first_audio_source->prev_next_audio_source = + &source->next_audio_source; + obs->data.first_audio_source = source; + + pthread_mutex_unlock(&obs->data.audio_sources_mutex); } source->control = bzalloc(sizeof(obs_weak_source_t)); @@ -340,6 +352,15 @@ void obs_source_destroy(struct obs_source *source) if (!obs_source_valid(source, "obs_source_destroy")) return; + pthread_mutex_lock(&obs->data.audio_sources_mutex); + if (source->prev_next_audio_source) { + *source->prev_next_audio_source = source->next_audio_source; + if (source->next_audio_source) + source->next_audio_source->prev_next_audio_source = + source->prev_next_audio_source; + } + pthread_mutex_unlock(&obs->data.audio_sources_mutex); + if (source->filter_parent) obs_source_filter_remove_refless(source->filter_parent, source); diff --git a/libobs/obs.c b/libobs/obs.c index 3c881e63c..0257f73e8 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -494,6 +494,8 @@ static bool obs_init_data(void) goto fail; if (pthread_mutex_init(&data->sources_mutex, &attr) != 0) goto fail; + if (pthread_mutex_init(&data->audio_sources_mutex, &attr) != 0) + goto fail; if (pthread_mutex_init(&data->displays_mutex, &attr) != 0) goto fail; if (pthread_mutex_init(&data->outputs_mutex, &attr) != 0) @@ -552,6 +554,7 @@ static void obs_free_data(void) FREE_OBS_LINKED_LIST(service); pthread_mutex_destroy(&data->sources_mutex); + pthread_mutex_destroy(&data->audio_sources_mutex); pthread_mutex_destroy(&data->displays_mutex); pthread_mutex_destroy(&data->outputs_mutex); pthread_mutex_destroy(&data->encoders_mutex);