diff options
author | XANTRONIX Development | 2022-01-31 20:47:58 -0500 |
---|---|---|
committer | XANTRONIX Development | 2022-01-31 20:47:58 -0500 |
commit | 59d4694efd295217e15c90ca5636c4bdcfecf222 (patch) | |
tree | 2a1c78bab9707b67877c0c133815e20355f00393 /src | |
parent | 09e1154a36f692e9ad2cee5f47fc66459f2568a2 (diff) | |
download | xas-59d4694efd295217e15c90ca5636c4bdcfecf222.tar.gz xas-59d4694efd295217e15c90ca5636c4bdcfecf222.tar.bz2 xas-59d4694efd295217e15c90ca5636c4bdcfecf222.zip |
This is getting annoyingly close to working...
Diffstat (limited to 'src')
-rw-r--r-- | src/audio.c | 6 | ||||
-rw-r--r-- | src/mixer.c | 38 | ||||
-rw-r--r-- | src/synth.c | 60 |
3 files changed, 73 insertions, 31 deletions
diff --git a/src/audio.c b/src/audio.c index 85f417d..d0a1e63 100644 --- a/src/audio.c +++ b/src/audio.c @@ -161,10 +161,12 @@ error_stream_flush: } ssize_t xas_audio_stream_read(xas_audio_stream *stream, - void *samples, + void **samples, size_t count) { + *samples = stream + 1; + return stream->fill(stream->ctx, - samples, + *samples, count, stream); } diff --git a/src/mixer.c b/src/mixer.c index 8007cae..3fc1ac9 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -34,11 +34,11 @@ static void mixer_apply_int16_t_stereo(int16_t *dest, static ssize_t mixer_fill(xas_mixer *mixer, void *samples, - size_t count) { - ssize_t ret = 0; + size_t count, + xas_audio_stream *output) { + ssize_t total = 0; - xas_mixer_input *input = mixer->inputs, - *output = mixer->output; + xas_mixer_input *input = mixer->inputs; void (*mixer_apply)(int16_t *, int16_t *, @@ -54,29 +54,34 @@ static ssize_t mixer_fill(xas_mixer *mixer, while (input) { xas_mixer_input *next = input->next; + int16_t *buf; ssize_t readlen; if ((readlen = xas_audio_stream_read(input->stream, - mixer->buf, + (void **)&buf, count)) < 0) { goto error_audio_read_stream; } - mixer_apply((int16_t *)mixer->buf, - (int16_t *)(input + 1), + mixer_apply((int16_t *)(mixer->buf), + buf, readlen, input->bias_l, input->bias_r); - if (ret < readlen) { - ret = readlen; + if (total < readlen) { + total = readlen; } input = next; } - return ret; + memcpy(samples, + mixer->buf, + total * output->sample_size * output->channels); + + return total; error_audio_read_stream: return -1; @@ -126,7 +131,7 @@ void xas_mixer_destroy(xas_mixer *mixer) { xas_mixer_input *input = mixer->inputs; while (input) { - xas_mixer_input *next = input; + xas_mixer_input *next = input->next; free(input); @@ -138,6 +143,10 @@ void xas_mixer_destroy(xas_mixer *mixer) { free(mixer); } +xas_audio_stream *xas_mixer_output(xas_mixer *mixer) { + return mixer->output; +} + static inline void input_set_pan(xas_mixer_input *input, float pan) { float angle, term, @@ -165,7 +174,6 @@ xas_mixer_input *xas_mixer_input_add(xas_mixer *mixer, if (stream->sample_size != mixer->output->sample_size || stream->sample_rate != mixer->output->sample_rate - || stream->channels != mixer->output->channels || stream->buffer_size != mixer->buffer_size) { errno = EINVAL; @@ -178,12 +186,16 @@ xas_mixer_input *xas_mixer_input_add(xas_mixer *mixer, input->stream = stream; input->gain = gain; + input->next = NULL; input_set_pan(input, pan); if (mixer->inputs == NULL) { mixer->inputs = input; - mixer->last = NULL; + mixer->last = input; + } else { + mixer->last->next = input; + mixer->last = input; } return input; diff --git a/src/synth.c b/src/synth.c index 9b18daf..a482875 100644 --- a/src/synth.c +++ b/src/synth.c @@ -2,33 +2,61 @@ #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) { +static ssize_t synth_fill(xas_synth *synth, + int16_t *samples, + size_t count, + xas_audio_stream *stream) { + size_t i; + + for (i=0; i<count; i++) { + samples[i] = synth->sample(synth, synth->ctx); + } + + return count; +} + +static void synth_cleanup(xas_synth *synth, xas_audio_stream *stream) { + if (synth->cleanup) { + synth->cleanup(synth, synth->ctx); + } + + free(synth); +} + +xas_audio_stream *xas_synth_new(size_t sample_size, + size_t sample_rate, + size_t buffer_size, + xas_synth_callback_sample sample, + xas_synth_callback_cleanup cleanup, + void *ctx) { + xas_audio_stream *stream; xas_synth *synth; if ((synth = malloc(sizeof(*synth))) == NULL) { goto error_malloc_synth; } + synth->sample_size = sample_size; synth->sample_rate = sample_rate; synth->sample = sample; - synth->destroy = destroy; + synth->cleanup = cleanup; synth->ctx = ctx; - return synth; + if ((stream = xas_audio_stream_new_source((xas_audio_fill)synth_fill, + (xas_audio_cleanup)synth_cleanup, + synth, + sample_size, + sample_rate, + XAS_AUDIO_STREAM_MONO, + buffer_size)) == NULL) { + goto error_audio_stream_new_source; + } -error_malloc_synth: - return NULL; -} + return stream; -void xas_synth_destroy(xas_synth *synth) { - if (synth->destroy) { - synth->destroy(synth, synth->ctx); - } -} +error_audio_stream_new_source: + free(synth); -int16_t xas_synth_sample(xas_synth *synth) { - return synth->sample(synth, synth->ctx); +error_malloc_synth: + return NULL; } |