diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/test.c | 64 | 
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;  } | 
 
    