4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * Copyright 2009-2011 Jörg Hermann Müller
8 * This file is part of AudaSpace.
10 * Audaspace is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * AudaSpace is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with Audaspace; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * ***** END GPL LICENSE BLOCK *****
27 /** \file audaspace/intern/AUD_ConverterFunctions.cpp
28 * \ingroup audaspaceintern
32 #include "AUD_ConverterFunctions.h"
33 #include "AUD_Buffer.h"
36 #define AUD_S16_MAX 0x7FFF
37 #define AUD_S16_MIN 0x8000
38 #define AUD_S16_FLT 32768.0f
39 #define AUD_S32_MAX 0x7FFFFFFF
40 #define AUD_S32_MIN 0x80000000
41 #define AUD_S32_FLT 2147483648.0f
42 #define AUD_FLT_MAX 1.0f
43 #define AUD_FLT_MIN -1.0f
45 void AUD_convert_u8_s16(data_t* target, data_t* source, int length)
47 int16_t* t = (int16_t*) target;
48 for(int i = length - 1; i >= 0; i--)
49 t[i] = (((int16_t)source[i]) - AUD_U8_0) << 8;
52 void AUD_convert_u8_s24_be(data_t* target, data_t* source, int length)
54 for(int i = length - 1; i >= 0; i--)
56 target[i*3] = source[i] - AUD_U8_0;
62 void AUD_convert_u8_s24_le(data_t* target, data_t* source, int length)
64 for(int i = length - 1; i >= 0; i--)
66 target[i*3+2] = source[i] - AUD_U8_0;
72 void AUD_convert_u8_s32(data_t* target, data_t* source, int length)
74 int32_t* t = (int32_t*) target;
75 for(int i = length - 1; i >= 0; i--)
76 t[i] = (((int32_t)source[i]) - AUD_U8_0) << 24;
79 void AUD_convert_u8_float(data_t* target, data_t* source, int length)
81 float* t = (float*) target;
82 for(int i = length - 1; i >= 0; i--)
83 t[i] = (((int32_t)source[i]) - AUD_U8_0) / ((float)AUD_U8_0);
86 void AUD_convert_u8_double(data_t* target, data_t* source, int length)
88 double* t = (double*) target;
89 for(int i = length - 1; i >= 0; i--)
90 t[i] = (((int32_t)source[i]) - AUD_U8_0) / ((double)AUD_U8_0);
93 void AUD_convert_s16_u8(data_t* target, data_t* source, int length)
95 int16_t* s = (int16_t*) source;
96 for(int i = 0; i < length; i++)
97 target[i] = (unsigned char)((s[i] >> 8) + AUD_U8_0);
100 void AUD_convert_s16_s24_be(data_t* target, data_t* source, int length)
102 int16_t* s = (int16_t*) source;
104 for(int i = length - 1; i >= 0; i--)
107 target[i*3] = t >> 8 & 0xFF;
108 target[i*3+1] = t & 0xFF;
113 void AUD_convert_s16_s24_le(data_t* target, data_t* source, int length)
115 int16_t* s = (int16_t*) source;
117 for(int i = length - 1; i >= 0; i--)
120 target[i*3+2] = t >> 8 & 0xFF;
121 target[i*3+1] = t & 0xFF;
126 void AUD_convert_s16_s32(data_t* target, data_t* source, int length)
128 int16_t* s = (int16_t*) source;
129 int32_t* t = (int32_t*) target;
130 for(int i = length - 1; i >= 0; i--)
131 t[i] = ((int32_t)s[i]) << 16;
134 void AUD_convert_s16_float(data_t* target, data_t* source, int length)
136 int16_t* s = (int16_t*) source;
137 float* t = (float*) target;
138 for(int i = length - 1; i >= 0; i--)
139 t[i] = s[i] / AUD_S16_FLT;
142 void AUD_convert_s16_double(data_t* target, data_t* source, int length)
144 int16_t* s = (int16_t*) source;
145 double* t = (double*) target;
146 for(int i = length - 1; i >= 0; i--)
147 t[i] = s[i] / AUD_S16_FLT;
150 void AUD_convert_s24_u8_be(data_t* target, data_t* source, int length)
152 for(int i = 0; i < length; i++)
153 target[i] = source[i*3] ^ AUD_U8_0;
156 void AUD_convert_s24_u8_le(data_t* target, data_t* source, int length)
158 for(int i = 0; i < length; i++)
159 target[i] = source[i*3+2] ^ AUD_U8_0;
162 void AUD_convert_s24_s16_be(data_t* target, data_t* source, int length)
164 int16_t* t = (int16_t*) target;
165 for(int i = 0; i < length; i++)
166 t[i] = source[i*3] << 8 | source[i*3+1];
169 void AUD_convert_s24_s16_le(data_t* target, data_t* source, int length)
171 int16_t* t = (int16_t*) target;
172 for(int i = 0; i < length; i++)
173 t[i] = source[i*3+2] << 8 | source[i*3+1];
176 void AUD_convert_s24_s24(data_t* target, data_t* source, int length)
178 memcpy(target, source, length * 3);
181 void AUD_convert_s24_s32_be(data_t* target, data_t* source, int length)
183 int32_t* t = (int32_t*) target;
184 for(int i = length - 1; i >= 0; i--)
185 t[i] = source[i*3] << 24 | source[i*3+1] << 16 | source[i*3+2] << 8;
188 void AUD_convert_s24_s32_le(data_t* target, data_t* source, int length)
190 int32_t* t = (int32_t*) target;
191 for(int i = length - 1; i >= 0; i--)
192 t[i] = source[i*3+2] << 24 | source[i*3+1] << 16 | source[i*3] << 8;
195 void AUD_convert_s24_float_be(data_t* target, data_t* source, int length)
197 float* t = (float*) target;
199 for(int i = length - 1; i >= 0; i--)
201 s = source[i*3] << 24 | source[i*3+1] << 16 | source[i*3+2] << 8;
202 t[i] = s / AUD_S32_FLT;
206 void AUD_convert_s24_float_le(data_t* target, data_t* source, int length)
208 float* t = (float*) target;
210 for(int i = length - 1; i >= 0; i--)
212 s = source[i*3+2] << 24 | source[i*3+1] << 16 | source[i*3] << 8;
213 t[i] = s / AUD_S32_FLT;
217 void AUD_convert_s24_double_be(data_t* target, data_t* source, int length)
219 double* t = (double*) target;
221 for(int i = length - 1; i >= 0; i--)
223 s = source[i*3] << 24 | source[i*3+1] << 16 | source[i*3+2] << 8;
224 t[i] = s / AUD_S32_FLT;
228 void AUD_convert_s24_double_le(data_t* target, data_t* source, int length)
230 double* t = (double*) target;
232 for(int i = length - 1; i >= 0; i--)
234 s = source[i*3+2] << 24 | source[i*3+1] << 16 | source[i*3] << 8;
235 t[i] = s / AUD_S32_FLT;
239 void AUD_convert_s32_u8(data_t* target, data_t* source, int length)
241 int16_t* s = (int16_t*) source;
242 for(int i = 0; i < length; i++)
243 target[i] = (unsigned char)((s[i] >> 24) + AUD_U8_0);
246 void AUD_convert_s32_s16(data_t* target, data_t* source, int length)
248 int16_t* t = (int16_t*) target;
249 int32_t* s = (int32_t*) source;
250 for(int i = 0; i < length; i++)
254 void AUD_convert_s32_s24_be(data_t* target, data_t* source, int length)
256 int32_t* s = (int32_t*) source;
258 for(int i = 0; i < length; i++)
261 target[i*3] = t >> 24 & 0xFF;
262 target[i*3+1] = t >> 16 & 0xFF;
263 target[i*3+2] = t >> 8 & 0xFF;
267 void AUD_convert_s32_s24_le(data_t* target, data_t* source, int length)
269 int32_t* s = (int32_t*) source;
271 for(int i = 0; i < length; i++)
274 target[i*3+2] = t >> 24 & 0xFF;
275 target[i*3+1] = t >> 16 & 0xFF;
276 target[i*3] = t >> 8 & 0xFF;
280 void AUD_convert_s32_float(data_t* target, data_t* source, int length)
282 int32_t* s = (int32_t*) source;
283 float* t = (float*) target;
284 for(int i = 0; i < length; i++)
285 t[i] = s[i] / AUD_S32_FLT;
288 void AUD_convert_s32_double(data_t* target, data_t* source, int length)
290 int32_t* s = (int32_t*) source;
291 double* t = (double*) target;
292 for(int i = length - 1; i >= 0; i--)
293 t[i] = s[i] / AUD_S32_FLT;
296 void AUD_convert_float_u8(data_t* target, data_t* source, int length)
298 float* s = (float*) source;
300 for(int i = 0; i < length; i++)
302 t = s[i] + AUD_FLT_MAX;
308 target[i] = (unsigned char)(t*127);
312 void AUD_convert_float_s16(data_t* target, data_t* source, int length)
314 int16_t* t = (int16_t*) target;
315 float* s = (float*) source;
316 for(int i = 0; i < length; i++)
318 if(s[i] <= AUD_FLT_MIN)
320 else if(s[i] >= AUD_FLT_MAX)
323 t[i] = (int16_t)(s[i] * AUD_S16_MAX);
327 void AUD_convert_float_s24_be(data_t* target, data_t* source, int length)
330 float* s = (float*) source;
331 for(int i = 0; i < length; i++)
333 if(s[i] <= AUD_FLT_MIN)
335 else if(s[i] >= AUD_FLT_MAX)
338 t = (int32_t)(s[i]*AUD_S32_MAX);
339 target[i*3] = t >> 24 & 0xFF;
340 target[i*3+1] = t >> 16 & 0xFF;
341 target[i*3+2] = t >> 8 & 0xFF;
345 void AUD_convert_float_s24_le(data_t* target, data_t* source, int length)
348 float* s = (float*) source;
349 for(int i = 0; i < length; i++)
351 if(s[i] <= AUD_FLT_MIN)
353 else if(s[i] >= AUD_FLT_MAX)
356 t = (int32_t)(s[i]*AUD_S32_MAX);
357 target[i*3+2] = t >> 24 & 0xFF;
358 target[i*3+1] = t >> 16 & 0xFF;
359 target[i*3] = t >> 8 & 0xFF;
363 void AUD_convert_float_s32(data_t* target, data_t* source, int length)
365 int32_t* t = (int32_t*) target;
366 float* s = (float*) source;
367 for(int i = 0; i < length; i++)
369 if(s[i] <= AUD_FLT_MIN)
371 else if(s[i] >= AUD_FLT_MAX)
374 t[i] = (int32_t)(s[i]*AUD_S32_MAX);
378 void AUD_convert_float_double(data_t* target, data_t* source, int length)
380 float* s = (float*) source;
381 double* t = (double*) target;
382 for(int i = length - 1; i >= 0; i++)
386 void AUD_convert_double_u8(data_t* target, data_t* source, int length)
388 double* s = (double*) source;
390 for(int i = 0; i < length; i++)
392 t = s[i] + AUD_FLT_MAX;
398 target[i] = (unsigned char)(t*127);
402 void AUD_convert_double_s16(data_t* target, data_t* source, int length)
404 int16_t* t = (int16_t*) target;
405 double* s = (double*) source;
406 for(int i = 0; i < length; i++)
408 if(s[i] <= AUD_FLT_MIN)
410 else if(s[i] >= AUD_FLT_MAX)
413 t[i] = (int16_t)(s[i]*AUD_S16_MAX);
417 void AUD_convert_double_s24_be(data_t* target, data_t* source, int length)
420 double* s = (double*) source;
421 for(int i = 0; i < length; i++)
423 if(s[i] <= AUD_FLT_MIN)
425 else if(s[i] >= AUD_FLT_MAX)
428 t = (int32_t)(s[i]*AUD_S32_MAX);
429 target[i*3] = t >> 24 & 0xFF;
430 target[i*3+1] = t >> 16 & 0xFF;
431 target[i*3+2] = t >> 8 & 0xFF;
435 void AUD_convert_double_s24_le(data_t* target, data_t* source, int length)
438 double* s = (double*) source;
439 for(int i = 0; i < length; i++)
441 if(s[i] <= AUD_FLT_MIN)
443 else if(s[i] >= AUD_FLT_MAX)
446 t = (int32_t)(s[i]*AUD_S32_MAX);
447 target[i*3+2] = t >> 24 & 0xFF;
448 target[i*3+1] = t >> 16 & 0xFF;
449 target[i*3] = t >> 8 & 0xFF;
453 void AUD_convert_double_s32(data_t* target, data_t* source, int length)
455 int32_t* t = (int32_t*) target;
456 double* s = (double*) source;
457 for(int i = 0; i < length; i++)
459 if(s[i] <= AUD_FLT_MIN)
461 else if(s[i] >= AUD_FLT_MAX)
464 t[i] = (int32_t)(s[i]*AUD_S32_MAX);
468 void AUD_convert_double_float(data_t* target, data_t* source, int length)
470 double* s = (double*) source;
471 float* t = (float*) target;
472 for(int i = 0; i < length; i++)