source: roaraudio/libroardsp/convert.c @ 1064:cc490b4af5df

Last change on this file since 1064:cc490b4af5df was 1064:cc490b4af5df, checked in by phi, 15 years ago

ha, seems that I got downsampling code working, ha, zoh even for 2 channel

File size: 18.4 KB
Line 
1//convert.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36//#define free(p) {ROAR_WARN("free(%p) = ?", (p)); free((p)); ROAR_WARN("free(%p): OK", (p));}
37
38int roar_conv_bits (void * out, void * in, int samples, int from, int to) {
39 int format;
40
41 if ( from == to ) {
42  if ( in == out )
43   return 0;
44
45  memcpy(out, in, samples * from / 8);
46  return 0;
47 }
48
49 format = ((from / 8) << 4) + (to / 8);
50
51 switch (format) {
52  case 0x12: return roar_conv_bits_8to16( out, in, samples);
53  case 0x14: return roar_conv_bits_8to32( out, in, samples);
54  case 0x21: return roar_conv_bits_16to8( out, in, samples);
55  case 0x24: return roar_conv_bits_16to32(out, in, samples);
56  case 0x41: return roar_conv_bits_32to8( out, in, samples);
57  case 0x42: return roar_conv_bits_32to16(out, in, samples);
58  default:
59   errno = ENOSYS;
60   return -1;
61 }
62
63 return -1;
64}
65
66int roar_conv_bits_8to16 (void * out, void * in, int samples) {
67 char    * ip = (char   *)in;
68 int16_t * op = (int16_t*)out;
69 int i;
70
71 for (i = samples - 1; i >= 0; i--)
72  op[i] = ip[i] << 8;
73
74 return 0;
75}
76
77int roar_conv_bits_8to32  (void * out, void * in, int samples) {
78 char    * ip = (char   *)in;
79 int32_t * op = (int32_t*)out;
80 int i;
81
82 for (i = samples - 1; i >= 0; i--)
83  op[i] = ip[i] << 24;
84
85 return 0;
86}
87
88int roar_conv_bits_16to8 (void * out, void * in, int samples) {
89 int16_t * ip = (int16_t*)in;
90 char    * op = (char   *)out;
91 int i;
92
93 ROAR_DBG("roar_conv_bits_16to8(out=%p, in=%p, samples=%i) = ?", out, in, samples);
94
95 for (i = 0; i < samples; i++)
96  op[i] = ip[i] >> 8;
97
98 return 0;
99}
100
101int roar_conv_bits_16to32 (void * out, void * in, int samples) {
102 int16_t * ip = (int16_t*)in;
103 int32_t * op = (int32_t*)out;
104 int i;
105
106 for (i = samples - 1; i >= 0; i--)
107  op[i] = ip[i] << 16;
108
109 return 0;
110}
111
112int roar_conv_bits_32to8 (void * out, void * in, int samples) {
113 int32_t * ip = (int32_t*)in;
114 char    * op = (char   *)out;
115 int i;
116
117 for (i = 0; i < samples; i++)
118  op[i] = ip[i] >> 24;
119
120 return 0;
121}
122
123int roar_conv_bits_32to16 (void * out, void * in, int samples) {
124 int32_t * ip = (int32_t*)in;
125 int16_t * op = (int16_t*)out;
126 int i;
127
128 for (i = 0; i < samples; i++)
129  op[i] = ip[i] >> 16;
130
131 return 0;
132}
133
134int roar_conv_chans (void * out, void * in, int samples, int from, int to, int bits) {
135 if ( from == to ) {
136  if ( in == out )
137   return 0;
138
139  memcpy(out, in, samples * from * bits / 8);
140  return 0;
141 }
142
143 switch (bits) {
144  case 8:
145   switch (from) {
146    case 1:
147     switch (to) {
148      case  2: return roar_conv_chans_1to28(out, in, samples);
149      default: return roar_conv_chans_1ton8(out, in, samples, to);
150     }
151     break;
152    case 2:
153     switch (to) {
154      case  1: return roar_conv_chans_2to18(out, in, samples);
155      default: return -1;
156     }
157     break;
158    default:
159     switch (to) {
160      case  1: return roar_conv_chans_nto18(out, in, samples, from);
161      default: return -1;
162     }
163   }
164  break;
165  case 16:
166   switch (from) {
167    case 1:
168     switch (to) {
169      case  2: return roar_conv_chans_1to216(out, in, samples);
170      default: return roar_conv_chans_1ton16(out, in, samples, to);
171     }
172     break;
173    case 2:
174     switch (to) {
175      case  1: return roar_conv_chans_2to116(out, in, samples);
176      default: return -1;
177     }
178     break;
179    default:
180     switch (to) {
181      case  1: return roar_conv_chans_nto116(out, in, samples, from);
182      default: return -1;
183     }
184   }
185  break;
186  default: return -1;
187 }
188
189 return -1;
190}
191
192int roar_conv_chans_1ton8  (void * out, void * in, int samples, int to) {
193 char * ip = (char*) in, * op = (char*) out;
194 int i;
195 int c;
196
197 for (i = samples - 1; i >= 0; i--)
198  for (c = to - 1; c >= 0; c--)
199   op[i*to + c] = ip[i];
200
201 return 0;
202}
203
204int roar_conv_chans_1to28  (void * out, void * in, int samples) {
205 char * ip = (char*) in, * op = (char*) out;
206 int i, h;
207
208 samples--;
209
210 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
211  op[i + 0] = ip[h];
212  op[i + 1] = ip[h];
213 }
214
215 return 0;
216}
217
218int roar_conv_chans_1ton16 (void * out, void * in, int samples, int to) {
219 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
220 int i;
221 int c;
222
223 for (i = samples - 1; i >= 0; i--)
224  for (c = to - 1; c >= 0; c--)
225   op[i*to + c] = ip[i];
226
227 return 0;
228}
229
230int roar_conv_chans_1to216 (void * out, void * in, int samples) {
231 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
232 int i, h;
233
234 samples--;
235
236 for (i = (h = samples) * 2; i >= 0; i -= 2, h--) {
237  op[i + 0] = ip[h];
238  op[i + 1] = ip[h];
239 }
240
241 return 0;
242}
243
244int roar_conv_chans_nto18  (void * out, void * in, int samples, int from) {
245 int8_t * ip = (int8_t*) in, * op = (int8_t*) out;
246 int i;
247 int c;
248 register int s;
249
250 samples /= from;
251
252 for (i = samples - 1; i >= 0; i--) {
253  s  = 0;
254
255  for (c = 0; c < from; c++)
256   s += ip[i*from + c];
257
258  s /= from;
259  op[i] = s;
260 }
261
262 return 0;
263}
264
265int roar_conv_chans_2to18  (void * out, void * in, int samples) {
266 int8_t * ip = (int8_t*) in, * op = (int8_t*) out;
267 int i, h;
268
269 samples -= 2;
270
271 for (h = (i = samples) / 2; i >= 0; i -= 2, h--)
272  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
273
274 return 0;
275}
276
277int roar_conv_chans_nto116 (void * out, void * in, int samples, int from) {
278 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
279 int i;
280 int c;
281 register int s;
282
283 samples /= from;
284
285 for (i = samples - 1; i >= 0; i--) {
286  s  = 0;
287
288  for (c = 0; c < from; c++)
289   s += ip[i*from + c];
290
291  s /= from;
292  op[i] = s;
293 }
294
295 return 0;
296}
297
298int roar_conv_chans_2to116  (void * out, void * in, int samples) {
299 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
300 int i, h;
301
302 ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i) = ?", out, in, samples);
303
304 samples -= 2;
305
306 for (h = (i = samples) / 2; i >= 0; i -= 2, h--) {
307  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);
308  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2;
309 }
310
311 return 0;
312}
313
314int roar_conv_rate (void * out, void * in, int samples, int from, int to, int bits, int channels) {
315 if ( bits == 8  )
316  return roar_conv_rate_8(out, in, samples, from, to, channels);
317
318 if ( bits == 16 )
319  return roar_conv_rate_16(out, in, samples, from, to, channels);
320
321 return -1;
322}
323
324int roar_conv_rate_8  (void * out, void * in, int samples, int from, int to, int channels) {
325 return -1;
326}
327
328int roar_conv_rate_16 (void * out, void * in, int samples, int from, int to, int channels) {
329 if ( from > to ) {
330  switch (channels) {
331   case 1:
332     return roar_conv_rate_161zoh(out, in, samples, from, to);
333   case 2:
334     return roar_conv_rate_162zoh(out, in, samples, from, to);
335   default:
336     return -1;
337  }
338 } else {
339  if ( channels == 1 ) {
340   printf("roar_conv_rate_16(): samples=%i -> %i, rate=%i -> %i\n", samples*from/to, samples, from, to);
341   return roar_conv_poly4_16s((int16_t*) out, (int16_t*) in, samples, samples*from/to, (float)from/to);
342 //  return roar_conv_poly4_16((int16_t*) out, (int16_t*) in, samples*to/from, samples);
343  }
344 }
345
346 return -1;
347}
348
349int roar_conv_rate_161zoh(void * out, void * in, int samples, int from, int to) {
350 int16_t * ip = in;
351 int16_t * op = out;
352 float t = 0;
353 float step = (float)to/from;
354 int i;
355
356 for (i= 0; i < samples; i++) {
357  op[(int)t] = ip[i];
358  t += step;
359 }
360
361 return 0;
362}
363
364int roar_conv_rate_162zoh(void * out, void * in, int samples, int from, int to) {
365 int16_t * ip = in;
366 int16_t * op = out;
367 float t = 0;
368 float step = (float)to/from;
369 int i;
370
371 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples);
372 samples /= 2;
373 samples -= 1;
374 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples);
375
376 for (i= 0; i < samples; i++) {
377  ROAR_DBG("roar_conv_rate_162zoh(*): t=%f, i=%i // op[%i] = ip[%i]", t, i, 2*(int)t, 2*i);
378  op[2*(int)t    ] = ip[2*i    ];
379  op[2*(int)t + 1] = ip[2*i + 1];
380  t += step;
381 }
382
383 return 0;
384}
385
386int roar_conv_signedness  (void * out, void * in, int samples, int from, int to, int bits) {
387
388 if ( from != to ) {
389  if ( from && !to ) {
390   switch (bits) {
391    case  8: roar_conv_codec_s2u8( out, in, samples); break;
392    case 16: roar_conv_codec_s2u16(out, in, samples); break;
393    case 32: roar_conv_codec_s2u32(out, in, samples); break;
394    default:
395     errno = ENOSYS;
396     return -1;
397   }
398  } else if ( !from && to ) {
399   switch (bits) {
400    case  8: roar_conv_codec_u2s8( out, in, samples); break;
401    case 16: roar_conv_codec_u2s16(out, in, samples); break;
402    case 32: roar_conv_codec_u2s32(out, in, samples); break;
403    default:
404     errno = ENOSYS;
405     return -1;
406   }
407  } else {
408   return -1;
409  }
410 } else {
411  if ( out == in )
412   return 0;
413
414  memcpy(out, in, samples * bits / 8);
415  return 0;
416 }
417
418 return 0;
419}
420
421int roar_conv_codec (void * out, void * in, int samples, int from, int to, int bits) {
422 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to);
423 int ins  = ROAR_CODEC_IS_SIGNED(from),  outs  = ROAR_CODEC_IS_SIGNED(to);
424 void * nin = in;
425
426
427 ROAR_DBG("roar_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?",
428              out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits);
429
430 roar_conv_endian(out, in, samples, inbo, outbo, bits);
431 nin = out;
432
433 return roar_conv_signedness(out, in, samples, ins, outs, bits);
434}
435
436int roar_conv_codec_s2u8 (void * out, void * in, int samples) {
437 char * ip = in;
438 unsigned char * op = out;
439 int i;
440
441 for(i = 0; i < samples; i++)
442  op[i] = ip[i] + 128;
443
444 return 0;
445}
446
447int roar_conv_codec_s2u16 (void * out, void * in, int samples) {
448 int16_t  * ip = in;
449 uint16_t * op = out;
450 int i;
451
452 for(i = 0; i < samples; i++)
453  op[i] = ip[i] + 32768;
454
455 return 0;
456}
457
458int roar_conv_codec_s2u32 (void * out, void * in, int samples) {
459 int32_t  * ip = in;
460 uint32_t * op = out;
461 int i;
462
463 for(i = 0; i < samples; i++)
464  op[i] = ip[i] + 2147483648U;
465
466 return 0;
467}
468
469int roar_conv_codec_u2s8 (void * out, void * in, int samples) {
470 unsigned char * ip = in;
471          char * op = out;
472 int i;
473
474 for(i = 0; i < samples; i++)
475  op[i] = ip[i] - 128;
476
477 return 0;
478}
479
480int roar_conv_codec_u2s16 (void * out, void * in, int samples) {
481 uint16_t  * ip = in;
482 int16_t   * op = out;
483 int i;
484
485 for(i = 0; i < samples; i++)
486  op[i] = ip[i] - 32768;
487
488 return 0;
489}
490
491int roar_conv_codec_u2s32 (void * out, void * in, int samples) {
492 uint32_t  * ip = in;
493 int32_t   * op = out;
494 int i;
495
496 for(i = 0; i < samples; i++)
497  op[i] = ip[i] - 2147483648U;
498
499 return 0;
500}
501
502
503int roar_conv_endian      (void * out, void * in, int samples, int from, int to, int bits) {
504
505 if ( bits == 8 ) {
506  from = to = ROAR_CODEC_NATIVE_ENDIAN;
507
508 } else if ( bits == 16 ) {
509  if ( from  == ROAR_CODEC_PDP )
510   from = ROAR_CODEC_LE;
511  if ( to    == ROAR_CODEC_PDP )
512   to   = ROAR_CODEC_LE;
513 }
514
515 ROAR_DBG("roar_conv_endian(out=%p, in=%p, samples=%i, from=%i, to=%i, bits=%i) = ?", out, in, samples, from, to, bits);
516
517 if ( from == to ) {
518  if ( in != out ) {
519   memcpy(out, in, samples * bits / 8);
520  }
521  return 0;
522 } else {
523  if ( bits == 16 ) {
524   // in this case we can only have LE vs. BE, so, only need to swap:
525   ROAR_DBG("roar_conv_endian(*): Doing 16 bit byteswap");
526   return roar_conv_endian_16(out, in, samples);
527  } else if ( bits == 24 ) {
528   if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) {
529    return roar_conv_endian_24(out, in, samples);
530   } else { // what the hell is PDP eddines in 24 bit mode?
531    return -1;
532   }
533  } else if ( bits == 32 ) {
534   if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) {
535    return roar_conv_endian_32(out, in, samples);
536   } else { // need to handle 32 PDP eddines here?
537    return -1;
538   }
539  } else {
540   return -1;
541  }
542 }
543
544 return -1;
545}
546
547
548int roar_conv_endian_16   (void * out, void * in, int samples) {
549 char          * ip = in;
550 char          * op = out;
551 register char   c;
552 int             i;
553
554 samples *= 2;
555
556 if ( out != in ) {
557//  printf("out != in\n");
558  for(i = 0; i < samples; i += 2) {
559//   printf("op[%i] = ip[%i]\nop[%i] = ip[%i]\n", i, i+1, i+1, i);
560   op[i  ] = ip[i+1];
561   op[i+1] = ip[i  ];
562  }
563 } else {
564//  printf("out == in\n");
565  for(i = 0; i < samples; i += 2) {
566   c       = ip[i+1];
567   op[i+1] = ip[i  ];
568   op[i  ] = c;
569  }
570 }
571
572 return 0;
573}
574
575int roar_conv_endian_24   (void * out, void * in, int samples) {
576 char          * ip = in;
577 char          * op = out;
578 register char   c;
579 int             i;
580
581 samples *= 3;
582
583 if ( out != in ) {
584//  printf("out != in\n");
585  for(i = 0; i < samples; i += 3) {
586//   printf("op[%i] = ip[%i]\nop[%i] = ip[%i]\n", i, i+1, i+1, i);
587   op[i  ] = ip[i+2];
588   op[i+2] = ip[i  ];
589  }
590 } else {
591//  printf("out == in\n");
592  for(i = 0; i < samples; i += 3) {
593   c       = ip[i+2];
594   op[i+2] = ip[i  ];
595   op[i  ] = c;
596  }
597 }
598
599 return 0;
600}
601
602int roar_conv_endian_32   (void * out, void * in, int samples) {
603 int32_t       * ip = in;
604 int32_t       * op = out;
605 union {
606  int32_t val;
607  char    data[4];
608 }               c, h;
609 int             i;
610
611 // may the holly optimizer save our souls!
612
613 ROAR_DBG("roar_conv_endian_32(out=%p, in=%p, samples=%i) = ?", out, in, samples);
614
615 for (i = 0; i < samples; i++) {
616  c.val     = ip[i];
617  h.data[0] = c.data[3];
618  h.data[1] = c.data[2];
619  h.data[2] = c.data[1];
620  h.data[3] = c.data[0];
621  op[i]     = h.val;
622 }
623
624 return 0;
625}
626
627int roar_conv       (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) {
628 void * ip = in;
629 void * real_out = NULL;
630 size_t from_size, to_size;
631
632 // TODO: decide how to work around both in and out beeing to small to hold all
633 //       data between the steps.
634 //       for the moment: guess out >= in
635
636 from_size = (from->bits * samples) / 8;
637 to_size   = (  to->bits * samples * to->rate * to->channels) / (8 * from->rate * from->channels);
638
639 ROAR_DBG("roar_conv(*): size: %i->%i", from_size, to_size);
640
641 if ( to_size < from_size ) {
642  real_out = out;
643
644  if ( (out = malloc(from_size)) == NULL )
645   return -1;
646
647  ROAR_DBG("roar_conv(*): malloc(%i)=%p", (int)from_size, out);
648 }
649
650 ROAR_DBG("roar_conv(*): bo conv: %i->%i(native)", ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN);
651
652 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
653  ROAR_DBG("roar_conv(*): doing bo input conv");
654  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, from->bits) == -1 ) {
655   if ( to_size < from_size )
656    free(out);
657   return -1;
658  } else {
659   ip = out;
660  }
661 }
662
663 if ( from->bits != to->bits ) {
664  if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) {
665   if ( to_size < from_size )
666    free(out);
667   return -1;
668  } else {
669   ip = out;
670  }
671 }
672
673 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) {
674  if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) {
675   if ( to_size < from_size )
676    free(out);
677   return -1;
678  } else {
679   ip = out;
680  }
681 }
682
683/*
684 if ( from->codec != to->codec ) {
685  if ( roar_conv_codec (out, ip, samples, from->codec, to->codec, to->bits) == -1 )
686   return -1;
687  else
688   ip = out;
689 }
690*/
691
692 if ( from->rate != to->rate ) {
693  if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) {
694   ROAR_DBG("roar_conv(*): failed to convert rate %i->%i (%ich%ibits)", from->rate, to->rate, to->bits, from->channels);
695   if ( to_size < from_size )
696    free(out);
697   return -1;
698  } else {
699   ip = out;
700   samples = (samples * to->rate) / from->rate;
701  }
702 }
703
704 if ( from->channels != to->channels ) {
705  if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) {
706   if ( to_size < from_size )
707    free(out);
708   return -1;
709  } else {
710   ip = out;
711  }
712 }
713
714 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) {
715  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) {
716   if ( to_size < from_size )
717    free(out);
718   return -1;
719  } else {
720   ip = out;
721  }
722 }
723
724 if ( to_size < from_size ) {
725  ROAR_DBG("roar_conv(*): memcpy(%p, %p, %i) = ?", real_out, out, (int)to_size);
726  memcpy(real_out, out, to_size);
727  free(out);
728  ROAR_DBG("roar_conv(*): free(%p): OK!", out);
729 }
730
731 return 0;
732}
733
734
735
736int roar_conv_poly4_16 (int16_t * out, int16_t * in, size_t olen, size_t ilen) {
737 return roar_conv_poly4_16s(out, in, olen, ilen, (float)ilen/olen);
738}
739
740int roar_conv_poly4_16s (int16_t * out, int16_t * in, size_t olen, size_t ilen, float step) {
741 float poly[4];
742 float data[4];
743 float t    = 0;
744 int16_t * ci = in;
745 int io, ii = 0;
746 int i;
747
748 printf("step=%f\n", step);
749
750 // we can not make a poly4 with less than 4 points ;)
751 if ( ilen < 4 )
752  return -1;
753
754 for (i = 0; i < 4; i++)
755  data[i] = ci[i];
756 roar_math_mkpoly_4x4(poly, data);
757/*
758 printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
759         data[0], data[1], data[2], data[3],
760         poly[0], poly[1], poly[2], poly[3]
761       );
762*/
763
764 //0 1 2 3
765
766 for (io = 0; io < olen; io++) {
767//  printf("t=%f\n", t);
768  out[io] = roar_math_cvpoly_4x4(poly, t);
769  t += step;
770  if ( t > 2 ) { // we need a new ploynome
771 //  printf("t > 2, need new data\n");
772   if ( (ii + 4) < ilen ) { // else: end of block.
773    t -= 1;
774//    printf("new data: ii=%i\n", ii);
775    ii++;
776    ci++;
777    for (i = 0; i < 4; i++)
778     data[i] = ci[i];
779    roar_math_mkpoly_4x4(poly, data);
780/*
781   printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
782           data[0], data[1], data[2], data[3],
783           poly[0], poly[1], poly[2], poly[3]
784          );
785*/
786   }
787  }
788 }
789
790 printf("io=%i\n", io);
791
792 return 0;
793}
794
795//ll
Note: See TracBrowser for help on using the repository browser.