From dfbffd8cafc7b249e08d022d5b47e7e5f25546fd Mon Sep 17 00:00:00 2001 From: Joshua Phillips Date: Sun, 28 Dec 2008 19:53:22 +0000 Subject: [PATCH] Simple ring modulator (silly_effect) --- SConscript | 3 ++- effect.h | 14 ++++++++++++++ effects.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ effects.h | 9 +++++++++ main.c | 6 ++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 effect.h create mode 100644 effects.c create mode 100644 effects.h diff --git a/SConscript b/SConscript index ff98143..a0b86d8 100644 --- a/SConscript +++ b/SConscript @@ -2,7 +2,8 @@ import os.path Import(['env']) programs = { - 'main': ['main.c', 'wavefile.c', 'soundout.c', 'aformat.c', 'sound-ioctl.c'], + 'main': [ 'main.c', 'wavefile.c', 'soundout.c', 'aformat.c', 'sound-ioctl.c', + 'effects.c'], } objects = {} diff --git a/effect.h b/effect.h new file mode 100644 index 0000000..40b0889 --- /dev/null +++ b/effect.h @@ -0,0 +1,14 @@ +#ifndef EFFECT_H +#define EFFECT_H + +struct effect; + +struct effect_vtab { + int (* process)(struct effect *ef, void **buf, long n_samples); +}; + +struct effect { + const struct effect_vtab *vtab; +}; + +#endif diff --git a/effects.c b/effects.c new file mode 100644 index 0000000..2ac9edf --- /dev/null +++ b/effects.c @@ -0,0 +1,46 @@ +#include "effects.h" +#include "effect.h" +#include "math.h" +#include "stdlib.h" + +struct silly_effect { + struct effect e; +}; + +int silly_effect_process(struct effect *ef, void **buf, long n_samples) +{ + short *bufp; + int i; + + if (!*buf){ + // we're not a source + return 1; + } + + bufp = *buf; + for (i = 0; i < n_samples; ++i){ + bufp[i * 2] *= cos((i * 2 * M_PI) / 441.0); + bufp[i * 2 + 1] *= cos((i * 2 * M_PI) / 441.0); + } + return 0; +} + +static const struct effect_vtab silly_effect_vtab = { + process: silly_effect_process, +}; + +struct effect *silly_effect_create(void) +{ + struct silly_effect *se; + se = malloc(sizeof *se); + if (!se){ + return NULL; + } + se->e.vtab = &silly_effect_vtab; + return &se->e; +} + +void silly_effect_free(struct effect *e) +{ + free(e); +} diff --git a/effects.h b/effects.h new file mode 100644 index 0000000..344a465 --- /dev/null +++ b/effects.h @@ -0,0 +1,9 @@ +#ifndef EFFECTS_H +#define EFFECTS_H + +#include "effect.h" + +struct effect *silly_effect_create(void); +void silly_effect_free(struct effect *e); + +#endif diff --git a/main.c b/main.c index 8f9045b..ed6236e 100644 --- a/main.c +++ b/main.c @@ -1,12 +1,14 @@ #include "stdio.h" #include "soundout.h" #include "wavefile.h" +#include "effects.h" int main(int argc, char **argv) { struct soundout so; struct wavefile wf; struct aformat af; + struct effect *ef1; if (wavefile_open(&wf, "/home/aoe/reflections.wav") != 0){ fprintf(stderr, "cannot open wave file\n"); @@ -23,13 +25,17 @@ int main(int argc, char **argv) return 1; } + ef1 = silly_effect_create(); + unsigned int pos = 0; char buf[4410 * 4]; + void *buf_ptr = buf; for (;;){ if (wavefile_read_at(&wf, pos, buf, 4410) != 0){ // end of file break; } + ef1->vtab->process(ef1, &buf_ptr, 4410); soundout_write(&so, buf, 4410 * 4); pos += 4410; } -- 2.11.4.GIT