diff options
author | Lennart Poettering <lennart@poettering.net> | 2009-01-12 19:48:44 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-01-12 19:48:44 +0100 |
commit | b8e6aae08ee21d839ce8ebac6505a78c5ddcd8f5 (patch) | |
tree | 14c1054691e6836d1d0b2272a1fe8d69db558095 /src/pulsecore/sample-util.c | |
parent | 949de8156efbab1a2fb103ec414eaf983d7fa1c0 (diff) |
add new API function pa_memchunk_sine()
Ease generation of sine signals. Try to make the repeatable sine
memblock fit into a single mempool slot.
Diffstat (limited to 'src/pulsecore/sample-util.c')
-rw-r--r-- | src/pulsecore/sample-util.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/pulsecore/sample-util.c b/src/pulsecore/sample-util.c index bce30926..3be08efd 100644 --- a/src/pulsecore/sample-util.c +++ b/src/pulsecore/sample-util.c @@ -39,6 +39,7 @@ #include <pulsecore/core-error.h> #include <pulsecore/macro.h> #include <pulsecore/g711.h> +#include <pulsecore/core-util.h> #include "sample-util.h" #include "endianmacros.h" @@ -1015,3 +1016,36 @@ void pa_memchunk_dump_to_file(pa_memchunk *c, const char *fn) { fclose(f); } + +static void calc_sine(float *f, size_t l, double freq) { + size_t i; + + l /= sizeof(float); + + for (i = 0; i < l; i++) + *(f++) = (float) 0.5f * sin((double) i*M_PI*2*freq / (double) l); +} + +void pa_memchunk_sine(pa_memchunk *c, pa_mempool *pool, unsigned rate, unsigned freq) { + size_t l; + unsigned gcd, n; + void *p; + + pa_memchunk_reset(c); + + gcd = pa_gcd(rate, freq); + n = rate / gcd; + + l = pa_mempool_block_size_max(pool) / sizeof(float); + + l /= n; + if (l <= 0) l = 1; + l *= n; + + c->length = l * sizeof(float); + c->memblock = pa_memblock_new(pool, c->length); + + p = pa_memblock_acquire(c->memblock); + calc_sine(p, c->length, freq * l / rate); + pa_memblock_release(c->memblock); +} |