source: roaraudio/libroardsp/convert.c @ 4129:7e48d8df51a3

Last change on this file since 4129:7e48d8df51a3 was 4129:7e48d8df51a3, checked in by phi, 14 years ago

fixed resampler code finnaly, thanks to maister for patches

File size: 29.7 KB
Line 
1//convert.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2010
5 *      Copyright (C) Hans-Kristian 'maister' Arntzen - 2010
6 *
7 *  This file is part of libroar a part of RoarAudio,
8 *  a cross-platform sound system for both, home and professional use.
9 *  See README for details.
10 *
11 *  This file is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License version 3
13 *  as published by the Free Software Foundation.
14 *
15 *  libroar 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.
19 *
20 *  You should have received a copy of the GNU General Public License
21 *  along with this software; see the file COPYING.  If not, write to
22 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
23 *  Boston, MA 02110-1301, USA.
24 *
25 *  NOTE for everyone want's to change something and send patches:
26 *  read README and HACKING! There a addition information on
27 *  the license of this document you need to read before you send
28 *  any patches.
29 *
30 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
31 *  or libpulse*:
32 *  The libs libroaresd, libroararts and libroarpulse link this lib
33 *  and are therefore GPL. Because of this it may be illigal to use
34 *  them with any software that uses libesd, libartsc or libpulse*.
35 */
36
37#include "libroardsp.h"
38//#define free(p) {ROAR_WARN("free(%p) = ?", (p)); free((p)); ROAR_WARN("free(%p): OK", (p));}
39
40int roar_conv_bits (void * out, void * in, int samples, int from, int to) {
41 int format;
42
43 if ( from == to ) {
44  if ( in == out )
45   return 0;
46
47  memcpy(out, in, samples * from / 8);
48  return 0;
49 }
50
51 format = ((from / 8) << 4) + (to / 8);
52
53 switch (format) {
54  case 0x12: return roar_conv_bits_8to16( out, in, samples);
55  case 0x14: return roar_conv_bits_8to32( out, in, samples);
56  case 0x21: return roar_conv_bits_16to8( out, in, samples);
57  case 0x24: return roar_conv_bits_16to32(out, in, samples);
58  case 0x34: return roar_conv_bits_24to32(out, in, samples);
59  case 0x41: return roar_conv_bits_32to8( out, in, samples);
60  case 0x42: return roar_conv_bits_32to16(out, in, samples);
61  default:
62   errno = ENOSYS;
63   return -1;
64 }
65
66 return -1;
67}
68
69int roar_conv_bits_8to16 (void * out, void * in, int samples) {
70 char    * ip = (char   *)in;
71 int16_t * op = (int16_t*)out;
72 int i;
73
74 for (i = samples - 1; i >= 0; i--)
75  op[i] = ip[i] << 8;
76
77 return 0;
78}
79
80int roar_conv_bits_8to32  (void * out, void * in, int samples) {
81 char    * ip = (char   *)in;
82 int32_t * op = (int32_t*)out;
83 int i;
84
85 for (i = samples - 1; i >= 0; i--)
86  op[i] = (int32_t) ip[i] << 24;
87
88 return 0;
89}
90
91int roar_conv_bits_16to8 (void * out, void * in, int samples) {
92 int16_t * ip = (int16_t*)in;
93 char    * op = (char   *)out;
94 int i;
95
96 ROAR_DBG("roar_conv_bits_16to8(out=%p, in=%p, samples=%i) = ?", out, in, samples);
97
98 for (i = 0; i < samples; i++)
99  op[i] = ip[i] >> 8;
100
101 return 0;
102}
103
104int roar_conv_bits_16to32 (void * out, void * in, int samples) {
105 int16_t * ip = (int16_t*)in;
106 int32_t * op = (int32_t*)out;
107 int i;
108
109 for (i = samples - 1; i >= 0; i--)
110  op[i] = (int32_t) ip[i] << 16;
111
112 return 0;
113}
114
115int roar_conv_bits_24to32 (void * out, void * in, int samples) {
116 uint8_t * ip = (uint8_t*)in;
117 int32_t * op = (int32_t*)out;
118 int i;
119 union {
120  int32_t i;
121  uint8_t c[4];
122 } t;
123
124 ROAR_DBG("roar_conv_bits_24to32(out=%p, in=%p, samples=%i) = ?", out, in, samples);
125
126#if (BYTE_ORDER == BIG_ENDIAN) || (BYTE_ORDER == LITTLE_ENDIAN)
127 t.i = 0;
128#else
129  ROAR_DBG("roar_conv_bits_24to32(out=%p, in=%p, samples=%i) = -1", out, in, samples);
130  return -1;
131#endif
132
133 samples--;
134 ip += 3 * samples;
135
136 for (i = samples; i >= 0; i--) {
137#if BYTE_ORDER == BIG_ENDIAN
138  t.c[0] = *(ip--);
139  t.c[1] = *(ip--);
140  t.c[2] = *(ip--);
141#elif BYTE_ORDER == LITTLE_ENDIAN
142  t.c[2] = *(ip--);
143  t.c[3] = *(ip--);
144  t.c[1] = *(ip--);
145#endif
146  ROAR_DBG("roar_conv_bits_24to32(*): i=%i, t.i=0x%.8X", i, t.i);
147  op[i] = t.i;
148 }
149
150 ROAR_DBG("roar_conv_bits_24to32(out=%p, in=%p, samples=%i) = 0", out, in, samples);
151 return 0;
152}
153
154int roar_conv_bits_32to8 (void * out, void * in, int samples) {
155 int32_t * ip = (int32_t*)in;
156 char    * op = (char   *)out;
157 int i;
158
159 for (i = 0; i < samples; i++)
160  op[i] = ip[i] >> 24;
161
162 return 0;
163}
164
165int roar_conv_bits_32to16 (void * out, void * in, int samples) {
166 int32_t * ip = (int32_t*)in;
167 int16_t * op = (int16_t*)out;
168 int i;
169
170 for (i = 0; i < samples; i++)
171  op[i] = ip[i] >> 16;
172
173 return 0;
174}
175
176int roar_conv_chans (void * out, void * in, int samples, int from, int to, int bits) {
177 if ( from == to ) {
178  if ( in == out )
179   return 0;
180
181  memcpy(out, in, samples * from * bits / 8);
182  return 0;
183 }
184
185 switch (bits) {
186  case 8:
187   switch (from) {
188    case 1:
189     switch (to) {
190      case  2: return roar_conv_chans_1to28(out, in, samples);
191      default: return roar_conv_chans_1ton8(out, in, samples, to);
192     }
193     break;
194    case 2:
195     switch (to) {
196      case  1: return roar_conv_chans_2to18(out, in, samples);
197      default: return -1;
198     }
199     break;
200    default:
201     switch (to) {
202      case  1: return roar_conv_chans_nto18(out, in, samples, from);
203      default: return -1;
204     }
205   }
206  break;
207  case 16:
208   switch (from) {
209    case 1:
210     switch (to) {
211      case  2: return roar_conv_chans_1to216(out, in, samples);
212      default: return roar_conv_chans_1ton16(out, in, samples, to);
213     }
214     break;
215    case 2:
216     switch (to) {
217      case  1: return roar_conv_chans_2to116(out, in, samples);
218      case  3: return roar_conv_chans_2to316(out, in, samples);
219      case  4: return roar_conv_chans_2to416(out, in, samples);
220      case  5: return roar_conv_chans_2to516(out, in, samples);
221      case  6: return roar_conv_chans_2to616(out, in, samples);
222      default: return -1;
223     }
224     break;
225    case 4:
226     switch (to) {
227      case  1: return roar_conv_chans_nto116(out, in, samples, 4);
228      case  2: return roar_conv_chans_4to216(out, in, samples);
229      default: return -1;
230     }
231     break;
232    default:
233     switch (to) {
234      case  1: return roar_conv_chans_nto116(out, in, samples, from);
235      default: return -1;
236     }
237   }
238  break;
239  default: return -1;
240 }
241
242 return -1;
243}
244
245int roar_conv_chans_1ton8  (void * out, void * in, int samples, int to) {
246 char * ip = (char*) in, * op = (char*) out;
247 int i;
248 int c;
249
250 for (i = samples - 1; i >= 0; i--)
251  for (c = to - 1; c >= 0; c--)
252   op[i*to + c] = ip[i];
253
254 return 0;
255}
256
257int roar_conv_chans_1to28  (void * out, void * in, int samples) {
258 char * ip = (char*) in, * op = (char*) out;
259 int i, h;
260
261 samples--;
262
263 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
264  op[i + 0] = ip[h];
265  op[i + 1] = ip[h];
266 }
267
268 return 0;
269}
270
271int roar_conv_chans_1ton16 (void * out, void * in, int samples, int to) {
272 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
273 int i;
274 int c;
275
276 for (i = samples - 1; i >= 0; i--)
277  for (c = to - 1; c >= 0; c--)
278   op[i*to + c] = ip[i];
279
280 return 0;
281}
282
283int roar_conv_chans_1to216 (void * out, void * in, int samples) {
284 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
285 int i, h;
286
287 samples--;
288
289 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
290  op[i + 0] = ip[h];
291  op[i + 1] = ip[h];
292 }
293
294 return 0;
295}
296
297int roar_conv_chans_nto18  (void * out, void * in, int samples, int from) {
298 int8_t * ip = (int8_t*) in, * op = (int8_t*) out;
299 int i;
300 int c;
301 register int s;
302
303 samples /= from;
304
305 for (i = 0; i < samples; i++) {
306  s  = 0;
307
308  for (c = 0; c < from; c++)
309   s += ip[i*from + c];
310
311  s /= from;
312  op[i] = s;
313 }
314
315 return 0;
316}
317
318int roar_conv_chans_2to18  (void * out, void * in, int samples) {
319 int8_t * ip = (int8_t*) in, * op = (int8_t*) out;
320 int i, h;
321
322 for (h = i = 0; i < samples; i += 2, h++)
323  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
324
325 return 0;
326}
327
328int roar_conv_chans_nto116 (void * out, void * in, int samples, int from) {
329 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
330 int i;
331 int c;
332 register int s;
333
334 samples /= from;
335
336 for (i = 0; i < samples; i++) {
337  s  = 0;
338
339  for (c = 0; c < from; c++)
340   s += ip[i*from + c];
341
342  s /= from;
343  op[i] = s;
344 }
345
346 return 0;
347}
348
349int roar_conv_chans_2to116  (void * out, void * in, int samples) {
350 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
351 int i, h;
352
353 ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i) = ?", out, in, samples);
354
355 for (h = i = 0; i < samples; i += 2, h++) {
356  ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i): op[%i] = (ip[%i] + ip[%i])/2", out, in, samples, h, i, i+1);
357  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
358 }
359
360 return 0;
361}
362
363int roar_conv_chans_2to38  (void * out, void * in, int samples);
364int roar_conv_chans_2to316 (void * out, void * in, int samples) {
365 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
366 int i, h;
367
368 samples -= 2;
369
370 i  = samples;
371 h  = (samples / 2) * 3;
372
373 for (; i >= 0; i -= 2, h -= 3) {
374  op[h+0] = ip[i+0];
375  op[h+1] = ip[i+1];
376  op[h+2] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
377 }
378
379 return 0;
380}
381
382int roar_conv_chans_2to48  (void * out, void * in, int samples);
383int roar_conv_chans_2to416 (void * out, void * in, int samples) {
384 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
385 int i, h;
386
387 samples -= 2;
388
389 i  = samples;
390 h  = (samples / 2) * 4;
391
392 for (; i >= 0; i -= 2, h -= 4) {
393  op[h+0] = ip[i+0];
394  op[h+1] = ip[i+1];
395  op[h+2] = ip[i+0];
396  op[h+3] = ip[i+1];
397 }
398
399 return 0;
400}
401
402int roar_conv_chans_2to58  (void * out, void * in, int samples);
403int roar_conv_chans_2to516 (void * out, void * in, int samples) {
404 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
405 int i, h;
406
407 samples -= 2;
408
409 i  = samples;
410 h  = (samples / 2) * 5;
411
412 for (; i >= 0; i -= 2, h -= 5) {
413  op[h+0] = ip[i+0];
414  op[h+1] = ip[i+1];
415  op[h+2] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
416  op[h+3] = ip[i+0];
417  op[h+4] = ip[i+1];
418 }
419
420 return 0;
421}
422int roar_conv_chans_2to68  (void * out, void * in, int samples);
423int roar_conv_chans_2to616 (void * out, void * in, int samples) {
424 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
425 int i, h;
426
427 samples -= 2;
428
429 i  = samples;
430 h  = (samples / 2) * 6;
431
432 for (; i >= 0; i -= 2, h -= 6) {
433  op[h+0] = ip[i+0];
434  op[h+1] = ip[i+1];
435  op[h+2] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
436  op[h+3] = op[h+2];
437  op[h+4] = ip[i+0];
438  op[h+5] = ip[i+1];
439 }
440
441 return 0;
442}
443
444int roar_conv_chans_3to28  (void * out, void * in, int samples);
445int roar_conv_chans_3to216 (void * out, void * in, int samples);
446int roar_conv_chans_4to28  (void * out, void * in, int samples);
447int roar_conv_chans_4to216 (void * out, void * in, int samples) {
448 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
449 int i, h;
450
451 samples -= 4;
452
453 for (i = h = 0; i < samples; i += 4, h += 2) {
454  op[h+0] = ((int)ip[i + 0] + (int)ip[i + 2]) / 2;
455  op[h+1] = ((int)ip[i + 1] + (int)ip[i + 3]) / 2;
456 }
457
458 return 0;
459}
460
461int roar_conv_chans_5to28  (void * out, void * in, int samples);
462int roar_conv_chans_5to216 (void * out, void * in, int samples);
463int roar_conv_chans_6to28  (void * out, void * in, int samples);
464int roar_conv_chans_6to216 (void * out, void * in, int samples);
465
466
467
468int roar_conv_rate (void * out, void * in, int samples, int from, int to, int bits, int channels) {
469#ifdef ROAR_HAVE_LIBSAMPLERATE
470 return roar_conv_rate_SRC(out, in, samples, from, to, bits, channels);
471#else
472 if ( bits == 8  )
473  return roar_conv_rate_8(out, in, samples, from, to, channels);
474
475 if ( bits == 16 )
476  return roar_conv_rate_16(out, in, samples, from, to, channels);
477
478 return -1;
479#endif
480}
481
482int roar_conv_rate_8  (void * out, void * in, int samples, int from, int to, int channels) {
483 return -1;
484}
485
486int roar_conv_rate_16 (void * out, void * in, int samples, int from, int to, int channels) {
487 if ( from > to ) {
488  switch (channels) {
489   case 1:
490     return roar_conv_rate_161zoh(out, in, samples, from, to);
491   case 2:
492     return roar_conv_rate_162zoh(out, in, samples, from, to);
493   default:
494     return -1;
495  }
496 } else {
497  if ( channels == 1 ) {
498   printf("roar_conv_rate_16(): samples=%i -> %i, rate=%i -> %i\n", samples*from/to, samples, from, to);
499   return roar_conv_poly4_16s((int16_t*) out, (int16_t*) in, samples, samples*from/to, (float)from/to);
500 //  return roar_conv_poly4_16((int16_t*) out, (int16_t*) in, samples*to/from, samples);
501  }
502 }
503
504 return -1;
505}
506
507int roar_conv_rate_161zoh(void * out, void * in, int samples, int from, int to) {
508 int16_t * ip = in;
509 int16_t * op = out;
510 float t = 0;
511 float step = (float)to/from;
512 int i;
513
514 for (i= 0; i < samples; i++) {
515  op[(int)t] = ip[i];
516  t += step;
517 }
518
519 return 0;
520}
521
522int roar_conv_rate_162zoh(void * out, void * in, int samples, int from, int to) {
523 int16_t * ip = in;
524 int16_t * op = out;
525 float t = 0;
526 float step = (float)to/from;
527 int i;
528
529 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples);
530 samples /= 2;
531// samples -= 1;
532 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples);
533
534 for (i= 0; i < samples; i++) {
535  ROAR_DBG("roar_conv_rate_162zoh(*): t=%f, i=%i // op[%i] = ip[%i]", t, i, 2*(int)t, 2*i);
536  op[2*(int)t    ] = ip[2*i    ];
537  op[2*(int)t + 1] = ip[2*i + 1];
538  t += step;
539 }
540
541 return 0;
542}
543
544int roar_conv_rate_SRC   (void * out, void * in, int samples, int from, int to, int bits, int channels) {
545#ifdef ROAR_HAVE_LIBSAMPLERATE
546 double radio = (double) to / (double) from;
547 int outsamples = radio * samples;
548 float * inf  = roar_mm_malloc(samples*sizeof(float));
549 float * outf = roar_mm_malloc(outsamples*sizeof(float));
550 int i;
551 SRC_DATA srcdata;
552
553 ROAR_DBG("roar_conv_rate_SRC(*): radio=%lf, samples=%i, outsamples=%i", radio, samples, outsamples);
554
555 if ( inf == NULL ) {
556  if ( outf != NULL )
557   roar_mm_free(outf);
558
559  return -1;
560 }
561
562 if ( outf == NULL ) {
563  if ( inf != NULL )
564   roar_mm_free(inf);
565
566  return -1;
567 }
568
569 switch (bits) {
570  case  8:
571    for (i = 0; i < samples; i++)
572     inf[i] = *(((int8_t *)in)+i) / 128.0;
573   break;
574  case 16:
575    for (i = 0; i < samples; i++)
576     inf[i] = *(((int16_t*)in)+i) / 32768.0;
577   break;
578  case 32:
579    for (i = 0; i < samples; i++)
580     inf[i] = *(((int32_t*)in)+i) / 2147483648.0;
581   break;
582  default:
583    roar_mm_free(outf);
584    roar_mm_free(inf);
585    return -1;
586 }
587
588 srcdata.data_in       = inf;
589 srcdata.data_out      = outf;
590 srcdata.input_frames  = samples/channels;
591 srcdata.output_frames = outsamples/channels;
592 srcdata.src_ratio     = radio;
593
594 if ( src_simple(&srcdata, SRC_ZERO_ORDER_HOLD, channels) != 0 ) {
595  roar_mm_free(outf);
596  roar_mm_free(inf);
597  return -1;
598 }
599
600 switch (bits) {
601  case  8:
602    for (i = 0; i < outsamples; i++)
603     *(((int8_t *)out)+i) = outf[i] * 128.0;
604   break;
605  case 16:
606    for (i = 0; i < outsamples; i++)
607     *(((int16_t*)out)+i) = outf[i] * 32768.0;
608   break;
609  case 32:
610    for (i = 0; i < outsamples; i++)
611     *(((int32_t*)out)+i) = outf[i] * 2147483648.0;
612   break;
613   // no errors here, they are handled above
614 }
615
616 roar_mm_free(outf);
617 roar_mm_free(inf);
618
619 return 0;
620#else
621 return -1;
622#endif
623}
624
625int roar_conv_rate2      (void * out, void * in, int outsamples, int samples, int bits, int channels) {
626 ROAR_DBG("roar_conv_rate2(out=%p, in=%p, samples=%i, outsamples=%i, bits=%i, channels=%i) = ?", out, in, samples, outsamples, bits, channels);
627 switch (bits) {
628  case  8:
629    return roar_conv_poly3_8(out, in, outsamples, samples, channels);
630   break;
631  case 16:
632    return roar_conv_poly3_16(out, in, outsamples, samples, channels);
633   break;
634  case 32:
635    return roar_conv_poly3_32(out, in, outsamples, samples, channels);
636   break;
637 }
638 return -1;
639}
640
641int roar_conv_signedness  (void * out, void * in, int samples, int from, int to, int bits) {
642
643 if ( from != to ) {
644  if ( from && !to ) {
645   switch (bits) {
646    case  8: roar_conv_codec_s2u8( out, in, samples); break;
647    case 16: roar_conv_codec_s2u16(out, in, samples); break;
648    case 32: roar_conv_codec_s2u32(out, in, samples); break;
649    default:
650     errno = ENOSYS;
651     return -1;
652   }
653  } else if ( !from && to ) {
654   switch (bits) {
655    case  8: roar_conv_codec_u2s8( out, in, samples); break;
656    case 16: roar_conv_codec_u2s16(out, in, samples); break;
657    case 32: roar_conv_codec_u2s32(out, in, samples); break;
658    default:
659     errno = ENOSYS;
660     return -1;
661   }
662  } else {
663   return -1;
664  }
665 } else {
666  if ( out == in )
667   return 0;
668
669  memcpy(out, in, samples * bits / 8);
670  return 0;
671 }
672
673 return 0;
674}
675
676int roar_conv_codec (void * out, void * in, int samples, int from, int to, int bits) {
677 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to);
678 int ins  = ROAR_CODEC_IS_SIGNED(from),  outs  = ROAR_CODEC_IS_SIGNED(to);
679 void * nin = in;
680
681
682 ROAR_DBG("roar_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?",
683              out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits);
684
685 roar_conv_endian(out, in, samples, inbo, outbo, bits);
686 nin = out;
687
688 return roar_conv_signedness(out, in, samples, ins, outs, bits);
689}
690
691int roar_conv_codec_s2u8 (void * out, void * in, int samples) {
692 char * ip = in;
693 unsigned char * op = out;
694 int i;
695
696 for(i = 0; i < samples; i++)
697  op[i] = ip[i] + 128;
698
699 return 0;
700}
701
702int roar_conv_codec_s2u16 (void * out, void * in, int samples) {
703 int16_t  * ip = in;
704 uint16_t * op = out;
705 int i;
706
707 for(i = 0; i < samples; i++)
708  op[i] = ip[i] + 32768;
709
710 return 0;
711}
712
713int roar_conv_codec_s2u32 (void * out, void * in, int samples) {
714 int32_t  * ip = in;
715 uint32_t * op = out;
716 int i;
717
718 for(i = 0; i < samples; i++)
719  op[i] = ip[i] + 2147483648U;
720
721 return 0;
722}
723
724int roar_conv_codec_u2s8 (void * out, void * in, int samples) {
725 unsigned char * ip = in;
726          char * op = out;
727 int i;
728
729 for(i = 0; i < samples; i++)
730  op[i] = ip[i] - 128;
731
732 return 0;
733}
734
735int roar_conv_codec_u2s16 (void * out, void * in, int samples) {
736 uint16_t  * ip = in;
737 int16_t   * op = out;
738 int i;
739
740 for(i = 0; i < samples; i++)
741  op[i] = ip[i] - 32768;
742
743 return 0;
744}
745
746int roar_conv_codec_u2s32 (void * out, void * in, int samples) {
747 uint32_t  * ip = in;
748 int32_t   * op = out;
749 int i;
750
751 for(i = 0; i < samples; i++)
752  op[i] = ip[i] - 2147483648U;
753
754 return 0;
755}
756
757
758int roar_conv_endian      (void * out, void * in, int samples, int from, int to, int bits) {
759
760 if ( bits == 8 ) {
761  from = to = ROAR_CODEC_NATIVE_ENDIAN;
762
763 } else if ( bits == 16 ) {
764  if ( from  == ROAR_CODEC_PDP )
765   from = ROAR_CODEC_LE;
766  if ( to    == ROAR_CODEC_PDP )
767   to   = ROAR_CODEC_LE;
768 }
769
770 ROAR_DBG("roar_conv_endian(out=%p, in=%p, samples=%i, from=%i, to=%i, bits=%i) = ?", out, in, samples, from, to, bits);
771
772 if ( from == to ) {
773  if ( in != out ) {
774   memcpy(out, in, samples * bits / 8);
775  }
776  return 0;
777 } else {
778  switch (bits) {
779   case 16:
780     // in this case we can only have LE vs. BE, so, only need to swap:
781     ROAR_DBG("roar_conv_endian(*): Doing 16 bit byteswap");
782     return roar_conv_endian_16(out, in, samples);
783    break;
784   case 24:
785     if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) {
786      return roar_conv_endian_24(out, in, samples);
787     } else { // what the hell is PDP eddines in 24 bit mode?
788      return -1;
789     }
790    break;
791   case 32:
792    if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) {
793     return roar_conv_endian_32(out, in, samples);
794    } else { // need to handle 32 PDP eddines here?
795     if ( from == ROAR_CODEC_BE )
796      if ( roar_conv_endian_32(out, in, samples) == -1 )
797       return -1;
798
799     if ( roar_conv_endian_16(out, in, samples*2) == -1 )
800      return -1;
801
802     if ( to == ROAR_CODEC_BE )
803      if ( roar_conv_endian_32(out, in, samples) == -1 )
804       return -1;
805
806     return 0;
807    }
808    break;
809   default:
810     return -1;
811    break;
812  }
813 }
814
815 return -1;
816}
817
818
819int roar_conv_endian_16   (void * out, void * in, int samples) {
820 char          * ip = in;
821 char          * op = out;
822 register char   c;
823 int             i;
824
825 samples *= 2;
826
827 if ( out != in ) {
828//  printf("out != in\n");
829  for(i = 0; i < samples; i += 2) {
830//   printf("op[%i] = ip[%i]\nop[%i] = ip[%i]\n", i, i+1, i+1, i);
831   op[i  ] = ip[i+1];
832   op[i+1] = ip[i  ];
833  }
834 } else {
835//  printf("out == in\n");
836  for(i = 0; i < samples; i += 2) {
837   c       = ip[i+1];
838   op[i+1] = ip[i  ];
839   op[i  ] = c;
840  }
841 }
842
843 return 0;
844}
845
846int roar_conv_endian_24   (void * out, void * in, int samples) {
847 char          * ip = in;
848 char          * op = out;
849 register char   c;
850 int             i;
851
852 samples *= 3;
853
854 if ( out != in ) {
855//  printf("out != in\n");
856  for(i = 0; i < samples; i += 3) {
857//   printf("op[%i] = ip[%i]\nop[%i] = ip[%i]\n", i, i+1, i+1, i);
858   op[i  ] = ip[i+2];
859   op[i+2] = ip[i  ];
860  }
861 } else {
862//  printf("out == in\n");
863  for(i = 0; i < samples; i += 3) {
864   c       = ip[i+2];
865   op[i+2] = ip[i  ];
866   op[i  ] = c;
867  }
868 }
869
870 return 0;
871}
872
873int roar_conv_endian_32   (void * out, void * in, int samples) {
874 int32_t       * ip = in;
875 int32_t       * op = out;
876 union {
877  int32_t val;
878  char    data[4];
879 }               c, h;
880 int             i;
881
882 // may the holly optimizer save our souls!
883
884 ROAR_DBG("roar_conv_endian_32(out=%p, in=%p, samples=%i) = ?", out, in, samples);
885
886 for (i = 0; i < samples; i++) {
887  c.val     = ip[i];
888  h.data[0] = c.data[3];
889  h.data[1] = c.data[2];
890  h.data[2] = c.data[1];
891  h.data[3] = c.data[0];
892  op[i]     = h.val;
893 }
894
895 return 0;
896}
897
898int roar_conv       (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) {
899 void * ip = in;
900 void * real_out = NULL;
901 size_t from_size, to_size;
902
903 // TODO: decide how to work around both in and out beeing to small to hold all
904 //       data between the steps.
905 //       for the moment: guess out >= in
906
907 from_size = (from->bits * samples) / 8;
908 to_size   = (  to->bits * samples * to->rate * to->channels) / (8 * from->rate * from->channels);
909
910 ROAR_DBG("roar_conv(*): size: %i->%i", from_size, to_size);
911
912 if ( to_size < from_size ) {
913  real_out = out;
914
915  if ( (out = roar_mm_malloc(from_size)) == NULL )
916   return -1;
917
918  ROAR_DBG("roar_conv(*): roar_mm_malloc(%i)=%p", (int)from_size, out);
919 }
920
921 ROAR_DBG("roar_conv(*): bo conv: %i->%i(native)", ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN);
922
923 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
924  ROAR_DBG("roar_conv(*): doing bo input conv");
925  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, from->bits) == -1 ) {
926   if ( to_size < from_size )
927    roar_mm_free(out);
928   return -1;
929  } else {
930   ip = out;
931  }
932 }
933
934 if ( from->bits != to->bits ) {
935  if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) {
936   if ( to_size < from_size )
937    roar_mm_free(out);
938   return -1;
939  } else {
940   ip = out;
941  }
942 }
943
944 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) {
945  if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) {
946   if ( to_size < from_size )
947    roar_mm_free(out);
948   return -1;
949  } else {
950   ip = out;
951  }
952 }
953
954/*
955 if ( from->codec != to->codec ) {
956  if ( roar_conv_codec (out, ip, samples, from->codec, to->codec, to->bits) == -1 )
957   return -1;
958  else
959   ip = out;
960 }
961*/
962
963 if ( from->rate != to->rate ) {
964  if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) {
965   ROAR_DBG("roar_conv(*): failed to convert rate %i->%i (%ich%ibits)", from->rate, to->rate, to->bits, from->channels);
966   if ( to_size < from_size )
967    roar_mm_free(out);
968   return -1;
969  } else {
970   ip = out;
971   samples = (samples * to->rate) / from->rate;
972  }
973 }
974
975 if ( from->channels != to->channels ) {
976  if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) {
977   if ( to_size < from_size )
978    roar_mm_free(out);
979   return -1;
980  } else {
981   ip = out;
982  }
983 }
984
985 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
986  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) {
987   if ( to_size < from_size )
988    roar_mm_free(out);
989   return -1;
990  } else {
991   ip = out;
992  }
993 }
994
995 if ( to_size < from_size ) {
996  ROAR_DBG("roar_conv(*): memcpy(%p, %p, %i) = ?", real_out, out, (int)to_size);
997  memcpy(real_out, out, to_size);
998  roar_mm_free(out);
999  ROAR_DBG("roar_conv(*): free(%p): OK!", out);
1000 }
1001
1002 return 0;
1003}
1004
1005int roar_conv2(void * out, void * in,
1006               size_t inlen,
1007               struct roar_audio_info * from, struct roar_audio_info * to,
1008               size_t bufsize) {
1009 size_t samples;
1010// size_t needed_buffer;
1011 void   * cin = in;
1012 struct roar_audio_info cinfo;
1013 int    need_signed = 0;
1014 size_t outsamples;
1015
1016 memcpy(&cinfo, from, sizeof(cinfo));
1017
1018 ROAR_DBG("roar_conv2(out=%p, in=%p, inlen=%lu, from=%p{...}, to=%p{...}, bufsize=%lu", out, in, inlen, from, to, bufsize);
1019
1020/*
1021 if ( in != out ) {
1022  memset(out, 0xA0, bufsize);
1023 } else {
1024  ROAR_WARN("roar_conv2(*): in==out!");
1025  memset(out+inlen, 0xA0, bufsize-inlen);
1026 }
1027*/
1028
1029 // calculate number of input samples:
1030 samples = (inlen * 8) / (from->bits);
1031
1032 ROAR_DBG("roar_conv2(*): input samples: %i", samples);
1033
1034#if 0
1035 // calculate size per frame
1036 needed_buffer  = ROAR_MAX(from->channels, to->channels) * ROAR_MAX(from->bits, to->bits) / 8;
1037
1038 needed_buffer *= samples;
1039 needed_buffer /= from->channels;
1040
1041 if ( from->rate < to->rate )
1042  needed_buffer *= (float)to->rate/(float)from->rate;
1043
1044 ROAR_DBG("roar_conv2(*): needed_buffer=%u, bufsize=%u", needed_buffer, bufsize);
1045
1046 // check if we have enogth RAM to convert
1047 if ( needed_buffer > bufsize )
1048  return -1;
1049#endif
1050
1051 if ( from->rate != to->rate || from->channels != to->channels )
1052  need_signed = 1;
1053
1054  ROAR_DBG("roar_conv2(*): need_signed=%i", need_signed);
1055
1056 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
1057  ROAR_DBG("roar_conv2(*): doing bo input conv");
1058  if ( roar_conv_endian(out, cin, samples,
1059       ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, from->bits) == -1 ) {
1060   return -1;
1061  }
1062  cin = out;
1063 }
1064
1065 if ( to->bits > from->bits ) {
1066  ROAR_DBG("roar_conv2(*): bits: %i->%i", from->bits, to->bits);
1067  if ( roar_conv_bits(out, cin, samples, from->bits, to->bits) == -1 )
1068   return -1;
1069
1070  cin        = out;
1071  cinfo.bits = to->bits;
1072 }
1073
1074 if ( need_signed && ! ROAR_CODEC_IS_SIGNED(from->codec) ) {
1075  ROAR_DBG("roar_conv2(*): sign: unsigned->signed");
1076  if ( roar_conv_signedness(out, cin, samples,
1077                            ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec),
1078                            cinfo.bits) == -1 )
1079   return -1;
1080
1081  cin            = out;
1082  cinfo.codec    = ROAR_CODEC_PCM_S_LE; // just a signed PCM, which is of no intrest
1083 }
1084
1085 if ( to->channels > from->channels ) {
1086  ROAR_DBG("roar_conv2(*): channels: %i->%i", from->channels, to->channels);
1087  if ( roar_conv_chans(out, cin, samples, from->channels, to->channels, cinfo.bits) == -1 )
1088   return -1;
1089
1090  cin            = out;
1091  samples        = (samples * to->channels) / cinfo.channels;
1092  cinfo.channels = to->channels;
1093 }
1094
1095//--//
1096 if ( from->rate != to->rate ) {
1097  outsamples = bufsize;
1098
1099  ROAR_DBG("roar_conv2(*): outsamples=%llu", (long long unsigned int)outsamples);
1100
1101  if ( cinfo.channels != to->channels ) {
1102   outsamples *= cinfo.channels;
1103   outsamples /= to->channels;
1104  }
1105
1106  if ( cinfo.bits != to->bits ) {
1107   outsamples *= cinfo.bits;
1108   outsamples /= to->bits;
1109  }
1110
1111  outsamples /= cinfo.bits/8;
1112
1113  ROAR_DBG("roar_conv2(*): outsamples=%llu", (long long unsigned int)outsamples);
1114
1115  if ( roar_conv_rate2(out, cin, outsamples, samples, cinfo.bits, cinfo.channels) == -1 )
1116   return -1;
1117
1118  cin            = out;
1119  samples        = outsamples;
1120  cinfo.rate     = to->rate;
1121 }
1122
1123 if ( cinfo.channels != to->channels ) {
1124  ROAR_DBG("roar_conv2(*): channels: %i->%i", cinfo.channels, to->channels);
1125  if ( roar_conv_chans(out, cin, samples, cinfo.channels, to->channels, cinfo.bits) == -1 )
1126   return -1;
1127
1128  cin            = out;
1129  samples        = (samples * to->channels) / cinfo.channels;
1130  cinfo.channels = to->channels;
1131 }
1132
1133 if ( ROAR_CODEC_IS_SIGNED(cinfo.codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) {
1134  ROAR_DBG("roar_conv2(*): sign: ?(%i)->?(%i)", ROAR_CODEC_IS_SIGNED(cinfo.codec), ROAR_CODEC_IS_SIGNED(to->codec));
1135  if ( roar_conv_signedness(out, cin, samples,
1136                            ROAR_CODEC_IS_SIGNED(cinfo.codec), ROAR_CODEC_IS_SIGNED(to->codec),
1137                            cinfo.bits) == -1 )
1138   return -1;
1139
1140  cin            = out;
1141  cinfo.codec    = to->codec;
1142 }
1143
1144 if ( cinfo.bits != to->bits ) {
1145  ROAR_DBG("roar_conv2(*): bits: %i->%i", cinfo.bits, to->bits);
1146  if ( roar_conv_bits(out, cin, samples, cinfo.bits, to->bits) == -1 )
1147   return -1;
1148
1149  cin        = out;
1150  cinfo.bits = to->bits;
1151 }
1152
1153 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
1154  ROAR_DBG("roar_conv2(*): doing bo output conv");
1155  if ( roar_conv_endian(out, cin, samples,
1156       ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) {
1157   return -1;
1158  }
1159  cin = out;
1160 }
1161
1162 ROAR_DBG("roar_conv2(*): samples=%llu", (long long unsigned int)samples);
1163
1164 ROAR_DBG("roar_conv2(*) = 0");
1165 return 0;
1166}
1167
1168int roar_conv_poly4_16 (int16_t * out, int16_t * in, size_t olen, size_t ilen) {
1169 return roar_conv_poly4_16s(out, in, olen, ilen, (float)ilen/olen);
1170}
1171
1172int roar_conv_poly4_16s (int16_t * out, int16_t * in, size_t olen, size_t ilen, float step) {
1173 float poly[4];
1174 float data[4];
1175 float t    = 0;
1176 int16_t * ci = in;
1177 int io, ii = 0;
1178 int i;
1179
1180 printf("step=%f\n", step);
1181
1182 // we can not make a poly4 with less than 4 points ;)
1183 if ( ilen < 4 )
1184  return -1;
1185
1186 for (i = 0; i < 4; i++)
1187  data[i] = ci[i];
1188 roar_math_mkpoly_4x4(poly, data);
1189/*
1190 printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
1191         data[0], data[1], data[2], data[3],
1192         poly[0], poly[1], poly[2], poly[3]
1193       );
1194*/
1195
1196 //0 1 2 3
1197
1198 for (io = 0; io < olen; io++) {
1199//  printf("t=%f\n", t);
1200  out[io] = roar_math_cvpoly_4x4(poly, t);
1201  t += step;
1202  if ( t > 2 ) { // we need a new ploynome
1203 //  printf("t > 2, need new data\n");
1204   if ( (ii + 4) < ilen ) { // else: end of block.
1205    t -= 1;
1206//    printf("new data: ii=%i\n", ii);
1207    ii++;
1208    ci++;
1209    for (i = 0; i < 4; i++)
1210     data[i] = ci[i];
1211    roar_math_mkpoly_4x4(poly, data);
1212/*
1213   printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
1214           data[0], data[1], data[2], data[3],
1215           poly[0], poly[1], poly[2], poly[3]
1216          );
1217*/
1218   }
1219  }
1220 }
1221
1222 printf("io=%i\n", io);
1223
1224 return 0;
1225}
1226
1227//ll
Note: See TracBrowser for help on using the repository browser.