From 7f4b113f8dd3b42016a4c9b9efa3ea3b2ea3fce9 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 15 Mar 2022 18:35:39 -0400 Subject: Impleemnt xas_mixer_object_add() Impleemnt xas_mixer_object_add() as a convenience method to create an audio stream from an object given; ensure audio streams instantiated in this manner are destroyed upon mixer destruction --- include/xas/mixer.h | 10 ++++++++++ src/mixer.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/xas/mixer.h b/include/xas/mixer.h index 3769272..79d6ffb 100644 --- a/include/xas/mixer.h +++ b/include/xas/mixer.h @@ -3,8 +3,11 @@ #include +#include #include +#define XAS_MIXER_INPUT_STREAM_MANAGED (1 << 0) + typedef struct _xas_mixer_input { xas_audio_stream *stream; @@ -12,6 +15,8 @@ typedef struct _xas_mixer_input { bias_l, bias_r; + int flags; + struct _xas_mixer_input *next; } xas_mixer_input; @@ -36,6 +41,11 @@ xas_mixer_input *xas_mixer_input_add(xas_mixer *mixer, float gain, float pan); +xas_mixer_input *xas_mixer_object_add(xas_mixer *mixer, + xas_object *object, + float gain, + float pan); + void xas_mixer_input_set_gain(xas_mixer_input *input, float gain); void xas_mixer_input_set_pan(xas_mixer_input *input, float pan); diff --git a/src/mixer.c b/src/mixer.c index 8fe53cb..a60118d 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -176,6 +176,10 @@ void xas_mixer_destroy(xas_mixer *mixer) { while (input) { xas_mixer_input *next = input->next; + if (input->flags & XAS_MIXER_INPUT_STREAM_MANAGED) { + xas_audio_stream_destroy(input->stream); + } + free(input); input = next; @@ -231,6 +235,7 @@ xas_mixer_input *xas_mixer_input_add(xas_mixer *mixer, input->stream = stream; input->gain = gain; + input->flags = 0; input->next = NULL; input_set_pan(input, pan); @@ -250,6 +255,32 @@ error_invalid_stream: return NULL; } +xas_mixer_input *xas_mixer_object_add(xas_mixer *mixer, + xas_object *object, + float gain, + float pan) { + xas_mixer_input *input; + xas_audio_stream *stream; + + if ((stream = xas_object_stream_new(object)) == NULL) { + goto error_object_stream_new; + } + + if ((input = xas_mixer_input_add(mixer, stream, gain, pan)) == NULL) { + goto error_input_add; + } + + input->flags |= XAS_MIXER_INPUT_STREAM_MANAGED; + + return input; + +error_input_add: + xas_audio_stream_destroy(stream); + +error_object_stream_new: + return NULL; +} + void xas_mixer_input_set_gain(xas_mixer_input *input, float gain) { if (gain < 0.0 || gain > 1.0) { return; -- cgit v1.2.3