libobs: Store linked list of audio sources

Useful for going traversing the list of audio sources (particularly for
the new audio subsystem)
This commit is contained in:
jp9000
2015-12-17 04:00:14 -08:00
parent a702d88c25
commit 96d9bf794c
3 changed files with 28 additions and 0 deletions

View File

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

View File

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

View File

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