From 41f6aea8fdbc744c13bc461056a2d694a5c4d06f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 17 Jul 2004 14:12:30 +0000 Subject: rename src to polyp git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@90 fefdeb5f-60dc-0310-8127-8f9354f1896f --- polyp/sconv.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 polyp/sconv.c (limited to 'polyp/sconv.c') diff --git a/polyp/sconv.c b/polyp/sconv.c new file mode 100644 index 00000000..dd9dd241 --- /dev/null +++ b/polyp/sconv.c @@ -0,0 +1,137 @@ +/* $Id$ */ + +/*** + This file is part of polypaudio. + + polypaudio is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + polypaudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include "endianmacros.h" +#include "sconv.h" + +#include "sconv-s16le.h" +#include "sconv-s16be.h" + +static void u8_to_float32(unsigned n, const void *a, unsigned an, float *b) { + unsigned i; + const uint8_t *ca = a; + assert(n && a && an && b); + + for (; n > 0; n--) { + float sum = 0; + + for (i = 0; i < an; i++) { + uint8_t v = *(ca++); + sum += (((float) v)-127)/127; + } + + if (sum > 1) + sum = 1; + if (sum < -1) + sum = -1; + + *(b++) = sum; + } +} + +static void u8_from_float32(unsigned n, const float *a, void *b, unsigned bn) { + unsigned i; + uint8_t *cb = b; + + assert(n && a && b && bn); + for (; n > 0; n--) { + float v = *(a++); + uint8_t u; + + if (v > 1) + v = 1; + + if (v < -1) + v = -1; + + u = (uint8_t) (v*127+127); + + for (i = 0; i < bn; i++) + *(cb++) = u; + } +} + +static void float32_to_float32(unsigned n, const void *a, unsigned an, float *b) { + unsigned i; + const float *ca = a; + assert(n && a && an && b); + for (; n > 0; n--) { + float sum = 0; + + for (i = 0; i < an; i++) + sum += *(ca++); + + if (sum > 1) + sum = 1; + if (sum < -1) + sum = -1; + + *(b++) = sum; + } +} + +static void float32_from_float32(unsigned n, const float *a, void *b, unsigned bn) { + unsigned i; + float *cb = b; + assert(n && a && b && bn); + for (; n > 0; n--) { + float v = *(a++); + for (i = 0; i < bn; i++) + *(cb++) = v; + } +} + +pa_convert_to_float32_func_t pa_get_convert_to_float32_function(enum pa_sample_format f) { + switch(f) { + case PA_SAMPLE_U8: + return u8_to_float32; + case PA_SAMPLE_S16LE: + return pa_sconv_s16le_to_float32; + case PA_SAMPLE_S16BE: + return pa_sconv_s16be_to_float32; + case PA_SAMPLE_FLOAT32: + return float32_to_float32; + default: + return NULL; + } +} + +pa_convert_from_float32_func_t pa_get_convert_from_float32_function(enum pa_sample_format f) { + switch(f) { + case PA_SAMPLE_U8: + return u8_from_float32; + case PA_SAMPLE_S16LE: + return pa_sconv_s16le_from_float32; + case PA_SAMPLE_S16BE: + return pa_sconv_s16be_from_float32; + case PA_SAMPLE_FLOAT32: + return float32_from_float32; + default: + return NULL; + } +} -- cgit