summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXANTRONIX Development2022-03-08 19:51:59 -0500
committerXANTRONIX Development2022-03-08 19:51:59 -0500
commitd46847852d1446f4b64a0fd424cdea5fa1c0dbd4 (patch)
treee17acc9e2efe6e631108bdf2798bb5eec58ed071
parentaaff62e728a269893ef378534f6aca71643fe4cc (diff)
downloadxas-d46847852d1446f4b64a0fd424cdea5fa1c0dbd4.tar.gz
xas-d46847852d1446f4b64a0fd424cdea5fa1c0dbd4.tar.bz2
xas-d46847852d1446f4b64a0fd424cdea5fa1c0dbd4.zip
Implement setting square wave duty cycle
-rw-r--r--include/xas/synth.h6
-rw-r--r--src/synth.c9
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 <xas/audio.h>
#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);
}