1 /*
2 * Copyright 2012 Jérôme Leveque
3 * Copyright 2012 Jérôme Duval
4 * Copyright 2003 Marcus Overhagen
5 * Distributed under the terms of the MIT License.
6 */
7
8
9 #include "Resampler.h"
10 #include "MultiAudioUtility.h"
11 #include "debug.h"
12
13
14 /*! A simple resampling class for the multi_audio add-ons.
15 You pick the conversion function on object creation,
16 and then call the Resample() function, specifying data pointer,
17 offset (in bytes) to the next sample, and count of samples.
18 */
19
20
Resampler(uint32 sourceFormat,uint32 destFormat)21 Resampler::Resampler(uint32 sourceFormat, uint32 destFormat)
22 :
23 fFunc(&Resampler::_Void)
24 {
25 PRINT(("Resampler() in 0x%x, out 0x%x\n", (unsigned int)sourceFormat,
26 (unsigned int)destFormat));
27
28 switch (sourceFormat) {
29 case media_raw_audio_format::B_AUDIO_FLOAT:
30 switch (destFormat) {
31 case media_raw_audio_format::B_AUDIO_FLOAT:
32 fFunc = &Resampler::_CopyFloat2Float;
33 break;
34 case media_raw_audio_format::B_AUDIO_DOUBLE:
35 fFunc = &Resampler::_CopyFloat2Double;
36 break;
37 case media_raw_audio_format::B_AUDIO_INT:
38 fFunc = &Resampler::_CopyFloat2Int;
39 break;
40 case media_raw_audio_format::B_AUDIO_SHORT:
41 fFunc = &Resampler::_CopyFloat2Short;
42 break;
43 case media_raw_audio_format::B_AUDIO_UCHAR:
44 fFunc = &Resampler::_CopyFloat2UChar;
45 break;
46 case media_raw_audio_format::B_AUDIO_CHAR:
47 fFunc = &Resampler::_CopyFloat2Char;
48 break;
49 }
50 break;
51
52 case media_raw_audio_format::B_AUDIO_DOUBLE:
53 switch (destFormat) {
54 case media_raw_audio_format::B_AUDIO_FLOAT:
55 fFunc = &Resampler::_CopyDouble2Float;
56 break;
57 case media_raw_audio_format::B_AUDIO_DOUBLE:
58 fFunc = &Resampler::_CopyDouble2Double;
59 break;
60 case media_raw_audio_format::B_AUDIO_INT:
61 fFunc = &Resampler::_CopyDouble2Int;
62 break;
63 case media_raw_audio_format::B_AUDIO_SHORT:
64 fFunc = &Resampler::_CopyDouble2Short;
65 break;
66 case media_raw_audio_format::B_AUDIO_UCHAR:
67 fFunc = &Resampler::_CopyDouble2UChar;
68 break;
69 case media_raw_audio_format::B_AUDIO_CHAR:
70 fFunc = &Resampler::_CopyDouble2Char;
71 break;
72 }
73 break;
74
75 case media_raw_audio_format::B_AUDIO_INT:
76 switch (destFormat) {
77 case media_raw_audio_format::B_AUDIO_FLOAT:
78 fFunc = &Resampler::_CopyInt2Float;
79 break;
80 case media_raw_audio_format::B_AUDIO_DOUBLE:
81 fFunc = &Resampler::_CopyInt2Double;
82 break;
83 case media_raw_audio_format::B_AUDIO_INT:
84 fFunc = &Resampler::_CopyInt2Int;
85 break;
86 case media_raw_audio_format::B_AUDIO_SHORT:
87 fFunc = &Resampler::_CopyInt2Short;
88 break;
89 case media_raw_audio_format::B_AUDIO_UCHAR:
90 fFunc = &Resampler::_CopyInt2UChar;
91 break;
92 case media_raw_audio_format::B_AUDIO_CHAR:
93 fFunc = &Resampler::_CopyInt2Char;
94 break;
95 }
96 break;
97
98 case media_raw_audio_format::B_AUDIO_SHORT:
99 switch (destFormat) {
100 case media_raw_audio_format::B_AUDIO_FLOAT:
101 fFunc = &Resampler::_CopyShort2Float;
102 break;
103 case media_raw_audio_format::B_AUDIO_DOUBLE:
104 fFunc = &Resampler::_CopyShort2Double;
105 break;
106 case media_raw_audio_format::B_AUDIO_INT:
107 fFunc = &Resampler::_CopyShort2Int;
108 break;
109 case media_raw_audio_format::B_AUDIO_SHORT:
110 fFunc = &Resampler::_CopyShort2Short;
111 break;
112 case media_raw_audio_format::B_AUDIO_UCHAR:
113 fFunc = &Resampler::_CopyShort2UChar;
114 break;
115 case media_raw_audio_format::B_AUDIO_CHAR:
116 fFunc = &Resampler::_CopyShort2Char;
117 break;
118 }
119 break;
120
121 case media_raw_audio_format::B_AUDIO_UCHAR:
122 switch (destFormat) {
123 case media_raw_audio_format::B_AUDIO_FLOAT:
124 fFunc = &Resampler::_CopyUChar2Float;
125 break;
126 case media_raw_audio_format::B_AUDIO_DOUBLE:
127 fFunc = &Resampler::_CopyUChar2Double;
128 break;
129 case media_raw_audio_format::B_AUDIO_INT:
130 fFunc = &Resampler::_CopyUChar2Int;
131 break;
132 case media_raw_audio_format::B_AUDIO_SHORT:
133 fFunc = &Resampler::_CopyUChar2Short;
134 break;
135 case media_raw_audio_format::B_AUDIO_UCHAR:
136 fFunc = &Resampler::_CopyUChar2UChar;
137 break;
138 case media_raw_audio_format::B_AUDIO_CHAR:
139 fFunc = &Resampler::_CopyUChar2Char;
140 break;
141 }
142 break;
143
144 case media_raw_audio_format::B_AUDIO_CHAR:
145 switch (destFormat) {
146 case media_raw_audio_format::B_AUDIO_FLOAT:
147 fFunc = &Resampler::_CopyChar2Float;
148 break;
149 case media_raw_audio_format::B_AUDIO_DOUBLE:
150 fFunc = &Resampler::_CopyChar2Double;
151 break;
152 case media_raw_audio_format::B_AUDIO_INT:
153 fFunc = &Resampler::_CopyChar2Int;
154 break;
155 case media_raw_audio_format::B_AUDIO_SHORT:
156 fFunc = &Resampler::_CopyChar2Short;
157 break;
158 case media_raw_audio_format::B_AUDIO_UCHAR:
159 fFunc = &Resampler::_CopyChar2UChar;
160 break;
161 case media_raw_audio_format::B_AUDIO_CHAR:
162 fFunc = &Resampler::_CopyChar2Char;
163 break;
164 }
165 break;
166 }
167 }
168
169
~Resampler()170 Resampler::~Resampler()
171 {
172 }
173
174
175 void
_Void(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)176 Resampler::_Void(const void *inputData, uint32 inputStride,
177 void *outputData, uint32 outputStride, uint32 sampleCount)
178 {
179
180 }
181
182
183 void
_CopyFloat2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)184 Resampler::_CopyFloat2Float(const void *inputData, uint32 inputStride,
185 void *outputData, uint32 outputStride, uint32 sampleCount)
186 {
187 while (sampleCount > 0) {
188 *(float*)outputData = *(const float*)inputData;
189
190 outputData = (void*)((uint8*)outputData + outputStride);
191 inputData = (void*)((uint8*)inputData + inputStride);
192
193 sampleCount--;
194 }
195 }
196
197
198 void
_CopyFloat2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)199 Resampler::_CopyFloat2Double(const void *inputData, uint32 inputStride,
200 void *outputData, uint32 outputStride, uint32 sampleCount)
201 {
202 while (sampleCount > 0) {
203 *(double*)outputData = *(const float*)inputData;
204
205 outputData = (void*)((uint8*)outputData + outputStride);
206 inputData = (void*)((uint8*)inputData + inputStride);
207
208 sampleCount--;
209 }
210 }
211
212
213 void
_CopyFloat2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)214 Resampler::_CopyFloat2Int(const void *inputData, uint32 inputStride,
215 void *outputData, uint32 outputStride, uint32 sampleCount)
216 {
217 while (sampleCount > 0) {
218 float data = *(const float*)inputData;
219 if (data <= -1.0f)
220 *(int32*)outputData = INT32_MIN;
221 else if (data >= 1.0f)
222 *(int32*)outputData = INT32_MAX;
223 else
224 *(int32*)outputData = (int32)(data * INT32_MAX);
225
226 outputData = (void*)((uint8*)outputData + outputStride);
227 inputData = (void*)((uint8*)inputData + inputStride);
228
229 sampleCount--;
230 }
231 }
232
233 void
_CopyFloat2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)234 Resampler::_CopyFloat2Short(const void *inputData, uint32 inputStride,
235 void *outputData, uint32 outputStride, uint32 sampleCount)
236 {
237 while (sampleCount > 0) {
238 *(int16*)outputData = (int16)(*(const float*)inputData * 32767.0f);
239
240 outputData = (void*)((uint8*)outputData + outputStride);
241 inputData = (void*)((uint8*)inputData + inputStride);
242
243 sampleCount--;
244 }
245 }
246
247
248 void
_CopyFloat2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)249 Resampler::_CopyFloat2UChar(const void *inputData, uint32 inputStride,
250 void *outputData, uint32 outputStride, uint32 sampleCount)
251 {
252 while (sampleCount > 0) {
253 *(uint8*)outputData = (uint8)(128.0f + *(const float*)inputData * 127.0f);
254
255 outputData = (void*)((uint8*)outputData + outputStride);
256 inputData = (void*)((uint8*)inputData + inputStride);
257
258 sampleCount--;
259 }
260 }
261
262
263 void
_CopyFloat2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)264 Resampler::_CopyFloat2Char(const void *inputData, uint32 inputStride,
265 void *outputData, uint32 outputStride, uint32 sampleCount)
266 {
267 while (sampleCount > 0) {
268 *(int8*)outputData = (int8)(*(const float*)inputData * 127.0f);
269
270 outputData = (void*)((uint8*)outputData + outputStride);
271 inputData = (void*)((uint8*)inputData + inputStride);
272
273 sampleCount--;
274 }
275 }
276
277
278 void
_CopyDouble2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)279 Resampler::_CopyDouble2Float(const void *inputData, uint32 inputStride,
280 void *outputData, uint32 outputStride, uint32 sampleCount)
281 {
282 while (sampleCount > 0) {
283 *(float*)outputData = *(const double*)inputData;
284
285 outputData = (void*)((uint8*)outputData + outputStride);
286 inputData = (void*)((uint8*)inputData + inputStride);
287
288 sampleCount--;
289 }
290 }
291
292
293 void
_CopyDouble2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)294 Resampler::_CopyDouble2Double(const void *inputData, uint32 inputStride,
295 void *outputData, uint32 outputStride, uint32 sampleCount)
296 {
297 while (sampleCount > 0) {
298 *(double*)outputData = *(const double*)inputData;
299
300 outputData = (void*)((uint8*)outputData + outputStride);
301 inputData = (void*)((uint8*)inputData + inputStride);
302
303 sampleCount--;
304 }
305 }
306
307
308 void
_CopyDouble2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)309 Resampler::_CopyDouble2Int(const void *inputData, uint32 inputStride,
310 void *outputData, uint32 outputStride, uint32 sampleCount)
311 {
312 while (sampleCount > 0) {
313 *(int32*)outputData = (int32)(*(const double*)inputData
314 * (double)INT32_MAX);
315
316 outputData = (void*)((uint8*)outputData + outputStride);
317 inputData = (void*)((uint8*)inputData + inputStride);
318
319 sampleCount--;
320 }
321 }
322
323
324 void
_CopyDouble2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)325 Resampler::_CopyDouble2Short(const void *inputData, uint32 inputStride,
326 void *outputData, uint32 outputStride, uint32 sampleCount)
327 {
328 while (sampleCount > 0) {
329 *(int16*)outputData = (int16)(*(const double*)inputData * 32767.0f);
330
331 outputData = (void*)((uint8*)outputData + outputStride);
332 inputData = (void*)((uint8*)inputData + inputStride);
333
334 sampleCount--;
335 }
336 }
337
338
339 void
_CopyDouble2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)340 Resampler::_CopyDouble2UChar(const void *inputData, uint32 inputStride,
341 void *outputData, uint32 outputStride, uint32 sampleCount)
342 {
343 while (sampleCount > 0) {
344 *(uint8*)outputData = (uint8)(128.0f + *(const double*)inputData * 127.0f);
345
346 outputData = (void*)((uint8*)outputData + outputStride);
347 inputData = (void*)((uint8*)inputData + inputStride);
348
349 sampleCount--;
350 }
351 }
352
353
354 void
_CopyDouble2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)355 Resampler::_CopyDouble2Char(const void *inputData, uint32 inputStride,
356 void *outputData, uint32 outputStride, uint32 sampleCount)
357 {
358 while (sampleCount > 0) {
359 *(int8*)outputData = (int8)(*(const double*)inputData * 127.0f);
360
361 outputData = (void*)((uint8*)outputData + outputStride);
362 inputData = (void*)((uint8*)inputData + inputStride);
363
364 sampleCount--;
365 }
366 }
367
368
369 void
_CopyShort2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)370 Resampler::_CopyShort2Float(const void *inputData, uint32 inputStride,
371 void *outputData, uint32 outputStride, uint32 sampleCount)
372 {
373 while (sampleCount > 0) {
374 *(float*)outputData = *(const int16*)inputData / 32767.0f;
375
376 outputData = (void*)((uint8*)outputData + outputStride);
377 inputData = (void*)((uint8*)inputData + inputStride);
378
379 sampleCount--;
380 }
381 }
382
383
384 void
_CopyShort2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)385 Resampler::_CopyShort2Double(const void *inputData, uint32 inputStride,
386 void *outputData, uint32 outputStride, uint32 sampleCount)
387 {
388 while (sampleCount > 0) {
389 *(double*)outputData = *(const int16*)inputData / 32767.0;
390
391 outputData = (void*)((uint8*)outputData + outputStride);
392 inputData = (void*)((uint8*)inputData + inputStride);
393
394 sampleCount--;
395 }
396 }
397
398
399 void
_CopyShort2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)400 Resampler::_CopyShort2Int(const void *inputData, uint32 inputStride,
401 void *outputData, uint32 outputStride, uint32 sampleCount)
402 {
403 while (sampleCount > 0) {
404 *(int32*)outputData = (int32)*(const int16*)inputData << 16;
405
406 outputData = (void*)((uint8*)outputData + outputStride);
407 inputData = (void*)((uint8*)inputData + inputStride);
408
409 sampleCount--;
410 }
411 }
412
413
414 void
_CopyShort2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)415 Resampler::_CopyShort2Short(const void *inputData, uint32 inputStride,
416 void *outputData, uint32 outputStride, uint32 sampleCount)
417 {
418 while (sampleCount > 0) {
419 *(int16*)outputData = *(const int16*)inputData;
420
421 outputData = (void*)((uint8*)outputData + outputStride);
422 inputData = (void*)((uint8*)inputData + inputStride);
423
424 sampleCount--;
425 }
426 }
427
428
429 void
_CopyShort2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)430 Resampler::_CopyShort2UChar(const void *inputData, uint32 inputStride,
431 void *outputData, uint32 outputStride, uint32 sampleCount)
432 {
433 while (sampleCount > 0) {
434 *(uint8*)outputData = 128 + (*(const int16*)inputData >> 8);
435
436 outputData = (void*)((uint8*)outputData + outputStride);
437 inputData = (void*)((uint8*)inputData + inputStride);
438
439 sampleCount--;
440 }
441 }
442
443
444 void
_CopyShort2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)445 Resampler::_CopyShort2Char(const void *inputData, uint32 inputStride,
446 void *outputData, uint32 outputStride, uint32 sampleCount)
447 {
448 while (sampleCount > 0) {
449 *(int8*)outputData = *(const int16*)inputData >> 8;
450
451 outputData = (void*)((uint8*)outputData + outputStride);
452 inputData = (void*)((uint8*)inputData + inputStride);
453
454 sampleCount--;
455 }
456 }
457
458
459 void
_CopyInt2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)460 Resampler::_CopyInt2Float(const void *inputData, uint32 inputStride,
461 void *outputData, uint32 outputStride, uint32 sampleCount)
462 {
463 while (sampleCount > 0) {
464 *(float*)outputData = *(const int32*)inputData / 2147483647.0f;
465
466 outputData = (void*)((uint8*)outputData + outputStride);
467 inputData = (void*)((uint8*)inputData + inputStride);
468
469 sampleCount--;
470 }
471 }
472
473
474 void
_CopyInt2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)475 Resampler::_CopyInt2Double(const void *inputData, uint32 inputStride,
476 void *outputData, uint32 outputStride, uint32 sampleCount)
477 {
478 while (sampleCount > 0) {
479 *(double*)outputData = *(const int32*)inputData / 2147483647.0;
480
481 outputData = (void*)((uint8*)outputData + outputStride);
482 inputData = (void*)((uint8*)inputData + inputStride);
483
484 sampleCount--;
485 }
486 }
487
488
489 void
_CopyInt2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)490 Resampler::_CopyInt2Int(const void *inputData, uint32 inputStride,
491 void *outputData, uint32 outputStride, uint32 sampleCount)
492 {
493 while (sampleCount > 0) {
494 *(int32*)outputData = *(const int32*)inputData;
495
496 outputData = (void*)((uint8*)outputData + outputStride);
497 inputData = (void*)((uint8*)inputData + inputStride);
498
499 sampleCount--;
500 }
501 }
502
503
504 void
_CopyInt2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)505 Resampler::_CopyInt2Short(const void *inputData, uint32 inputStride,
506 void *outputData, uint32 outputStride, uint32 sampleCount)
507 {
508 while (sampleCount > 0) {
509 *(int16*)outputData = *(const int32*)inputData >> 16;
510
511 outputData = (void*)((uint8*)outputData + outputStride);
512 inputData = (void*)((uint8*)inputData + inputStride);
513
514 sampleCount--;
515 }
516 }
517
518
519 void
_CopyInt2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)520 Resampler::_CopyInt2UChar(const void *inputData, uint32 inputStride,
521 void *outputData, uint32 outputStride, uint32 sampleCount)
522 {
523 while (sampleCount > 0) {
524 *(uint8*)outputData = 128 + (*(const int32*)inputData >> 24);
525
526 outputData = (void*)((uint8*)outputData + outputStride);
527 inputData = (void*)((uint8*)inputData + inputStride);
528
529 sampleCount--;
530 }
531 }
532
533
534 void
_CopyInt2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)535 Resampler::_CopyInt2Char(const void *inputData, uint32 inputStride,
536 void *outputData, uint32 outputStride, uint32 sampleCount)
537 {
538 while (sampleCount > 0) {
539 *(uint8*)outputData = *(const int32*)inputData >> 24;
540
541 outputData = (void*)((uint8*)outputData + outputStride);
542 inputData = (void*)((uint8*)inputData + inputStride);
543
544 sampleCount--;
545 }
546 }
547
548
549 void
_CopyUChar2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)550 Resampler::_CopyUChar2Float(const void *inputData, uint32 inputStride,
551 void *outputData, uint32 outputStride, uint32 sampleCount)
552 {
553 while (sampleCount > 0) {
554 *(float*)outputData = (*(const uint8*)inputData - 128) / 127.0f;
555
556 outputData = (void*)((uint8*)outputData + outputStride);
557 inputData = (void*)((uint8*)inputData + inputStride);
558
559 sampleCount--;
560 }
561 }
562
563
564 void
_CopyUChar2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)565 Resampler::_CopyUChar2Double(const void *inputData, uint32 inputStride,
566 void *outputData, uint32 outputStride, uint32 sampleCount)
567 {
568 while (sampleCount > 0) {
569 *(double*)outputData = (*(const uint8*)inputData - 128) / 127.0;
570
571 outputData = (void*)((uint8*)outputData + outputStride);
572 inputData = (void*)((uint8*)inputData + inputStride);
573
574 sampleCount--;
575 }
576 }
577
578
579 void
_CopyUChar2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)580 Resampler::_CopyUChar2Short(const void *inputData, uint32 inputStride,
581 void *outputData, uint32 outputStride, uint32 sampleCount)
582 {
583 while (sampleCount > 0) {
584 *(int16*)outputData = (int16)(*(const uint8*)inputData - 128) << 8;
585
586 outputData = (void*)((uint8*)outputData + outputStride);
587 inputData = (void*)((uint8*)inputData + inputStride);
588
589 sampleCount--;
590 }
591 }
592
593
594 void
_CopyUChar2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)595 Resampler::_CopyUChar2Int(const void *inputData, uint32 inputStride,
596 void *outputData, uint32 outputStride, uint32 sampleCount)
597 {
598 while (sampleCount > 0) {
599 *(int32*)outputData = (int32)(*(const uint8*)inputData - 128) << 24;
600
601 outputData = (void*)((uint8*)outputData + outputStride);
602 inputData = (void*)((uint8*)inputData + inputStride);
603
604 sampleCount--;
605 }
606 }
607
608
609 void
_CopyUChar2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)610 Resampler::_CopyUChar2UChar(const void *inputData, uint32 inputStride,
611 void *outputData, uint32 outputStride, uint32 sampleCount)
612 {
613 while (sampleCount > 0) {
614 *(uint8*)outputData = *(const uint8*)inputData;
615
616 outputData = (void*)((uint8*)outputData + outputStride);
617 inputData = (void*)((uint8*)inputData + inputStride);
618
619 sampleCount--;
620 }
621 }
622
623
624 void
_CopyUChar2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)625 Resampler::_CopyUChar2Char(const void *inputData, uint32 inputStride,
626 void *outputData, uint32 outputStride, uint32 sampleCount)
627 {
628 while (sampleCount > 0) {
629 *(int8*)outputData = *(const uint8*)inputData - 128;
630
631 outputData = (void*)((uint8*)outputData + outputStride);
632 inputData = (void*)((uint8*)inputData + inputStride);
633
634 sampleCount--;
635 }
636 }
637
638
639 void
_CopyChar2Float(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)640 Resampler::_CopyChar2Float(const void *inputData, uint32 inputStride,
641 void *outputData, uint32 outputStride, uint32 sampleCount)
642 {
643 while (sampleCount > 0) {
644 *(float*)outputData = *(const int8*)inputData / 127.0f;
645
646 outputData = (void*)((uint8*)outputData + outputStride);
647 inputData = (void*)((uint8*)inputData + inputStride);
648
649 sampleCount--;
650 }
651 }
652
653
654 void
_CopyChar2Double(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)655 Resampler::_CopyChar2Double(const void *inputData, uint32 inputStride,
656 void *outputData, uint32 outputStride, uint32 sampleCount)
657 {
658 while (sampleCount > 0) {
659 *(double*)outputData = *(const int8*)inputData / 127.0;
660
661 outputData = (void*)((uint8*)outputData + outputStride);
662 inputData = (void*)((uint8*)inputData + inputStride);
663
664 sampleCount--;
665 }
666 }
667
668
669 void
_CopyChar2Short(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)670 Resampler::_CopyChar2Short(const void *inputData, uint32 inputStride,
671 void *outputData, uint32 outputStride, uint32 sampleCount)
672 {
673 while (sampleCount > 0) {
674 *(int16*)outputData = ((int16)*(const int8*)inputData) << 8;
675
676 outputData = (void*)((uint8*)outputData + outputStride);
677 inputData = (void*)((uint8*)inputData + inputStride);
678
679 sampleCount--;
680 }
681 }
682
683
684 void
_CopyChar2Int(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)685 Resampler::_CopyChar2Int(const void *inputData, uint32 inputStride,
686 void *outputData, uint32 outputStride, uint32 sampleCount)
687 {
688 while (sampleCount > 0) {
689 *(int32*)outputData = ((int16)*(const int8*)inputData) << 24;
690
691 outputData = (void*)((uint8*)outputData + outputStride);
692 inputData = (void*)((uint8*)inputData + inputStride);
693
694 sampleCount--;
695 }
696 }
697
698
699 void
_CopyChar2UChar(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)700 Resampler::_CopyChar2UChar(const void *inputData, uint32 inputStride,
701 void *outputData, uint32 outputStride, uint32 sampleCount)
702 {
703 while (sampleCount > 0) {
704 *(uint8*)outputData = *(const int8*)inputData + 128;
705
706 outputData = (void*)((uint8*)outputData + outputStride);
707 inputData = (void*)((uint8*)inputData + inputStride);
708
709 sampleCount--;
710 }
711 }
712
713
714 void
_CopyChar2Char(const void * inputData,uint32 inputStride,void * outputData,uint32 outputStride,uint32 sampleCount)715 Resampler::_CopyChar2Char(const void *inputData, uint32 inputStride,
716 void *outputData, uint32 outputStride, uint32 sampleCount)
717 {
718 while (sampleCount > 0) {
719 *(int8*)outputData = *(const int8*)inputData;
720
721 outputData = (void*)((uint8*)outputData + outputStride);
722 inputData = (void*)((uint8*)inputData + inputStride);
723
724 sampleCount--;
725 }
726 }
727
728