From 503ac37cb590eb35f1891b81b2256b07a3f89592 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Mon, 3 Feb 2020 04:09:05 -0800 Subject: libs/sig: convert ops_sin_ctxt_t.hz to a sig_t * Now hz can vary with time as well... --- src/libs/sig/ops_sin.c | 27 +++++++++++++++++++++------ src/libs/sig/sig.c | 6 +++--- 2 files changed, 24 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/libs/sig/ops_sin.c b/src/libs/sig/ops_sin.c index b228b49..fa9dfa5 100644 --- a/src/libs/sig/ops_sin.c +++ b/src/libs/sig/ops_sin.c @@ -5,7 +5,7 @@ typedef struct ops_sin_ctxt_t { - float hz; + sig_t *hz; } ops_sin_ctxt_t; @@ -21,21 +21,35 @@ static void ops_sin_init(void *context, va_list ap) assert(ctxt); - ctxt->hz = va_arg(ap, double); - assert(ctxt->hz >= .0001f); + ctxt->hz = va_arg(ap, sig_t *); +} + + +static void ops_sin_destroy(void *context) +{ + ops_sin_ctxt_t *ctxt = context; + + assert(ctxt); + + sig_free(ctxt->hz); } static float ops_sin_output(void *context, unsigned ticks_ms) { ops_sin_ctxt_t *ctxt = context; - float rads_per_ms, rads; + float rads_per_ms, rads, hz; unsigned ms_per_cycle; assert(ctxt); + assert(ctxt->hz); + + hz = sig_output(ctxt->hz, ticks_ms); + if (hz < .0001f) + return 0.f; - ms_per_cycle = ctxt->hz * 1000.f; - rads_per_ms = (M_PI * 2.f) * ctxt->hz * .001f; + ms_per_cycle = hz * 1000.f; + rads_per_ms = (M_PI * 2.f) * hz * .001f; rads = (float)(ticks_ms % ms_per_cycle) * rads_per_ms; return sinf(rads); @@ -45,5 +59,6 @@ static float ops_sin_output(void *context, unsigned ticks_ms) sig_ops_t sig_ops_sin = { .size = ops_sin_size, .init = ops_sin_init, + .destroy = ops_sin_destroy, .output = ops_sin_output, }; diff --git a/src/libs/sig/sig.c b/src/libs/sig/sig.c index e3d5a7c..cd179e2 100644 --- a/src/libs/sig/sig.c +++ b/src/libs/sig/sig.c @@ -83,14 +83,14 @@ int main(int argc, char *argv[]) printf("null output=%f\n", sig_output(sig, 0)); sig = sig_free(sig); - sig = sig_new(&sig_ops_sin, 2.f); + sig = sig_new(&sig_ops_sin, sig_new(&sig_ops_const, 2.f)); for (unsigned i = 0; i < 1000; i++) printf("sin 2hz output %i=%f\n", i, sig_output(sig, i)); sig = sig_free(sig); sig = sig_new(&sig_ops_mult, - sig_new(&sig_ops_sin, 1.f), /* LFO @ 1hz */ - sig_new(&sig_ops_sin, 100.f) /* oscillator @ 100hz */ + sig_new(&sig_ops_sin, sig_new(&sig_ops_const, 1.f)), /* LFO @ 1hz */ + sig_new(&sig_ops_sin, sig_new(&sig_ops_const, 100.f)) /* oscillator @ 100hz */ ); for (unsigned i = 0; i < 1000; i++) printf("sin 100hz * 1hz output %i=%f\n", i, sig_output(sig, i)); -- cgit v1.2.3