4 This file is part of PulseAudio.
6 Copyright 2004-2006 Lennart Poettering
7 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published
11 by the Free Software Foundation; either version 2 of the License,
12 or (at your option) any later version.
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with PulseAudio; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
33 #include <liboil/liboilfuncs.h>
34 #include <liboil/liboil.h>
36 #include <pulsecore/g711.h>
38 #include "endianmacros.h"
39 #include "sconv-s16le.h"
40 #include "sconv-s16be.h"
44 static void u8_to_float32ne(unsigned n, const void *a, float *b) {
45 const uint8_t *ca = a;
46 static const double add = -128.0/127.0, factor = 1.0/127.0;
51 oil_scaleconv_f32_u8(b, ca, n, &add, &factor);
54 static void u8_from_float32ne(unsigned n, const float *a, void *b) {
56 static const double add = 128.0, factor = 127.0;
61 oil_scaleconv_u8_f32(cb, a, n, &add, &factor);
64 static void float32ne_to_float32ne(unsigned n, const void *a, float *b) {
68 oil_memcpy(b, a, sizeof(float) * n);
71 static void float32ne_from_float32ne(unsigned n, const float *a, void *b) {
75 oil_memcpy(b, a, sizeof(float) * n);
78 static void float32re_to_float32ne(unsigned n, const void *a, float *b) {
83 ((uint32_t *)b)[n] = UINT32_SWAP (((uint32_t *)a)[n]);
86 static void float32re_from_float32ne(unsigned n, const float *a, void *b) {
91 ((uint32_t *)b)[n] = UINT32_SWAP (((uint32_t *)a)[n]);
94 static void ulaw_to_float32ne(unsigned n, const void *a, float *b) {
95 const uint8_t *ca = a;
101 *(b++) = st_ulaw2linear16(*(ca++)) * 1.0F / 0x7FFF;
104 static void ulaw_from_float32ne(unsigned n, const float *a, void *b) {
119 *(cb++) = st_14linear2ulaw((int16_t) (v * 0x1FFF));
123 static void alaw_to_float32ne(unsigned n, const void *a, float *b) {
124 const uint8_t *ca = a;
130 *(b++) = st_alaw2linear16(*(ca++)) * 1.0F / 0x7FFF;
133 static void alaw_from_float32ne(unsigned n, const float *a, void *b) {
148 *(cb++) = st_13linear2alaw((int16_t) (v * 0xFFF));
152 pa_convert_to_float32ne_func_t pa_get_convert_to_float32ne_function(pa_sample_format_t f) {
155 return u8_to_float32ne;
156 case PA_SAMPLE_S16LE:
157 return pa_sconv_s16le_to_float32ne;
158 case PA_SAMPLE_S16BE:
159 return pa_sconv_s16be_to_float32ne;
160 case PA_SAMPLE_FLOAT32NE:
161 return float32ne_to_float32ne;
162 case PA_SAMPLE_FLOAT32RE:
163 return float32re_to_float32ne;
165 return alaw_to_float32ne;
167 return ulaw_to_float32ne;
173 pa_convert_from_float32ne_func_t pa_get_convert_from_float32ne_function(pa_sample_format_t f) {
176 return u8_from_float32ne;
177 case PA_SAMPLE_S16LE:
178 return pa_sconv_s16le_from_float32ne;
179 case PA_SAMPLE_S16BE:
180 return pa_sconv_s16be_from_float32ne;
181 case PA_SAMPLE_FLOAT32NE:
182 return float32ne_from_float32ne;
183 case PA_SAMPLE_FLOAT32RE:
184 return float32re_from_float32ne;
186 return alaw_from_float32ne;
188 return ulaw_from_float32ne;