diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2020-02-03 04:09:05 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2020-02-03 04:27:33 -0800 |
commit | 503ac37cb590eb35f1891b81b2256b07a3f89592 (patch) | |
tree | 695d70d3ff2540e130578f7714e391d2efb11dd5 /src/libs/sig | |
parent | d583e88bf3372e23afe7c52510b19aeffcdc32fa (diff) |
libs/sig: convert ops_sin_ctxt_t.hz to a sig_t *
Now hz can vary with time as well...
Diffstat (limited to 'src/libs/sig')
-rw-r--r-- | src/libs/sig/ops_sin.c | 27 | ||||
-rw-r--r-- | src/libs/sig/sig.c | 6 |
2 files changed, 24 insertions, 9 deletions
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)); |