source: roaraudio/libroardsp/convert.c @ 4260:73d7bdb1a9c5

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

fixed resampler code finnaly, thanks to maister for patches

File size: 29.7 KB
RevLine 
[0]1//convert.c:
2
[690]3/*
[3811]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2010
[4129]5 *      Copyright (C) Hans-Kristian 'maister' Arntzen - 2010
[690]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
[3517]22 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
23 *  Boston, MA 02110-1301, USA.
[690]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
[1367]37#include "libroardsp.h"
[1064]38//#define free(p) {ROAR_WARN("free(%p) = ?", (p)); free((p)); ROAR_WARN("free(%p): OK", (p));}
[0]39
40int roar_conv_bits (void * out, void * in, int samples, int from, int to) {
[845]41 int format;
42
[0]43 if ( from == to ) {
44  if ( in == out )
45   return 0;
46
47  memcpy(out, in, samples * from / 8);
48  return 0;
49 }
50
[845]51 format = ((from / 8) << 4) + (to / 8);
[0]52
[845]53 switch (format) {
[849]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);
[845]57  case 0x24: return roar_conv_bits_16to32(out, in, samples);
[2501]58  case 0x34: return roar_conv_bits_24to32(out, in, samples);
[849]59  case 0x41: return roar_conv_bits_32to8( out, in, samples);
[845]60  case 0x42: return roar_conv_bits_32to16(out, in, samples);
61  default:
62   errno = ENOSYS;
63   return -1;
64 }
[0]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
[845]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--)
[1458]86  op[i] = (int32_t) ip[i] << 24;
[845]87
88 return 0;
89}
90
[0]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
[624]96 ROAR_DBG("roar_conv_bits_16to8(out=%p, in=%p, samples=%i) = ?", out, in, samples);
97
[0]98 for (i = 0; i < samples; i++)
99  op[i] = ip[i] >> 8;
100
101 return 0;
102}
103
[845]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--)
[1458]110  op[i] = (int32_t) ip[i] << 16;
[845]111
112 return 0;
113}
114
[2501]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
[845]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}
[0]175
176int roar_conv_chans (void * out, void * in, int samples, int from, int to, int bits) {
[850]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);
[2741]218      case  3: return roar_conv_chans_2to316(out, in, samples);
[2742]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);
[850]222      default: return -1;
223     }
224     break;
[2750]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;
[850]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;
[0]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
[850]257int roar_conv_chans_1to28  (void * out, void * in, int samples) {
258 char * ip = (char*) in, * op = (char*) out;
[852]259 int i, h;
[850]260
[852]261 samples--;
[850]262
[852]263 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
264  op[i + 0] = ip[h];
265  op[i + 1] = ip[h];
[850]266 }
267
268 return 0;
269}
270
[0]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
[850]283int roar_conv_chans_1to216 (void * out, void * in, int samples) {
284 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
[852]285 int i, h;
[850]286
[852]287 samples--;
[850]288
[852]289 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
290  op[i + 0] = ip[h];
291  op[i + 1] = ip[h];
[850]292 }
293
294 return 0;
295}
296
[626]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
[4125]305 for (i = 0; i < samples; i++) {
[626]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
[850]318int roar_conv_chans_2to18  (void * out, void * in, int samples) {
319 int8_t * ip = (int8_t*) in, * op = (int8_t*) out;
[852]320 int i, h;
[850]321
[4125]322 for (h = i = 0; i < samples; i += 2, h++)
[852]323  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
[850]324
325 return 0;
326}
327
[624]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
[4125]336 for (i = 0; i < samples; i++) {
[624]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
[850]349int roar_conv_chans_2to116  (void * out, void * in, int samples) {
350 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
[852]351 int i, h;
[850]352
[1064]353 ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i) = ?", out, in, samples);
354
[4122]355 for (h = i = 0; i < samples; i += 2, h++) {
[1064]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);
[852]357  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
[1064]358 }
[850]359
360 return 0;
361}
362
[2741]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);
[2742]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
[2743]392 for (; i >= 0; i -= 2, h -= 4) {
[2742]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
[2741]402int roar_conv_chans_2to58  (void * out, void * in, int samples);
[2742]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
[2743]412 for (; i >= 0; i -= 2, h -= 5) {
[2742]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}
[2741]422int roar_conv_chans_2to68  (void * out, void * in, int samples);
[2742]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;
[2743]430 h  = (samples / 2) * 6;
[2742]431
[2743]432 for (; i >= 0; i -= 2, h -= 6) {
[2742]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}
[2741]443
[2749]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);
[2750]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
[2749]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
[2741]467
[0]468int roar_conv_rate (void * out, void * in, int samples, int from, int to, int bits, int channels) {
[2386]469#ifdef ROAR_HAVE_LIBSAMPLERATE
470 return roar_conv_rate_SRC(out, in, samples, from, to, bits, channels);
471#else
[0]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;
[2386]479#endif
[0]480}
481
482int roar_conv_rate_8  (void * out, void * in, int samples, int from, int to, int channels) {
483 return -1;
484}
[33]485
[0]486int roar_conv_rate_16 (void * out, void * in, int samples, int from, int to, int channels) {
[1061]487 if ( from > to ) {
488  switch (channels) {
489   case 1:
490     return roar_conv_rate_161zoh(out, in, samples, from, to);
491   case 2:
[1064]492     return roar_conv_rate_162zoh(out, in, samples, from, to);
[1061]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  }
[386]502 }
503
[0]504 return -1;
505}
506
[1061]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
[1064]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;
[2386]531// samples -= 1;
[1064]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
[2386]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;
[3063]548 float * inf  = roar_mm_malloc(samples*sizeof(float));
549 float * outf = roar_mm_malloc(outsamples*sizeof(float));
[2386]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 )
[3063]557   roar_mm_free(outf);
[2386]558
559  return -1;
560 }
561
562 if ( outf == NULL ) {
563  if ( inf != NULL )
[3063]564   roar_mm_free(inf);
[2386]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:
[3063]583    roar_mm_free(outf);
584    roar_mm_free(inf);
[2386]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
[2388]594 if ( src_simple(&srcdata, SRC_ZERO_ORDER_HOLD, channels) != 0 ) {
[3063]595  roar_mm_free(outf);
596  roar_mm_free(inf);
[2386]597  return -1;
598 }
599
600 switch (bits) {
601  case  8:
[2388]602    for (i = 0; i < outsamples; i++)
[2386]603     *(((int8_t *)out)+i) = outf[i] * 128.0;
604   break;
605  case 16:
[2388]606    for (i = 0; i < outsamples; i++)
[2386]607     *(((int16_t*)out)+i) = outf[i] * 32768.0;
608   break;
609  case 32:
[2388]610    for (i = 0; i < outsamples; i++)
[2386]611     *(((int32_t*)out)+i) = outf[i] * 2147483648.0;
612   break;
613   // no errors here, they are handled above
614 }
615
[3063]616 roar_mm_free(outf);
617 roar_mm_free(inf);
[2386]618
619 return 0;
620#else
621 return -1;
622#endif
623}
624
[4129]625int roar_conv_rate2      (void * out, void * in, int outsamples, int samples, int bits, int channels) {
[4115]626 ROAR_DBG("roar_conv_rate2(out=%p, in=%p, samples=%i, outsamples=%i, bits=%i, channels=%i) = ?", out, in, samples, outsamples, bits, channels);
[4111]627 switch (bits) {
[4129]628  case  8:
629    return roar_conv_poly3_8(out, in, outsamples, samples, channels);
630   break;
[4111]631  case 16:
632    return roar_conv_poly3_16(out, in, outsamples, samples, channels);
633   break;
[4129]634  case 32:
635    return roar_conv_poly3_32(out, in, outsamples, samples, channels);
636   break;
[4111]637 }
638 return -1;
639}
640
[875]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 {
[876]663   return -1;
664  }
665 } else {
666  if ( out == in )
667   return 0;
[875]668
[876]669  memcpy(out, in, samples * bits / 8);
670  return 0;
[875]671 }
672
[876]673 return 0;
[875]674}
675
[876]676int roar_conv_codec (void * out, void * in, int samples, int from, int to, int bits) {
[0]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);
[858]679 void * nin = in;
[0]680
[858]681
[876]682 ROAR_DBG("roar_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?",
[869]683              out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits);
684
[875]685 roar_conv_endian(out, in, samples, inbo, outbo, bits);
686 nin = out;
[0]687
[875]688 return roar_conv_signedness(out, in, samples, ins, outs, bits);
[0]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
[633]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
[2797]707 for(i = 0; i < samples; i++)
708  op[i] = ip[i] + 32768;
[633]709
710 return 0;
711}
[0]712
[846]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
[875]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
[876]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
[875]772 if ( from == to ) {
773  if ( in != out ) {
774   memcpy(out, in, samples * bits / 8);
775  }
[876]776  return 0;
777 } else {
[3605]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;
[875]812  }
813 }
814
815 return -1;
816}
817
818
[857]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 ) {
[858]828//  printf("out != in\n");
[857]829  for(i = 0; i < samples; i += 2) {
[858]830//   printf("op[%i] = ip[%i]\nop[%i] = ip[%i]\n", i, i+1, i+1, i);
[857]831   op[i  ] = ip[i+1];
832   op[i+1] = ip[i  ];
833  }
834 } else {
[858]835//  printf("out == in\n");
[857]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
[859]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
[869]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
[0]898int roar_conv       (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) {
899 void * ip = in;
[1060]900 void * real_out = NULL;
[1059]901 size_t from_size, to_size;
[0]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
[1060]907 from_size = (from->bits * samples) / 8;
[1064]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);
[1059]911
912 if ( to_size < from_size ) {
913  real_out = out;
914
[3063]915  if ( (out = roar_mm_malloc(from_size)) == NULL )
[1059]916   return -1;
[1060]917
[3063]918  ROAR_DBG("roar_conv(*): roar_mm_malloc(%i)=%p", (int)from_size, out);
[1059]919 }
920
[876]921 ROAR_DBG("roar_conv(*): bo conv: %i->%i(native)", ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN);
922
[875]923 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
[876]924  ROAR_DBG("roar_conv(*): doing bo input conv");
[1059]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 )
[3063]927    roar_mm_free(out);
[875]928   return -1;
[1059]929  } else {
[875]930   ip = out;
[1059]931  }
[875]932 }
933
[0]934 if ( from->bits != to->bits ) {
[1059]935  if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) {
936   if ( to_size < from_size )
[3063]937    roar_mm_free(out);
[0]938   return -1;
[1059]939  } else {
[0]940   ip = out;
[1059]941  }
[0]942 }
943
[875]944 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) {
[1059]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 )
[3063]947    roar_mm_free(out);
[875]948   return -1;
[1059]949  } else {
[875]950   ip = out;
[1059]951  }
[875]952 }
953
954/*
[852]955 if ( from->codec != to->codec ) {
[876]956  if ( roar_conv_codec (out, ip, samples, from->codec, to->codec, to->bits) == -1 )
[852]957   return -1;
958  else
959   ip = out;
960 }
[875]961*/
[852]962
[386]963 if ( from->rate != to->rate ) {
[1059]964  if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) {
[1060]965   ROAR_DBG("roar_conv(*): failed to convert rate %i->%i (%ich%ibits)", from->rate, to->rate, to->bits, from->channels);
[1064]966   if ( to_size < from_size )
[3063]967    roar_mm_free(out);
[0]968   return -1;
[1059]969  } else {
[0]970   ip = out;
[1064]971   samples = (samples * to->rate) / from->rate;
[1059]972  }
[0]973 }
974
[386]975 if ( from->channels != to->channels ) {
[1059]976  if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) {
977   if ( to_size < from_size )
[3063]978    roar_mm_free(out);
[0]979   return -1;
[1059]980  } else {
[0]981   ip = out;
[1059]982  }
[0]983 }
984
[875]985 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
[1059]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 )
[3063]988    roar_mm_free(out);
[875]989   return -1;
[1059]990  } else {
[875]991   ip = out;
[1059]992  }
993 }
994
995 if ( to_size < from_size ) {
[1060]996  ROAR_DBG("roar_conv(*): memcpy(%p, %p, %i) = ?", real_out, out, (int)to_size);
[1059]997  memcpy(real_out, out, to_size);
[3063]998  roar_mm_free(out);
[1064]999  ROAR_DBG("roar_conv(*): free(%p): OK!", out);
[875]1000 }
1001
[0]1002 return 0;
1003}
1004
[2094]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;
[4129]1010// size_t needed_buffer;
[2096]1011 void   * cin = in;
1012 struct roar_audio_info cinfo;
[2098]1013 int    need_signed = 0;
[4115]1014 size_t outsamples;
[2096]1015
1016 memcpy(&cinfo, from, sizeof(cinfo));
[383]1017
[2388]1018 ROAR_DBG("roar_conv2(out=%p, in=%p, inlen=%lu, from=%p{...}, to=%p{...}, bufsize=%lu", out, in, inlen, from, to, bufsize);
1019
[2386]1020/*
1021 if ( in != out ) {
1022  memset(out, 0xA0, bufsize);
1023 } else {
1024  ROAR_WARN("roar_conv2(*): in==out!");
[2388]1025  memset(out+inlen, 0xA0, bufsize-inlen);
[2386]1026 }
1027*/
1028
[4110]1029 // calculate number of input samples:
[2099]1030 samples = (inlen * 8) / (from->bits);
1031
[2100]1032 ROAR_DBG("roar_conv2(*): input samples: %i", samples);
[2094]1033
[4111]1034#if 0
[2094]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;
[2099]1039 needed_buffer /= from->channels;
[2094]1040
1041 if ( from->rate < to->rate )
1042  needed_buffer *= (float)to->rate/(float)from->rate;
1043
[2100]1044 ROAR_DBG("roar_conv2(*): needed_buffer=%u, bufsize=%u", needed_buffer, bufsize);
[2098]1045
[4110]1046 // check if we have enogth RAM to convert
[2094]1047 if ( needed_buffer > bufsize )
1048  return -1;
[4111]1049#endif
[2094]1050
[2098]1051 if ( from->rate != to->rate || from->channels != to->channels )
1052  need_signed = 1;
1053
[2100]1054  ROAR_DBG("roar_conv2(*): need_signed=%i", need_signed);
[2098]1055
[2096]1056 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
[2100]1057  ROAR_DBG("roar_conv2(*): doing bo input conv");
[2096]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 ) {
[2100]1066  ROAR_DBG("roar_conv2(*): bits: %i->%i", from->bits, to->bits);
[2096]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
[2098]1074 if ( need_signed && ! ROAR_CODEC_IS_SIGNED(from->codec) ) {
[2100]1075  ROAR_DBG("roar_conv2(*): sign: unsigned->signed");
[2098]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
[2096]1085 if ( to->channels > from->channels ) {
[2100]1086  ROAR_DBG("roar_conv2(*): channels: %i->%i", from->channels, to->channels);
[2748]1087  if ( roar_conv_chans(out, cin, samples, from->channels, to->channels, cinfo.bits) == -1 )
[2096]1088   return -1;
1089
1090  cin            = out;
[4115]1091  samples        = (samples * to->channels) / cinfo.channels;
[2096]1092  cinfo.channels = to->channels;
1093 }
1094
[2103]1095//--//
1096 if ( from->rate != to->rate ) {
[4123]1097  outsamples = bufsize;
[4115]1098
[4122]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
[4123]1111  outsamples /= cinfo.bits/8;
1112
[4122]1113  ROAR_DBG("roar_conv2(*): outsamples=%llu", (long long unsigned int)outsamples);
1114
[4129]1115  if ( roar_conv_rate2(out, cin, outsamples, samples, cinfo.bits, cinfo.channels) == -1 )
[2103]1116   return -1;
1117
1118  cin            = out;
[4115]1119  samples        = outsamples;
[2103]1120  cinfo.rate     = to->rate;
1121 }
1122
[2098]1123 if ( cinfo.channels != to->channels ) {
[2100]1124  ROAR_DBG("roar_conv2(*): channels: %i->%i", cinfo.channels, to->channels);
[2098]1125  if ( roar_conv_chans(out, cin, samples, cinfo.channels, to->channels, cinfo.bits) == -1 )
1126   return -1;
1127
1128  cin            = out;
[4115]1129  samples        = (samples * to->channels) / cinfo.channels;
[2098]1130  cinfo.channels = to->channels;
1131 }
1132
1133 if ( ROAR_CODEC_IS_SIGNED(cinfo.codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) {
[2100]1134  ROAR_DBG("roar_conv2(*): sign: ?(%i)->?(%i)", ROAR_CODEC_IS_SIGNED(cinfo.codec), ROAR_CODEC_IS_SIGNED(to->codec));
[2097]1135  if ( roar_conv_signedness(out, cin, samples,
[2098]1136                            ROAR_CODEC_IS_SIGNED(cinfo.codec), ROAR_CODEC_IS_SIGNED(to->codec),
[2097]1137                            cinfo.bits) == -1 )
1138   return -1;
1139
1140  cin            = out;
1141  cinfo.codec    = to->codec;
1142 }
[2096]1143
1144 if ( cinfo.bits != to->bits ) {
[2100]1145  ROAR_DBG("roar_conv2(*): bits: %i->%i", cinfo.bits, to->bits);
[2096]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 ) {
[2100]1154  ROAR_DBG("roar_conv2(*): doing bo output conv");
[2096]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
[4122]1162 ROAR_DBG("roar_conv2(*): samples=%llu", (long long unsigned int)samples);
1163
[2100]1164 ROAR_DBG("roar_conv2(*) = 0");
[2096]1165 return 0;
[2094]1166}
[383]1167
1168int roar_conv_poly4_16 (int16_t * out, int16_t * in, size_t olen, size_t ilen) {
[386]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) {
[383]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
[386]1180 printf("step=%f\n", step);
1181
[383]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
[386]1222 printf("io=%i\n", io);
1223
[383]1224 return 0;
1225}
1226
[4117]1227//ll
Note: See TracBrowser for help on using the repository browser.