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
;