summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xas/mixer.h10
-rw-r--r--src/mixer.c31
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;