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