source: roaraudio/libroardsp/convert.c @ 386:372958bba38d

Last change on this file since 386:372958bba38d was 386:372958bba38d, checked in by phi, 16 years ago

make the resample use a more accorate value for step

File size: 5.2 KB
Line 
1//convert.c:
2
3#include "libroar.h"
4
5int roar_conv_bits (void * out, void * in, int samples, int from, int to) {
6 if ( from == to ) {
7  if ( in == out )
8   return 0;
9
10  memcpy(out, in, samples * from / 8);
11  return 0;
12 }
13
14 if ( from ==  8 && to == 16 )
15  return roar_conv_bits_8to16(out, in, samples);
16
17 if ( from == 16 && to ==  8 )
18  return roar_conv_bits_16to8(out, in, samples);
19
20 return -1;
21}
22
23int roar_conv_bits_8to16 (void * out, void * in, int samples) {
24 char    * ip = (char   *)in;
25 int16_t * op = (int16_t*)out;
26 int i;
27
28 for (i = samples - 1; i >= 0; i--)
29  op[i] = ip[i] << 8;
30
31 return 0;
32}
33
34int roar_conv_bits_16to8 (void * out, void * in, int samples) {
35 int16_t * ip = (int16_t*)in;
36 char    * op = (char   *)out;
37 int i;
38
39 for (i = 0; i < samples; i++)
40  op[i] = ip[i] >> 8;
41
42 return 0;
43}
44
45
46int roar_conv_chans (void * out, void * in, int samples, int from, int to, int bits) {
47 if ( from == 1 ) {
48  if ( bits == 8 ) {
49   return roar_conv_chans_1ton8(out, in, samples, to);
50  } else if ( bits == 16 ) {
51   return roar_conv_chans_1ton16(out, in, samples, to);
52  } else {
53   return -1;
54  }
55 }
56
57 return -1;
58}
59
60int roar_conv_chans_1ton8  (void * out, void * in, int samples, int to) {
61 char * ip = (char*) in, * op = (char*) out;
62 int i;
63 int c;
64
65 for (i = samples - 1; i >= 0; i--)
66  for (c = to - 1; c >= 0; c--)
67   op[i*to + c] = ip[i];
68
69 return 0;
70}
71
72int roar_conv_chans_1ton16 (void * out, void * in, int samples, int to) {
73 int16_t * ip = (int16_t*) in, * op = (int16_t*) out;
74 int i;
75 int c;
76
77 for (i = samples - 1; i >= 0; i--)
78  for (c = to - 1; c >= 0; c--)
79   op[i*to + c] = ip[i];
80
81 return 0;
82}
83
84int roar_conv_rate (void * out, void * in, int samples, int from, int to, int bits, int channels) {
85 if ( bits == 8  )
86  return roar_conv_rate_8(out, in, samples, from, to, channels);
87
88 if ( bits == 16 )
89  return roar_conv_rate_16(out, in, samples, from, to, channels);
90
91 return -1;
92}
93
94int roar_conv_rate_8  (void * out, void * in, int samples, int from, int to, int channels) {
95 return -1;
96}
97
98int roar_conv_rate_16 (void * out, void * in, int samples, int from, int to, int channels) {
99 if ( channels == 1 ) {
100  printf("roar_conv_rate_16(): samples=%i -> %i, rate=%i -> %i\n", samples*from/to, samples, from, to);
101  return roar_conv_poly4_16s((int16_t*) out, (int16_t*) in, samples, samples*from/to, (float)from/to);
102//  return roar_conv_poly4_16((int16_t*) out, (int16_t*) in, samples*to/from, samples);
103 }
104
105 return -1;
106}
107
108int raor_conv_codec (void * out, void * in, int samples, int from, int to, int bits) {
109 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to);
110 int ins  = ROAR_CODEC_IS_SIGNED(from),  outs  = ROAR_CODEC_IS_SIGNED(to);
111
112 if ( inbo != outbo )
113  return -1;
114
115 if ( ins != outs ) {
116  if ( ins && !outs ) {
117   if ( bits == 8 ) {
118    roar_conv_codec_s2u8(out, in, samples);
119   } else {
120    return -1;
121   }
122  } else {
123   return -1;
124  }
125 }
126
127 return 0;
128}
129
130int roar_conv_codec_s2u8 (void * out, void * in, int samples) {
131 char * ip = in;
132 unsigned char * op = out;
133 int i;
134
135 for(i = 0; i < samples; i++)
136  op[i] = ip[i] + 128;
137
138 return 0;
139}
140
141
142int roar_conv       (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) {
143 void * ip = in;
144
145 // TODO: decide how to work around both in and out beeing to small to hold all
146 //       data between the steps.
147 //       for the moment: guess out >= in
148
149 if ( from->bits != to->bits ) {
150  if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 )
151   return -1;
152  else
153   ip = out;
154 }
155
156 if ( from->rate != to->rate ) {
157  if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 )
158   return -1;
159  else
160   ip = out;
161 }
162
163 if ( from->channels != to->channels ) {
164  if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 )
165   return -1;
166  else
167   ip = out;
168 }
169
170 if ( from->codec != to->codec )
171  return -1;
172
173 return 0;
174}
175
176
177
178int roar_conv_poly4_16 (int16_t * out, int16_t * in, size_t olen, size_t ilen) {
179 return roar_conv_poly4_16s(out, in, olen, ilen, (float)ilen/olen);
180}
181
182int roar_conv_poly4_16s (int16_t * out, int16_t * in, size_t olen, size_t ilen, float step) {
183 float poly[4];
184 float data[4];
185 float t    = 0;
186 int16_t * ci = in;
187 int io, ii = 0;
188 int i;
189
190 printf("step=%f\n", step);
191
192 // we can not make a poly4 with less than 4 points ;)
193 if ( ilen < 4 )
194  return -1;
195
196 for (i = 0; i < 4; i++)
197  data[i] = ci[i];
198 roar_math_mkpoly_4x4(poly, data);
199/*
200 printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
201         data[0], data[1], data[2], data[3],
202         poly[0], poly[1], poly[2], poly[3]
203       );
204*/
205
206 //0 1 2 3
207
208 for (io = 0; io < olen; io++) {
209//  printf("t=%f\n", t);
210  out[io] = roar_math_cvpoly_4x4(poly, t);
211  t += step;
212  if ( t > 2 ) { // we need a new ploynome
213 //  printf("t > 2, need new data\n");
214   if ( (ii + 4) < ilen ) { // else: end of block.
215    t -= 1;
216//    printf("new data: ii=%i\n", ii);
217    ii++;
218    ci++;
219    for (i = 0; i < 4; i++)
220     data[i] = ci[i];
221    roar_math_mkpoly_4x4(poly, data);
222/*
223   printf("new poly: data[4] = {%f, %f, %f, %f}, poly[4] = {%f, %f, %f, %f}\n",
224           data[0], data[1], data[2], data[3],
225           poly[0], poly[1], poly[2], poly[3]
226          );
227*/
228   }
229  }
230 }
231
232 printf("io=%i\n", io);
233
234 return 0;
235}
236
237//ll
Note: See TracBrowser for help on using the repository browser.