summaryrefslogtreecommitdiff
path: root/src/libs
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2020-02-03 04:09:05 -0800
committerVito Caputo <vcaputo@pengaru.com>2020-02-03 04:27:33 -0800
commit503ac37cb590eb35f1891b81b2256b07a3f89592 (patch)
tree695d70d3ff2540e130578f7714e391d2efb11dd5 /src/libs
parentd583e88bf3372e23afe7c52510b19aeffcdc32fa (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')
-rw-r--r--src/libs/sig/ops_sin.c27
-rw-r--r--src/libs/sig/sig.c6
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));
© All Rights Reserved