diff options
-rw-r--r-- | examples/test.c | 64 | ||||
-rw-r--r-- | include/xas/synth.h | 14 | ||||
-rw-r--r-- | src/Makefile | 4 | ||||
-rw-r--r-- | src/synth.c | 46 |
4 files changed, 100 insertions, 28 deletions
diff --git a/examples/test.c b/examples/test.c index ebc32fe..a56da4b 100644 --- a/examples/test.c +++ b/examples/test.c @@ -6,17 +6,18 @@ #include <fcntl.h> #include <math.h> +#include <xas/synth.h> #include <xas/audio.h> #include <xas/riff.h> -#define SYNTH_STATUS_ON (1 << 0) +#define SYNTH_STATUS_CLEAR 0 +#define SYNTH_STATUS_ON (1 << 0) typedef struct _synth_sine { int flags; float phase; - size_t sample_rate, - frequency; + size_t frequency; } synth_sine; static void usage(int argc, char **argv, const char *message, ...) { @@ -36,31 +37,36 @@ static void usage(int argc, char **argv, const char *message, ...) { exit(EX_USAGE); } -static ssize_t synth_sine_fill(synth_sine *synth, - int16_t *samples, - size_t count, - xas_audio_stream *stream) { - size_t i; +static int16_t sine_sample(xas_synth *synth, synth_sine *sine) { + int16_t ret; - for (i=0; i<count; i++) { - if (synth->flags & SYNTH_STATUS_ON) { - samples[i] = (int16_t)roundf((INT16_MAX >> 2) * sinf(synth->phase)); + if (sine->flags & SYNTH_STATUS_ON) { + ret = (int16_t)roundf((INT16_MAX >> 2) * sinf(sine->phase)); - synth->phase += (2.0f * M_PI) / (stream->sample_rate / synth->frequency); - } else { - samples[i] = 0; - } + sine->phase += (2.0f * M_PI) / (synth->sample_rate / sine->frequency); + } else { + ret = 0; } - return count; + return ret; +} + +static void sine_destroy(xas_synth *synth, synth_sine *sine) { + return; } int main(int argc, char **argv) { xas_audio_stream *stream; + xas_synth *synth; + + synth_sine sine = { + .flags = SYNTH_STATUS_CLEAR, + .phase = 0.0f, + .frequency = 220 + }; - int duration_s = 60, - frequency = 220, - sample_rate = 44100; + size_t sample_rate = 44100, + duration_s = 60; int i; @@ -76,14 +82,19 @@ int main(int argc, char **argv) { goto error_riff_file_open; } - for (i=0; i < duration_s * frequency; i++) { - float phase; + if ((synth = xas_synth_new(sample_rate, + (xas_synth_callback_sample)sine_sample, + (xas_synth_callback_destroy)sine_destroy, + &sine)) == NULL) { + goto error_synth_new; + } - for (phase = 0.0; phase < 2 * M_PI; phase += (2 * M_PI) / (sample_rate / frequency)) { - int16_t value = (int16_t)round((INT16_MAX >> 2) * sin(phase)); + for (i=0; i < duration_s * sample_rate; i++) { + int16_t samples[1] = { + xas_synth_sample(synth) + }; - xas_audio_stream_write(stream, &value, 1); - } + xas_synth_fill(synth, samples, 1); } xas_audio_stream_flush(stream); @@ -91,6 +102,9 @@ int main(int argc, char **argv) { return EX_OK; +error_synth_new: + xas_audio_stream_destroy(stream); + error_riff_file_open: return EX_OSERR; } diff --git a/include/xas/synth.h b/include/xas/synth.h index 4d0fbd0..014d330 100644 --- a/include/xas/synth.h +++ b/include/xas/synth.h @@ -2,6 +2,9 @@ #define _XAS_SYNTH_H #include <stdint.h> +#include <sys/types.h> + +#include <xas/audio.h> typedef struct _xas_synth xas_synth; @@ -10,15 +13,24 @@ typedef int16_t (*xas_synth_callback_sample)(xas_synth *synth, void *ctx); typedef void (*xas_synth_callback_destroy)(xas_synth *synth, void *ctx); struct _xas_synth { + size_t sample_rate; + xas_synth_callback_sample sample; xas_synth_callback_destroy destroy; void *ctx; }; -xas_synth *xas_synth_new(xas_synth_callback_sample sample, +xas_synth *xas_synth_new(size_t sample_rate, + xas_synth_callback_sample sample, xas_synth_callback_destroy destroy, void *ctx); void xas_synth_destroy(xas_synth *synth); +int16_t xas_synth_sample(xas_synth *synth); + +ssize_t xas_synth_fill(xas_synth *synth, + int16_t *samples, + size_t count); + #endif /* _XAS_SYNTH_H */ 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; +} |