diff options
-rw-r--r-- | include/xas/mixer.h | 10 | ||||
-rw-r--r-- | src/mixer.c | 31 |
2 files changed, 41 insertions, 0 deletions
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 <sys/types.h> +#include <xas/object.h> #include <xas/audio.h> +#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; |