1
0
Эх сурвалжийг харах

libobs: Store linked list of audio sources

Useful for going traversing the list of audio sources (particularly for
the new audio subsystem)
jp9000 9 жил өмнө
parent
commit
96d9bf794c

+ 4 - 0
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;

+ 21 - 0
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);
 

+ 3 - 0
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);