summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/test.c64
1 files changed, 39 insertions, 25 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;
}