summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/synth.c46
2 files changed, 48 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index d638619..a8853be 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -7,9 +7,9 @@ CC = $(CROSS)cc
CFLAGS += -I$(INCLUDE_PATH)
LDFLAGS +=
-HEADERS = audio.h mixer.h riff.h
+HEADERS = audio.h mixer.h synth.h riff.h
-OBJS = audio.o mixer.o riff.o
+OBJS = audio.o mixer.o synth.o riff.o
VERSION_MAJOR = 0
VERSION_MINOR = 0.1
diff --git a/src/synth.c b/src/synth.c
new file mode 100644
index 0000000..96c6d83
--- /dev/null
+++ b/src/synth.c
@@ -0,0 +1,46 @@
+#include <stdlib.h>
+
+#include <xas/synth.h>
+
+xas_synth *xas_synth_new(size_t sample_rate,
+ xas_synth_callback_sample sample,
+ xas_synth_callback_destroy destroy,
+ void *ctx) {
+ xas_synth *synth;
+
+ if ((synth = malloc(sizeof(*synth))) == NULL) {
+ goto error_malloc_synth;
+ }
+
+ synth->sample_rate = sample_rate;
+ synth->sample = sample;
+ synth->destroy = destroy;
+ synth->ctx = ctx;
+
+ return synth;
+
+error_malloc_synth:
+ return NULL;
+}
+
+void xas_synth_destroy(xas_synth *synth) {
+ if (synth->destroy) {
+ synth->destroy(synth, synth->ctx);
+ }
+}
+
+int16_t xas_synth_sample(xas_synth *synth) {
+ return synth->sample(synth, synth->ctx);
+}
+
+ssize_t xas_synth_fill(xas_synth *synth,
+ int16_t *samples,
+ size_t count) {
+ size_t i;
+
+ for (i=0; i<count; i++) {
+ samples[i] = synth->sample(synth, synth->ctx);
+ }
+
+ return count;
+}