diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-07-03 23:35:12 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-07-03 23:35:12 +0000 |
commit | e61c2dddb7bc392ab4073d5691870615ada82922 (patch) | |
tree | b7e98c4232ca855c7bac6ba88e47b7ff45a9cbe1 /src/sconv-s16le.c | |
parent | a8a5ab1c79c0b6567ecc98343ff1ae944f2285b9 (diff) |
add pa_ prefix to all identifiers.
fix downsampling/resampling
add support for U8 samples
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@49 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/sconv-s16le.c')
-rw-r--r-- | src/sconv-s16le.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/sconv-s16le.c b/src/sconv-s16le.c new file mode 100644 index 00000000..ca984463 --- /dev/null +++ b/src/sconv-s16le.c @@ -0,0 +1,57 @@ +#include <assert.h> +#include <inttypes.h> + +#include "endianmacros.h" +#include "sconv.h" + +#ifndef INT16_FROM +#define INT16_FROM INT16_FROM_LE +#endif + +#ifndef INT16_TO +#define INT16_TO INT16_TO_LE +#endif + +void pa_sconv_s16le_to_float32(unsigned n, const void *a, unsigned an, float *b) { + const int16_t *ca = a; + assert(n && a && an && b); + + for (; n > 0; n--) { + unsigned i; + float sum = 0; + + for (i = 0; i < an; i++) { + int16_t s = *(ca++); + sum += ((float) INT16_FROM(s))/0x7FFF; + } + + if (sum > 1) + sum = 1; + if (sum < -1) + sum = -1; + + *(b++) = sum; + } +} + +void pa_sconv_s16le_from_float32(unsigned n, const float *a, void *b, unsigned bn) { + int16_t *cb = b; + assert(n && a && b && bn); + + for (; n > 0; n--) { + unsigned i; + int16_t s; + float v = *(a++); + + if (v > 1) + v = 1; + if (v < -1) + v = -1; + + s = (int16_t) (v * 0x7FFF); + s = INT16_TO(s); + + for (i = 0; i < bn; i++) + *(cb++) = s; + } +} |