comparison liba52/resample_mmx.c @ 3412:21d65a4ae3c9

resample.c added - float->int conversion and channel ordering
author arpi
date Sun, 09 Dec 2001 19:23:15 +0000
parents
children 9e1e88b3ca18
comparison
equal deleted inserted replaced
3411:1c571bccd19a 3412:21d65a4ae3c9
1 // this code come from a52dec/libao/audio_out_oss.c
2
3 // FIXME FIXME FIXME
4
5 // a52_resample_init should find the requested converter (from type flags ->
6 // given number of channels) and set up some function pointers...
7
8 // a52_resample() should do the conversion.
9
10 #include <inttypes.h>
11 #include "a52.h"
12
13 static inline int16_t convert (int32_t i)
14 {
15 if (i > 0x43c07fff)
16 return 32767;
17 else if (i < 0x43bf8000)
18 return -32768;
19 else
20 return i - 0x43c00000;
21 }
22
23 static int chans=2;
24 static int flags=0;
25
26 void a52_resample_init(int _flags,int _chans){
27 chans=_chans;
28 flags=_flags;
29 }
30
31 int a52_resample(float * _f, int16_t * s16)
32 {
33 int i;
34 int32_t * f = (int32_t *) _f;
35
36 switch (flags) {
37 case A52_MONO:
38 for (i = 0; i < 256; i++) {
39 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
40 s16[5*i+4] = convert (f[i]);
41 }
42 break;
43 case A52_CHANNEL:
44 case A52_STEREO:
45 case A52_DOLBY:
46 for (i = 0; i < 256; i++) {
47 s16[2*i] = convert (f[i]);
48 s16[2*i+1] = convert (f[i+256]);
49 }
50 break;
51 case A52_3F:
52 for (i = 0; i < 256; i++) {
53 s16[5*i] = convert (f[i]);
54 s16[5*i+1] = convert (f[i+512]);
55 s16[5*i+2] = s16[5*i+3] = 0;
56 s16[5*i+4] = convert (f[i+256]);
57 }
58 break;
59 case A52_2F2R:
60 for (i = 0; i < 256; i++) {
61 s16[4*i] = convert (f[i]);
62 s16[4*i+1] = convert (f[i+256]);
63 s16[4*i+2] = convert (f[i+512]);
64 s16[4*i+3] = convert (f[i+768]);
65 }
66 break;
67 case A52_3F2R:
68 for (i = 0; i < 256; i++) {
69 s16[5*i] = convert (f[i]);
70 s16[5*i+1] = convert (f[i+512]);
71 s16[5*i+2] = convert (f[i+768]);
72 s16[5*i+3] = convert (f[i+1024]);
73 s16[5*i+4] = convert (f[i+256]);
74 }
75 break;
76 case A52_MONO | A52_LFE:
77 for (i = 0; i < 256; i++) {
78 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
79 s16[6*i+4] = convert (f[i+256]);
80 s16[6*i+5] = convert (f[i]);
81 }
82 break;
83 case A52_CHANNEL | A52_LFE:
84 case A52_STEREO | A52_LFE:
85 case A52_DOLBY | A52_LFE:
86 for (i = 0; i < 256; i++) {
87 s16[6*i] = convert (f[i+256]);
88 s16[6*i+1] = convert (f[i+512]);
89 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
90 s16[6*i+5] = convert (f[i]);
91 }
92 break;
93 case A52_3F | A52_LFE:
94 for (i = 0; i < 256; i++) {
95 s16[6*i] = convert (f[i+256]);
96 s16[6*i+1] = convert (f[i+768]);
97 s16[6*i+2] = s16[6*i+3] = 0;
98 s16[6*i+4] = convert (f[i+512]);
99 s16[6*i+5] = convert (f[i]);
100 }
101 break;
102 case A52_2F2R | A52_LFE:
103 for (i = 0; i < 256; i++) {
104 s16[6*i] = convert (f[i+256]);
105 s16[6*i+1] = convert (f[i+512]);
106 s16[6*i+2] = convert (f[i+768]);
107 s16[6*i+3] = convert (f[i+1024]);
108 s16[6*i+4] = 0;
109 s16[6*i+5] = convert (f[i]);
110 }
111 break;
112 case A52_3F2R | A52_LFE:
113 for (i = 0; i < 256; i++) {
114 s16[6*i] = convert (f[i+256]);
115 s16[6*i+1] = convert (f[i+768]);
116 s16[6*i+2] = convert (f[i+1024]);
117 s16[6*i+3] = convert (f[i+1280]);
118 s16[6*i+4] = convert (f[i+512]);
119 s16[6*i+5] = convert (f[i]);
120 }
121 break;
122 }
123 return chans*256;
124 }
125