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:
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user