From d46847852d1446f4b64a0fd424cdea5fa1c0dbd4 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 8 Mar 2022 19:51:59 -0500 Subject: Implement setting square wave duty cycle --- include/xas/synth.h | 6 +++++- src/synth.c | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/xas/synth.h b/include/xas/synth.h index ca83c69..cb0b3bd 100644 --- a/include/xas/synth.h +++ b/include/xas/synth.h @@ -8,6 +8,7 @@ #include #define XAS_SYNTH_DEFAULT_GAIN 1.0f +#define XAS_SYNTH_DEFAULT_DUTY 1.0f #define XAS_SYNTH_DEFAULT_FREQUENCY 2600 /* Hz */ enum xas_synth_type { @@ -38,7 +39,8 @@ struct _xas_synth { xas_synth_sample_callback sample; float phase, - gain; + gain, + duty; size_t frequency; }; @@ -51,6 +53,8 @@ void xas_synth_destroy(xas_synth *synth); void xas_synth_set_gain(xas_synth *synth, float gain); +void xas_synth_set_duty(xas_synth *synth, float duty); + void xas_synth_set_frequency(xas_synth *synth, size_t frequency); void xas_synth_set_type(xas_synth *synth, enum xas_synth_type type); diff --git a/src/synth.c b/src/synth.c index b01ebc8..0be572d 100644 --- a/src/synth.c +++ b/src/synth.c @@ -27,8 +27,10 @@ static int16_t sample_square(xas_synth *synth) { int16_t ret; static float tau = 2.0f * M_PI; + float duty = synth->duty; + if (synth->state == XAS_SYNTH_ACTIVE) { - ret = (synth->phase - M_PI) > 0.0? + ret = ((duty * synth->phase) - M_PI) > 0.0? (int16_t)roundf(synth->gain * (INT16_MAX / 4)): (int16_t)roundf(synth->gain * (INT16_MIN / 4)); @@ -156,6 +158,7 @@ xas_synth *xas_synth_new(xas_audio_format format, synth->state = XAS_SYNTH_IDLE; synth->phase = 0.0f; synth->gain = XAS_SYNTH_DEFAULT_GAIN; + synth->duty = XAS_SYNTH_DEFAULT_DUTY; synth->frequency = XAS_SYNTH_DEFAULT_FREQUENCY; synth->format.channels = XAS_AUDIO_MONO; @@ -184,6 +187,10 @@ void xas_synth_set_gain(xas_synth *synth, float gain) { synth->gain = gain; } +void xas_synth_set_duty(xas_synth *synth, float duty) { + synth->duty = duty; +} + void xas_synth_set_type(xas_synth *synth, enum xas_synth_type type) { set_type(synth, type); } -- cgit v1.2.3