1 // this code is based on a52dec/libao/audio_out_oss.c
3 static inline int16_t convert (int32_t i)
7 else if (i < 0x43bf8000)
10 return i - 0x43c00000;
13 static int a52_resample_MONO_to_5_C(float * _f, int16_t * s16){
15 int32_t * f = (int32_t *) _f;
16 for (i = 0; i < 256; i++) {
17 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
18 s16[5*i+4] = convert (f[i]);
23 static int a52_resample_MONO_to_1_C(float * _f, int16_t * s16){
25 int32_t * f = (int32_t *) _f;
26 for (i = 0; i < 256; i++) {
27 s16[i] = convert (f[i]);
32 static int a52_resample_STEREO_to_2_C(float * _f, int16_t * s16){
34 int32_t * f = (int32_t *) _f;
35 for (i = 0; i < 256; i++) {
36 s16[2*i] = convert (f[i]);
37 s16[2*i+1] = convert (f[i+256]);
42 static int a52_resample_3F_to_5_C(float * _f, int16_t * s16){
44 int32_t * f = (int32_t *) _f;
45 for (i = 0; i < 256; i++) {
46 s16[5*i] = convert (f[i]);
47 s16[5*i+1] = convert (f[i+512]);
48 s16[5*i+2] = s16[5*i+3] = 0;
49 s16[5*i+4] = convert (f[i+256]);
54 static int a52_resample_2F_2R_to_4_C(float * _f, int16_t * s16){
56 int32_t * f = (int32_t *) _f;
57 for (i = 0; i < 256; i++) {
58 s16[4*i] = convert (f[i]);
59 s16[4*i+1] = convert (f[i+256]);
60 s16[4*i+2] = convert (f[i+512]);
61 s16[4*i+3] = convert (f[i+768]);
66 static int a52_resample_3F_2R_to_5_C(float * _f, int16_t * s16){
68 int32_t * f = (int32_t *) _f;
69 for (i = 0; i < 256; i++) {
70 s16[5*i] = convert (f[i]);
71 s16[5*i+1] = convert (f[i+512]);
72 s16[5*i+2] = convert (f[i+768]);
73 s16[5*i+3] = convert (f[i+1024]);
74 s16[5*i+4] = convert (f[i+256]);
79 static int a52_resample_MONO_LFE_to_6_C(float * _f, int16_t * s16){
81 int32_t * f = (int32_t *) _f;
82 for (i = 0; i < 256; i++) {
83 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
84 s16[6*i+4] = convert (f[i+256]);
85 s16[6*i+5] = convert (f[i]);
90 static int a52_resample_STEREO_LFE_to_6_C(float * _f, int16_t * s16){
92 int32_t * f = (int32_t *) _f;
93 for (i = 0; i < 256; i++) {
94 s16[6*i] = convert (f[i+256]);
95 s16[6*i+1] = convert (f[i+512]);
96 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
97 s16[6*i+5] = convert (f[i]);
102 static int a52_resample_3F_LFE_to_6_C(float * _f, int16_t * s16){
104 int32_t * f = (int32_t *) _f;
105 for (i = 0; i < 256; i++) {
106 s16[6*i] = convert (f[i+256]);
107 s16[6*i+1] = convert (f[i+768]);
108 s16[6*i+2] = s16[6*i+3] = 0;
109 s16[6*i+4] = convert (f[i+512]);
110 s16[6*i+5] = convert (f[i]);
115 static int a52_resample_2F_2R_LFE_to_6_C(float * _f, int16_t * s16){
117 int32_t * f = (int32_t *) _f;
118 for (i = 0; i < 256; i++) {
119 s16[6*i] = convert (f[i+256]);
120 s16[6*i+1] = convert (f[i+512]);
121 s16[6*i+2] = convert (f[i+768]);
122 s16[6*i+3] = convert (f[i+1024]);
124 s16[6*i+5] = convert (f[i]);
129 static int a52_resample_3F_2R_LFE_to_6_C(float * _f, int16_t * s16){
131 int32_t * f = (int32_t *) _f;
132 for (i = 0; i < 256; i++) {
133 s16[6*i] = convert (f[i+256]);
134 s16[6*i+1] = convert (f[i+768]);
135 s16[6*i+2] = convert (f[i+1024]);
136 s16[6*i+3] = convert (f[i+1280]);
137 s16[6*i+4] = convert (f[i+512]);
138 s16[6*i+5] = convert (f[i]);
144 static void* a52_resample_C(int flags, int ch){
147 if(ch==5) return a52_resample_MONO_to_5_C;
148 if(ch==1) return a52_resample_MONO_to_1_C;
153 if(ch==2) return a52_resample_STEREO_to_2_C;
156 if(ch==5) return a52_resample_3F_to_5_C;
159 if(ch==4) return a52_resample_2F_2R_to_4_C;
162 if(ch==5) return a52_resample_3F_2R_to_5_C;
164 case A52_MONO | A52_LFE:
165 if(ch==6) return a52_resample_MONO_LFE_to_6_C;
167 case A52_CHANNEL | A52_LFE:
168 case A52_STEREO | A52_LFE:
169 case A52_DOLBY | A52_LFE:
170 if(ch==6) return a52_resample_STEREO_LFE_to_6_C;
172 case A52_3F | A52_LFE:
173 if(ch==6) return a52_resample_3F_LFE_to_6_C;
175 case A52_2F2R | A52_LFE:
176 if(ch==6) return a52_resample_2F_2R_LFE_to_6_C;
178 case A52_3F2R | A52_LFE:
179 if(ch==6) return a52_resample_3F_2R_LFE_to_6_C;