Mercurial > sdl-ios-xcode
comparison src/audio/SDL_audiocvt.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 290b5baf2fca |
children | 3b4ce57c6215 |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
25 | 25 |
26 #include "SDL_audio.h" | 26 #include "SDL_audio.h" |
27 | 27 |
28 | 28 |
29 /* Effectively mix right and left channels into a single channel */ | 29 /* Effectively mix right and left channels into a single channel */ |
30 void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 format) | 30 void SDLCALL |
31 { | 31 SDL_ConvertMono(SDL_AudioCVT * cvt, Uint16 format) |
32 int i; | 32 { |
33 Sint32 sample; | 33 int i; |
34 | 34 Sint32 sample; |
35 #ifdef DEBUG_CONVERT | 35 |
36 fprintf(stderr, "Converting to mono\n"); | 36 #ifdef DEBUG_CONVERT |
37 #endif | 37 fprintf(stderr, "Converting to mono\n"); |
38 switch (format&0x8018) { | 38 #endif |
39 | 39 switch (format & 0x8018) { |
40 case AUDIO_U8: { | 40 |
41 Uint8 *src, *dst; | 41 case AUDIO_U8: |
42 | 42 { |
43 src = cvt->buf; | 43 Uint8 *src, *dst; |
44 dst = cvt->buf; | 44 |
45 for ( i=cvt->len_cvt/2; i; --i ) { | 45 src = cvt->buf; |
46 sample = src[0] + src[1]; | 46 dst = cvt->buf; |
47 if ( sample > 255 ) { | 47 for (i = cvt->len_cvt / 2; i; --i) { |
48 *dst = 255; | 48 sample = src[0] + src[1]; |
49 } else { | 49 if (sample > 255) { |
50 *dst = (Uint8)sample; | 50 *dst = 255; |
51 } | 51 } else { |
52 src += 2; | 52 *dst = (Uint8) sample; |
53 dst += 1; | 53 } |
54 } | 54 src += 2; |
55 } | 55 dst += 1; |
56 break; | 56 } |
57 | 57 } |
58 case AUDIO_S8: { | 58 break; |
59 Sint8 *src, *dst; | 59 |
60 | 60 case AUDIO_S8: |
61 src = (Sint8 *)cvt->buf; | 61 { |
62 dst = (Sint8 *)cvt->buf; | 62 Sint8 *src, *dst; |
63 for ( i=cvt->len_cvt/2; i; --i ) { | 63 |
64 sample = src[0] + src[1]; | 64 src = (Sint8 *) cvt->buf; |
65 if ( sample > 127 ) { | 65 dst = (Sint8 *) cvt->buf; |
66 *dst = 127; | 66 for (i = cvt->len_cvt / 2; i; --i) { |
67 } else | 67 sample = src[0] + src[1]; |
68 if ( sample < -128 ) { | 68 if (sample > 127) { |
69 *dst = -128; | 69 *dst = 127; |
70 } else { | 70 } else if (sample < -128) { |
71 *dst = (Sint8)sample; | 71 *dst = -128; |
72 } | 72 } else { |
73 src += 2; | 73 *dst = (Sint8) sample; |
74 dst += 1; | 74 } |
75 } | 75 src += 2; |
76 } | 76 dst += 1; |
77 break; | 77 } |
78 | 78 } |
79 case AUDIO_U16: { | 79 break; |
80 Uint8 *src, *dst; | 80 |
81 | 81 case AUDIO_U16: |
82 src = cvt->buf; | 82 { |
83 dst = cvt->buf; | 83 Uint8 *src, *dst; |
84 if ( (format & 0x1000) == 0x1000 ) { | 84 |
85 for ( i=cvt->len_cvt/4; i; --i ) { | 85 src = cvt->buf; |
86 sample = (Uint16)((src[0]<<8)|src[1])+ | 86 dst = cvt->buf; |
87 (Uint16)((src[2]<<8)|src[3]); | 87 if ((format & 0x1000) == 0x1000) { |
88 if ( sample > 65535 ) { | 88 for (i = cvt->len_cvt / 4; i; --i) { |
89 dst[0] = 0xFF; | 89 sample = (Uint16) ((src[0] << 8) | src[1]) + |
90 dst[1] = 0xFF; | 90 (Uint16) ((src[2] << 8) | src[3]); |
91 } else { | 91 if (sample > 65535) { |
92 dst[1] = (sample&0xFF); | 92 dst[0] = 0xFF; |
93 sample >>= 8; | 93 dst[1] = 0xFF; |
94 dst[0] = (sample&0xFF); | 94 } else { |
95 } | 95 dst[1] = (sample & 0xFF); |
96 src += 4; | 96 sample >>= 8; |
97 dst += 2; | 97 dst[0] = (sample & 0xFF); |
98 } | 98 } |
99 } else { | 99 src += 4; |
100 for ( i=cvt->len_cvt/4; i; --i ) { | 100 dst += 2; |
101 sample = (Uint16)((src[1]<<8)|src[0])+ | 101 } |
102 (Uint16)((src[3]<<8)|src[2]); | 102 } else { |
103 if ( sample > 65535 ) { | 103 for (i = cvt->len_cvt / 4; i; --i) { |
104 dst[0] = 0xFF; | 104 sample = (Uint16) ((src[1] << 8) | src[0]) + |
105 dst[1] = 0xFF; | 105 (Uint16) ((src[3] << 8) | src[2]); |
106 } else { | 106 if (sample > 65535) { |
107 dst[0] = (sample&0xFF); | 107 dst[0] = 0xFF; |
108 sample >>= 8; | 108 dst[1] = 0xFF; |
109 dst[1] = (sample&0xFF); | 109 } else { |
110 } | 110 dst[0] = (sample & 0xFF); |
111 src += 4; | 111 sample >>= 8; |
112 dst += 2; | 112 dst[1] = (sample & 0xFF); |
113 } | 113 } |
114 } | 114 src += 4; |
115 } | 115 dst += 2; |
116 break; | 116 } |
117 | 117 } |
118 case AUDIO_S16: { | 118 } |
119 Uint8 *src, *dst; | 119 break; |
120 | 120 |
121 src = cvt->buf; | 121 case AUDIO_S16: |
122 dst = cvt->buf; | 122 { |
123 if ( (format & 0x1000) == 0x1000 ) { | 123 Uint8 *src, *dst; |
124 for ( i=cvt->len_cvt/4; i; --i ) { | 124 |
125 sample = (Sint16)((src[0]<<8)|src[1])+ | 125 src = cvt->buf; |
126 (Sint16)((src[2]<<8)|src[3]); | 126 dst = cvt->buf; |
127 if ( sample > 32767 ) { | 127 if ((format & 0x1000) == 0x1000) { |
128 dst[0] = 0x7F; | 128 for (i = cvt->len_cvt / 4; i; --i) { |
129 dst[1] = 0xFF; | 129 sample = (Sint16) ((src[0] << 8) | src[1]) + |
130 } else | 130 (Sint16) ((src[2] << 8) | src[3]); |
131 if ( sample < -32768 ) { | 131 if (sample > 32767) { |
132 dst[0] = 0x80; | 132 dst[0] = 0x7F; |
133 dst[1] = 0x00; | 133 dst[1] = 0xFF; |
134 } else { | 134 } else if (sample < -32768) { |
135 dst[1] = (sample&0xFF); | 135 dst[0] = 0x80; |
136 sample >>= 8; | 136 dst[1] = 0x00; |
137 dst[0] = (sample&0xFF); | 137 } else { |
138 } | 138 dst[1] = (sample & 0xFF); |
139 src += 4; | 139 sample >>= 8; |
140 dst += 2; | 140 dst[0] = (sample & 0xFF); |
141 } | 141 } |
142 } else { | 142 src += 4; |
143 for ( i=cvt->len_cvt/4; i; --i ) { | 143 dst += 2; |
144 sample = (Sint16)((src[1]<<8)|src[0])+ | 144 } |
145 (Sint16)((src[3]<<8)|src[2]); | 145 } else { |
146 if ( sample > 32767 ) { | 146 for (i = cvt->len_cvt / 4; i; --i) { |
147 dst[1] = 0x7F; | 147 sample = (Sint16) ((src[1] << 8) | src[0]) + |
148 dst[0] = 0xFF; | 148 (Sint16) ((src[3] << 8) | src[2]); |
149 } else | 149 if (sample > 32767) { |
150 if ( sample < -32768 ) { | 150 dst[1] = 0x7F; |
151 dst[1] = 0x80; | 151 dst[0] = 0xFF; |
152 dst[0] = 0x00; | 152 } else if (sample < -32768) { |
153 } else { | 153 dst[1] = 0x80; |
154 dst[0] = (sample&0xFF); | 154 dst[0] = 0x00; |
155 sample >>= 8; | 155 } else { |
156 dst[1] = (sample&0xFF); | 156 dst[0] = (sample & 0xFF); |
157 } | 157 sample >>= 8; |
158 src += 4; | 158 dst[1] = (sample & 0xFF); |
159 dst += 2; | 159 } |
160 } | 160 src += 4; |
161 } | 161 dst += 2; |
162 } | 162 } |
163 break; | 163 } |
164 } | 164 } |
165 cvt->len_cvt /= 2; | 165 break; |
166 if ( cvt->filters[++cvt->filter_index] ) { | 166 } |
167 cvt->filters[cvt->filter_index](cvt, format); | 167 cvt->len_cvt /= 2; |
168 } | 168 if (cvt->filters[++cvt->filter_index]) { |
169 cvt->filters[cvt->filter_index] (cvt, format); | |
170 } | |
169 } | 171 } |
170 | 172 |
171 /* Discard top 4 channels */ | 173 /* Discard top 4 channels */ |
172 void SDLCALL SDL_ConvertStrip(SDL_AudioCVT *cvt, Uint16 format) | 174 void SDLCALL |
173 { | 175 SDL_ConvertStrip(SDL_AudioCVT * cvt, Uint16 format) |
174 int i; | 176 { |
175 Sint32 lsample, rsample; | 177 int i; |
176 | 178 Sint32 lsample, rsample; |
177 #ifdef DEBUG_CONVERT | 179 |
178 fprintf(stderr, "Converting down to stereo\n"); | 180 #ifdef DEBUG_CONVERT |
179 #endif | 181 fprintf(stderr, "Converting down to stereo\n"); |
180 switch (format&0x8018) { | 182 #endif |
181 | 183 switch (format & 0x8018) { |
182 case AUDIO_U8: { | 184 |
183 Uint8 *src, *dst; | 185 case AUDIO_U8: |
184 | 186 { |
185 src = cvt->buf; | 187 Uint8 *src, *dst; |
186 dst = cvt->buf; | 188 |
187 for ( i=cvt->len_cvt/6; i; --i ) { | 189 src = cvt->buf; |
188 dst[0] = src[0]; | 190 dst = cvt->buf; |
189 dst[1] = src[1]; | 191 for (i = cvt->len_cvt / 6; i; --i) { |
190 src += 6; | 192 dst[0] = src[0]; |
191 dst += 2; | 193 dst[1] = src[1]; |
192 } | 194 src += 6; |
193 } | 195 dst += 2; |
194 break; | 196 } |
195 | 197 } |
196 case AUDIO_S8: { | 198 break; |
197 Sint8 *src, *dst; | 199 |
198 | 200 case AUDIO_S8: |
199 src = (Sint8 *)cvt->buf; | 201 { |
200 dst = (Sint8 *)cvt->buf; | 202 Sint8 *src, *dst; |
201 for ( i=cvt->len_cvt/6; i; --i ) { | 203 |
202 dst[0] = src[0]; | 204 src = (Sint8 *) cvt->buf; |
203 dst[1] = src[1]; | 205 dst = (Sint8 *) cvt->buf; |
204 src += 6; | 206 for (i = cvt->len_cvt / 6; i; --i) { |
205 dst += 2; | 207 dst[0] = src[0]; |
206 } | 208 dst[1] = src[1]; |
207 } | 209 src += 6; |
208 break; | 210 dst += 2; |
209 | 211 } |
210 case AUDIO_U16: { | 212 } |
211 Uint8 *src, *dst; | 213 break; |
212 | 214 |
213 src = cvt->buf; | 215 case AUDIO_U16: |
214 dst = cvt->buf; | 216 { |
215 if ( (format & 0x1000) == 0x1000 ) { | 217 Uint8 *src, *dst; |
216 for ( i=cvt->len_cvt/12; i; --i ) { | 218 |
217 lsample = (Uint16)((src[0]<<8)|src[1]); | 219 src = cvt->buf; |
218 rsample = (Uint16)((src[2]<<8)|src[3]); | 220 dst = cvt->buf; |
219 dst[1] = (lsample&0xFF); | 221 if ((format & 0x1000) == 0x1000) { |
220 lsample >>= 8; | 222 for (i = cvt->len_cvt / 12; i; --i) { |
221 dst[0] = (lsample&0xFF); | 223 lsample = (Uint16) ((src[0] << 8) | src[1]); |
222 dst[3] = (rsample&0xFF); | 224 rsample = (Uint16) ((src[2] << 8) | src[3]); |
223 rsample >>= 8; | 225 dst[1] = (lsample & 0xFF); |
224 dst[2] = (rsample&0xFF); | 226 lsample >>= 8; |
225 src += 12; | 227 dst[0] = (lsample & 0xFF); |
226 dst += 4; | 228 dst[3] = (rsample & 0xFF); |
227 } | 229 rsample >>= 8; |
228 } else { | 230 dst[2] = (rsample & 0xFF); |
229 for ( i=cvt->len_cvt/12; i; --i ) { | 231 src += 12; |
230 lsample = (Uint16)((src[1]<<8)|src[0]); | 232 dst += 4; |
231 rsample = (Uint16)((src[3]<<8)|src[2]); | 233 } |
232 dst[0] = (lsample&0xFF); | 234 } else { |
233 lsample >>= 8; | 235 for (i = cvt->len_cvt / 12; i; --i) { |
234 dst[1] = (lsample&0xFF); | 236 lsample = (Uint16) ((src[1] << 8) | src[0]); |
235 dst[2] = (rsample&0xFF); | 237 rsample = (Uint16) ((src[3] << 8) | src[2]); |
236 rsample >>= 8; | 238 dst[0] = (lsample & 0xFF); |
237 dst[3] = (rsample&0xFF); | 239 lsample >>= 8; |
238 src += 12; | 240 dst[1] = (lsample & 0xFF); |
239 dst += 4; | 241 dst[2] = (rsample & 0xFF); |
240 } | 242 rsample >>= 8; |
241 } | 243 dst[3] = (rsample & 0xFF); |
242 } | 244 src += 12; |
243 break; | 245 dst += 4; |
244 | 246 } |
245 case AUDIO_S16: { | 247 } |
246 Uint8 *src, *dst; | 248 } |
247 | 249 break; |
248 src = cvt->buf; | 250 |
249 dst = cvt->buf; | 251 case AUDIO_S16: |
250 if ( (format & 0x1000) == 0x1000 ) { | 252 { |
251 for ( i=cvt->len_cvt/12; i; --i ) { | 253 Uint8 *src, *dst; |
252 lsample = (Sint16)((src[0]<<8)|src[1]); | 254 |
253 rsample = (Sint16)((src[2]<<8)|src[3]); | 255 src = cvt->buf; |
254 dst[1] = (lsample&0xFF); | 256 dst = cvt->buf; |
255 lsample >>= 8; | 257 if ((format & 0x1000) == 0x1000) { |
256 dst[0] = (lsample&0xFF); | 258 for (i = cvt->len_cvt / 12; i; --i) { |
257 dst[3] = (rsample&0xFF); | 259 lsample = (Sint16) ((src[0] << 8) | src[1]); |
258 rsample >>= 8; | 260 rsample = (Sint16) ((src[2] << 8) | src[3]); |
259 dst[2] = (rsample&0xFF); | 261 dst[1] = (lsample & 0xFF); |
260 src += 12; | 262 lsample >>= 8; |
261 dst += 4; | 263 dst[0] = (lsample & 0xFF); |
262 } | 264 dst[3] = (rsample & 0xFF); |
263 } else { | 265 rsample >>= 8; |
264 for ( i=cvt->len_cvt/12; i; --i ) { | 266 dst[2] = (rsample & 0xFF); |
265 lsample = (Sint16)((src[1]<<8)|src[0]); | 267 src += 12; |
266 rsample = (Sint16)((src[3]<<8)|src[2]); | 268 dst += 4; |
267 dst[0] = (lsample&0xFF); | 269 } |
268 lsample >>= 8; | 270 } else { |
269 dst[1] = (lsample&0xFF); | 271 for (i = cvt->len_cvt / 12; i; --i) { |
270 dst[2] = (rsample&0xFF); | 272 lsample = (Sint16) ((src[1] << 8) | src[0]); |
271 rsample >>= 8; | 273 rsample = (Sint16) ((src[3] << 8) | src[2]); |
272 dst[3] = (rsample&0xFF); | 274 dst[0] = (lsample & 0xFF); |
273 src += 12; | 275 lsample >>= 8; |
274 dst += 4; | 276 dst[1] = (lsample & 0xFF); |
275 } | 277 dst[2] = (rsample & 0xFF); |
276 } | 278 rsample >>= 8; |
277 } | 279 dst[3] = (rsample & 0xFF); |
278 break; | 280 src += 12; |
279 } | 281 dst += 4; |
280 cvt->len_cvt /= 3; | 282 } |
281 if ( cvt->filters[++cvt->filter_index] ) { | 283 } |
282 cvt->filters[cvt->filter_index](cvt, format); | 284 } |
283 } | 285 break; |
286 } | |
287 cvt->len_cvt /= 3; | |
288 if (cvt->filters[++cvt->filter_index]) { | |
289 cvt->filters[cvt->filter_index] (cvt, format); | |
290 } | |
284 } | 291 } |
285 | 292 |
286 | 293 |
287 /* Discard top 2 channels of 6 */ | 294 /* Discard top 2 channels of 6 */ |
288 void SDLCALL SDL_ConvertStrip_2(SDL_AudioCVT *cvt, Uint16 format) | 295 void SDLCALL |
289 { | 296 SDL_ConvertStrip_2(SDL_AudioCVT * cvt, Uint16 format) |
290 int i; | 297 { |
291 Sint32 lsample, rsample; | 298 int i; |
292 | 299 Sint32 lsample, rsample; |
293 #ifdef DEBUG_CONVERT | 300 |
294 fprintf(stderr, "Converting 6 down to quad\n"); | 301 #ifdef DEBUG_CONVERT |
295 #endif | 302 fprintf(stderr, "Converting 6 down to quad\n"); |
296 switch (format&0x8018) { | 303 #endif |
297 | 304 switch (format & 0x8018) { |
298 case AUDIO_U8: { | 305 |
299 Uint8 *src, *dst; | 306 case AUDIO_U8: |
300 | 307 { |
301 src = cvt->buf; | 308 Uint8 *src, *dst; |
302 dst = cvt->buf; | 309 |
303 for ( i=cvt->len_cvt/4; i; --i ) { | 310 src = cvt->buf; |
304 dst[0] = src[0]; | 311 dst = cvt->buf; |
305 dst[1] = src[1]; | 312 for (i = cvt->len_cvt / 4; i; --i) { |
306 src += 4; | 313 dst[0] = src[0]; |
307 dst += 2; | 314 dst[1] = src[1]; |
308 } | 315 src += 4; |
309 } | 316 dst += 2; |
310 break; | 317 } |
311 | 318 } |
312 case AUDIO_S8: { | 319 break; |
313 Sint8 *src, *dst; | 320 |
314 | 321 case AUDIO_S8: |
315 src = (Sint8 *)cvt->buf; | 322 { |
316 dst = (Sint8 *)cvt->buf; | 323 Sint8 *src, *dst; |
317 for ( i=cvt->len_cvt/4; i; --i ) { | 324 |
318 dst[0] = src[0]; | 325 src = (Sint8 *) cvt->buf; |
319 dst[1] = src[1]; | 326 dst = (Sint8 *) cvt->buf; |
320 src += 4; | 327 for (i = cvt->len_cvt / 4; i; --i) { |
321 dst += 2; | 328 dst[0] = src[0]; |
322 } | 329 dst[1] = src[1]; |
323 } | 330 src += 4; |
324 break; | 331 dst += 2; |
325 | 332 } |
326 case AUDIO_U16: { | 333 } |
327 Uint8 *src, *dst; | 334 break; |
328 | 335 |
329 src = cvt->buf; | 336 case AUDIO_U16: |
330 dst = cvt->buf; | 337 { |
331 if ( (format & 0x1000) == 0x1000 ) { | 338 Uint8 *src, *dst; |
332 for ( i=cvt->len_cvt/8; i; --i ) { | 339 |
333 lsample = (Uint16)((src[0]<<8)|src[1]); | 340 src = cvt->buf; |
334 rsample = (Uint16)((src[2]<<8)|src[3]); | 341 dst = cvt->buf; |
335 dst[1] = (lsample&0xFF); | 342 if ((format & 0x1000) == 0x1000) { |
336 lsample >>= 8; | 343 for (i = cvt->len_cvt / 8; i; --i) { |
337 dst[0] = (lsample&0xFF); | 344 lsample = (Uint16) ((src[0] << 8) | src[1]); |
338 dst[3] = (rsample&0xFF); | 345 rsample = (Uint16) ((src[2] << 8) | src[3]); |
339 rsample >>= 8; | 346 dst[1] = (lsample & 0xFF); |
340 dst[2] = (rsample&0xFF); | 347 lsample >>= 8; |
341 src += 8; | 348 dst[0] = (lsample & 0xFF); |
342 dst += 4; | 349 dst[3] = (rsample & 0xFF); |
343 } | 350 rsample >>= 8; |
344 } else { | 351 dst[2] = (rsample & 0xFF); |
345 for ( i=cvt->len_cvt/8; i; --i ) { | 352 src += 8; |
346 lsample = (Uint16)((src[1]<<8)|src[0]); | 353 dst += 4; |
347 rsample = (Uint16)((src[3]<<8)|src[2]); | 354 } |
348 dst[0] = (lsample&0xFF); | 355 } else { |
349 lsample >>= 8; | 356 for (i = cvt->len_cvt / 8; i; --i) { |
350 dst[1] = (lsample&0xFF); | 357 lsample = (Uint16) ((src[1] << 8) | src[0]); |
351 dst[2] = (rsample&0xFF); | 358 rsample = (Uint16) ((src[3] << 8) | src[2]); |
352 rsample >>= 8; | 359 dst[0] = (lsample & 0xFF); |
353 dst[3] = (rsample&0xFF); | 360 lsample >>= 8; |
354 src += 8; | 361 dst[1] = (lsample & 0xFF); |
355 dst += 4; | 362 dst[2] = (rsample & 0xFF); |
356 } | 363 rsample >>= 8; |
357 } | 364 dst[3] = (rsample & 0xFF); |
358 } | 365 src += 8; |
359 break; | 366 dst += 4; |
360 | 367 } |
361 case AUDIO_S16: { | 368 } |
362 Uint8 *src, *dst; | 369 } |
363 | 370 break; |
364 src = cvt->buf; | 371 |
365 dst = cvt->buf; | 372 case AUDIO_S16: |
366 if ( (format & 0x1000) == 0x1000 ) { | 373 { |
367 for ( i=cvt->len_cvt/8; i; --i ) { | 374 Uint8 *src, *dst; |
368 lsample = (Sint16)((src[0]<<8)|src[1]); | 375 |
369 rsample = (Sint16)((src[2]<<8)|src[3]); | 376 src = cvt->buf; |
370 dst[1] = (lsample&0xFF); | 377 dst = cvt->buf; |
371 lsample >>= 8; | 378 if ((format & 0x1000) == 0x1000) { |
372 dst[0] = (lsample&0xFF); | 379 for (i = cvt->len_cvt / 8; i; --i) { |
373 dst[3] = (rsample&0xFF); | 380 lsample = (Sint16) ((src[0] << 8) | src[1]); |
374 rsample >>= 8; | 381 rsample = (Sint16) ((src[2] << 8) | src[3]); |
375 dst[2] = (rsample&0xFF); | 382 dst[1] = (lsample & 0xFF); |
376 src += 8; | 383 lsample >>= 8; |
377 dst += 4; | 384 dst[0] = (lsample & 0xFF); |
378 } | 385 dst[3] = (rsample & 0xFF); |
379 } else { | 386 rsample >>= 8; |
380 for ( i=cvt->len_cvt/8; i; --i ) { | 387 dst[2] = (rsample & 0xFF); |
381 lsample = (Sint16)((src[1]<<8)|src[0]); | 388 src += 8; |
382 rsample = (Sint16)((src[3]<<8)|src[2]); | 389 dst += 4; |
383 dst[0] = (lsample&0xFF); | 390 } |
384 lsample >>= 8; | 391 } else { |
385 dst[1] = (lsample&0xFF); | 392 for (i = cvt->len_cvt / 8; i; --i) { |
386 dst[2] = (rsample&0xFF); | 393 lsample = (Sint16) ((src[1] << 8) | src[0]); |
387 rsample >>= 8; | 394 rsample = (Sint16) ((src[3] << 8) | src[2]); |
388 dst[3] = (rsample&0xFF); | 395 dst[0] = (lsample & 0xFF); |
389 src += 8; | 396 lsample >>= 8; |
390 dst += 4; | 397 dst[1] = (lsample & 0xFF); |
391 } | 398 dst[2] = (rsample & 0xFF); |
392 } | 399 rsample >>= 8; |
393 } | 400 dst[3] = (rsample & 0xFF); |
394 break; | 401 src += 8; |
395 } | 402 dst += 4; |
396 cvt->len_cvt /= 2; | 403 } |
397 if ( cvt->filters[++cvt->filter_index] ) { | 404 } |
398 cvt->filters[cvt->filter_index](cvt, format); | 405 } |
399 } | 406 break; |
407 } | |
408 cvt->len_cvt /= 2; | |
409 if (cvt->filters[++cvt->filter_index]) { | |
410 cvt->filters[cvt->filter_index] (cvt, format); | |
411 } | |
400 } | 412 } |
401 | 413 |
402 /* Duplicate a mono channel to both stereo channels */ | 414 /* Duplicate a mono channel to both stereo channels */ |
403 void SDLCALL SDL_ConvertStereo(SDL_AudioCVT *cvt, Uint16 format) | 415 void SDLCALL |
404 { | 416 SDL_ConvertStereo(SDL_AudioCVT * cvt, Uint16 format) |
405 int i; | 417 { |
406 | 418 int i; |
407 #ifdef DEBUG_CONVERT | 419 |
408 fprintf(stderr, "Converting to stereo\n"); | 420 #ifdef DEBUG_CONVERT |
409 #endif | 421 fprintf(stderr, "Converting to stereo\n"); |
410 if ( (format & 0xFF) == 16 ) { | 422 #endif |
411 Uint16 *src, *dst; | 423 if ((format & 0xFF) == 16) { |
412 | 424 Uint16 *src, *dst; |
413 src = (Uint16 *)(cvt->buf+cvt->len_cvt); | 425 |
414 dst = (Uint16 *)(cvt->buf+cvt->len_cvt*2); | 426 src = (Uint16 *) (cvt->buf + cvt->len_cvt); |
415 for ( i=cvt->len_cvt/2; i; --i ) { | 427 dst = (Uint16 *) (cvt->buf + cvt->len_cvt * 2); |
416 dst -= 2; | 428 for (i = cvt->len_cvt / 2; i; --i) { |
417 src -= 1; | 429 dst -= 2; |
418 dst[0] = src[0]; | 430 src -= 1; |
419 dst[1] = src[0]; | 431 dst[0] = src[0]; |
420 } | 432 dst[1] = src[0]; |
421 } else { | 433 } |
422 Uint8 *src, *dst; | 434 } else { |
423 | 435 Uint8 *src, *dst; |
424 src = cvt->buf+cvt->len_cvt; | 436 |
425 dst = cvt->buf+cvt->len_cvt*2; | 437 src = cvt->buf + cvt->len_cvt; |
426 for ( i=cvt->len_cvt; i; --i ) { | 438 dst = cvt->buf + cvt->len_cvt * 2; |
427 dst -= 2; | 439 for (i = cvt->len_cvt; i; --i) { |
428 src -= 1; | 440 dst -= 2; |
429 dst[0] = src[0]; | 441 src -= 1; |
430 dst[1] = src[0]; | 442 dst[0] = src[0]; |
431 } | 443 dst[1] = src[0]; |
432 } | 444 } |
433 cvt->len_cvt *= 2; | 445 } |
434 if ( cvt->filters[++cvt->filter_index] ) { | 446 cvt->len_cvt *= 2; |
435 cvt->filters[cvt->filter_index](cvt, format); | 447 if (cvt->filters[++cvt->filter_index]) { |
436 } | 448 cvt->filters[cvt->filter_index] (cvt, format); |
449 } | |
437 } | 450 } |
438 | 451 |
439 | 452 |
440 /* Duplicate a stereo channel to a pseudo-5.1 stream */ | 453 /* Duplicate a stereo channel to a pseudo-5.1 stream */ |
441 void SDLCALL SDL_ConvertSurround(SDL_AudioCVT *cvt, Uint16 format) | 454 void SDLCALL |
442 { | 455 SDL_ConvertSurround(SDL_AudioCVT * cvt, Uint16 format) |
443 int i; | 456 { |
444 | 457 int i; |
445 #ifdef DEBUG_CONVERT | 458 |
446 fprintf(stderr, "Converting stereo to surround\n"); | 459 #ifdef DEBUG_CONVERT |
447 #endif | 460 fprintf(stderr, "Converting stereo to surround\n"); |
448 switch (format&0x8018) { | 461 #endif |
449 | 462 switch (format & 0x8018) { |
450 case AUDIO_U8: { | 463 |
451 Uint8 *src, *dst, lf, rf, ce; | 464 case AUDIO_U8: |
452 | 465 { |
453 src = (Uint8 *)(cvt->buf+cvt->len_cvt); | 466 Uint8 *src, *dst, lf, rf, ce; |
454 dst = (Uint8 *)(cvt->buf+cvt->len_cvt*3); | 467 |
455 for ( i=cvt->len_cvt; i; --i ) { | 468 src = (Uint8 *) (cvt->buf + cvt->len_cvt); |
456 dst -= 6; | 469 dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 3); |
457 src -= 2; | 470 for (i = cvt->len_cvt; i; --i) { |
458 lf = src[0]; | 471 dst -= 6; |
459 rf = src[1]; | 472 src -= 2; |
460 ce = (lf/2) + (rf/2); | 473 lf = src[0]; |
461 dst[0] = lf; | 474 rf = src[1]; |
462 dst[1] = rf; | 475 ce = (lf / 2) + (rf / 2); |
463 dst[2] = lf - ce; | 476 dst[0] = lf; |
464 dst[3] = rf - ce; | 477 dst[1] = rf; |
465 dst[4] = ce; | 478 dst[2] = lf - ce; |
466 dst[5] = ce; | 479 dst[3] = rf - ce; |
467 } | 480 dst[4] = ce; |
468 } | 481 dst[5] = ce; |
469 break; | 482 } |
470 | 483 } |
471 case AUDIO_S8: { | 484 break; |
472 Sint8 *src, *dst, lf, rf, ce; | 485 |
473 | 486 case AUDIO_S8: |
474 src = (Sint8 *)cvt->buf+cvt->len_cvt; | 487 { |
475 dst = (Sint8 *)cvt->buf+cvt->len_cvt*3; | 488 Sint8 *src, *dst, lf, rf, ce; |
476 for ( i=cvt->len_cvt; i; --i ) { | 489 |
477 dst -= 6; | 490 src = (Sint8 *) cvt->buf + cvt->len_cvt; |
478 src -= 2; | 491 dst = (Sint8 *) cvt->buf + cvt->len_cvt * 3; |
479 lf = src[0]; | 492 for (i = cvt->len_cvt; i; --i) { |
480 rf = src[1]; | 493 dst -= 6; |
481 ce = (lf/2) + (rf/2); | 494 src -= 2; |
482 dst[0] = lf; | 495 lf = src[0]; |
483 dst[1] = rf; | 496 rf = src[1]; |
484 dst[2] = lf - ce; | 497 ce = (lf / 2) + (rf / 2); |
485 dst[3] = rf - ce; | 498 dst[0] = lf; |
486 dst[4] = ce; | 499 dst[1] = rf; |
487 dst[5] = ce; | 500 dst[2] = lf - ce; |
488 } | 501 dst[3] = rf - ce; |
489 } | 502 dst[4] = ce; |
490 break; | 503 dst[5] = ce; |
491 | 504 } |
492 case AUDIO_U16: { | 505 } |
493 Uint8 *src, *dst; | 506 break; |
494 Uint16 lf, rf, ce, lr, rr; | 507 |
495 | 508 case AUDIO_U16: |
496 src = cvt->buf+cvt->len_cvt; | 509 { |
497 dst = cvt->buf+cvt->len_cvt*3; | 510 Uint8 *src, *dst; |
498 | 511 Uint16 lf, rf, ce, lr, rr; |
499 if ( (format & 0x1000) == 0x1000 ) { | 512 |
500 for ( i=cvt->len_cvt/4; i; --i ) { | 513 src = cvt->buf + cvt->len_cvt; |
501 dst -= 12; | 514 dst = cvt->buf + cvt->len_cvt * 3; |
502 src -= 4; | 515 |
503 lf = (Uint16)((src[0]<<8)|src[1]); | 516 if ((format & 0x1000) == 0x1000) { |
504 rf = (Uint16)((src[2]<<8)|src[3]); | 517 for (i = cvt->len_cvt / 4; i; --i) { |
505 ce = (lf/2) + (rf/2); | 518 dst -= 12; |
506 rr = lf - ce; | 519 src -= 4; |
507 lr = rf - ce; | 520 lf = (Uint16) ((src[0] << 8) | src[1]); |
508 dst[1] = (lf&0xFF); | 521 rf = (Uint16) ((src[2] << 8) | src[3]); |
509 dst[0] = ((lf>>8)&0xFF); | 522 ce = (lf / 2) + (rf / 2); |
510 dst[3] = (rf&0xFF); | 523 rr = lf - ce; |
511 dst[2] = ((rf>>8)&0xFF); | 524 lr = rf - ce; |
512 | 525 dst[1] = (lf & 0xFF); |
513 dst[1+4] = (lr&0xFF); | 526 dst[0] = ((lf >> 8) & 0xFF); |
514 dst[0+4] = ((lr>>8)&0xFF); | 527 dst[3] = (rf & 0xFF); |
515 dst[3+4] = (rr&0xFF); | 528 dst[2] = ((rf >> 8) & 0xFF); |
516 dst[2+4] = ((rr>>8)&0xFF); | 529 |
517 | 530 dst[1 + 4] = (lr & 0xFF); |
518 dst[1+8] = (ce&0xFF); | 531 dst[0 + 4] = ((lr >> 8) & 0xFF); |
519 dst[0+8] = ((ce>>8)&0xFF); | 532 dst[3 + 4] = (rr & 0xFF); |
520 dst[3+8] = (ce&0xFF); | 533 dst[2 + 4] = ((rr >> 8) & 0xFF); |
521 dst[2+8] = ((ce>>8)&0xFF); | 534 |
522 } | 535 dst[1 + 8] = (ce & 0xFF); |
523 } else { | 536 dst[0 + 8] = ((ce >> 8) & 0xFF); |
524 for ( i=cvt->len_cvt/4; i; --i ) { | 537 dst[3 + 8] = (ce & 0xFF); |
525 dst -= 12; | 538 dst[2 + 8] = ((ce >> 8) & 0xFF); |
526 src -= 4; | 539 } |
527 lf = (Uint16)((src[1]<<8)|src[0]); | 540 } else { |
528 rf = (Uint16)((src[3]<<8)|src[2]); | 541 for (i = cvt->len_cvt / 4; i; --i) { |
529 ce = (lf/2) + (rf/2); | 542 dst -= 12; |
530 rr = lf - ce; | 543 src -= 4; |
531 lr = rf - ce; | 544 lf = (Uint16) ((src[1] << 8) | src[0]); |
532 dst[0] = (lf&0xFF); | 545 rf = (Uint16) ((src[3] << 8) | src[2]); |
533 dst[1] = ((lf>>8)&0xFF); | 546 ce = (lf / 2) + (rf / 2); |
534 dst[2] = (rf&0xFF); | 547 rr = lf - ce; |
535 dst[3] = ((rf>>8)&0xFF); | 548 lr = rf - ce; |
536 | 549 dst[0] = (lf & 0xFF); |
537 dst[0+4] = (lr&0xFF); | 550 dst[1] = ((lf >> 8) & 0xFF); |
538 dst[1+4] = ((lr>>8)&0xFF); | 551 dst[2] = (rf & 0xFF); |
539 dst[2+4] = (rr&0xFF); | 552 dst[3] = ((rf >> 8) & 0xFF); |
540 dst[3+4] = ((rr>>8)&0xFF); | 553 |
541 | 554 dst[0 + 4] = (lr & 0xFF); |
542 dst[0+8] = (ce&0xFF); | 555 dst[1 + 4] = ((lr >> 8) & 0xFF); |
543 dst[1+8] = ((ce>>8)&0xFF); | 556 dst[2 + 4] = (rr & 0xFF); |
544 dst[2+8] = (ce&0xFF); | 557 dst[3 + 4] = ((rr >> 8) & 0xFF); |
545 dst[3+8] = ((ce>>8)&0xFF); | 558 |
546 } | 559 dst[0 + 8] = (ce & 0xFF); |
547 } | 560 dst[1 + 8] = ((ce >> 8) & 0xFF); |
548 } | 561 dst[2 + 8] = (ce & 0xFF); |
549 break; | 562 dst[3 + 8] = ((ce >> 8) & 0xFF); |
550 | 563 } |
551 case AUDIO_S16: { | 564 } |
552 Uint8 *src, *dst; | 565 } |
553 Sint16 lf, rf, ce, lr, rr; | 566 break; |
554 | 567 |
555 src = cvt->buf+cvt->len_cvt; | 568 case AUDIO_S16: |
556 dst = cvt->buf+cvt->len_cvt*3; | 569 { |
557 | 570 Uint8 *src, *dst; |
558 if ( (format & 0x1000) == 0x1000 ) { | 571 Sint16 lf, rf, ce, lr, rr; |
559 for ( i=cvt->len_cvt/4; i; --i ) { | 572 |
560 dst -= 12; | 573 src = cvt->buf + cvt->len_cvt; |
561 src -= 4; | 574 dst = cvt->buf + cvt->len_cvt * 3; |
562 lf = (Sint16)((src[0]<<8)|src[1]); | 575 |
563 rf = (Sint16)((src[2]<<8)|src[3]); | 576 if ((format & 0x1000) == 0x1000) { |
564 ce = (lf/2) + (rf/2); | 577 for (i = cvt->len_cvt / 4; i; --i) { |
565 rr = lf - ce; | 578 dst -= 12; |
566 lr = rf - ce; | 579 src -= 4; |
567 dst[1] = (lf&0xFF); | 580 lf = (Sint16) ((src[0] << 8) | src[1]); |
568 dst[0] = ((lf>>8)&0xFF); | 581 rf = (Sint16) ((src[2] << 8) | src[3]); |
569 dst[3] = (rf&0xFF); | 582 ce = (lf / 2) + (rf / 2); |
570 dst[2] = ((rf>>8)&0xFF); | 583 rr = lf - ce; |
571 | 584 lr = rf - ce; |
572 dst[1+4] = (lr&0xFF); | 585 dst[1] = (lf & 0xFF); |
573 dst[0+4] = ((lr>>8)&0xFF); | 586 dst[0] = ((lf >> 8) & 0xFF); |
574 dst[3+4] = (rr&0xFF); | 587 dst[3] = (rf & 0xFF); |
575 dst[2+4] = ((rr>>8)&0xFF); | 588 dst[2] = ((rf >> 8) & 0xFF); |
576 | 589 |
577 dst[1+8] = (ce&0xFF); | 590 dst[1 + 4] = (lr & 0xFF); |
578 dst[0+8] = ((ce>>8)&0xFF); | 591 dst[0 + 4] = ((lr >> 8) & 0xFF); |
579 dst[3+8] = (ce&0xFF); | 592 dst[3 + 4] = (rr & 0xFF); |
580 dst[2+8] = ((ce>>8)&0xFF); | 593 dst[2 + 4] = ((rr >> 8) & 0xFF); |
581 } | 594 |
582 } else { | 595 dst[1 + 8] = (ce & 0xFF); |
583 for ( i=cvt->len_cvt/4; i; --i ) { | 596 dst[0 + 8] = ((ce >> 8) & 0xFF); |
584 dst -= 12; | 597 dst[3 + 8] = (ce & 0xFF); |
585 src -= 4; | 598 dst[2 + 8] = ((ce >> 8) & 0xFF); |
586 lf = (Sint16)((src[1]<<8)|src[0]); | 599 } |
587 rf = (Sint16)((src[3]<<8)|src[2]); | 600 } else { |
588 ce = (lf/2) + (rf/2); | 601 for (i = cvt->len_cvt / 4; i; --i) { |
589 rr = lf - ce; | 602 dst -= 12; |
590 lr = rf - ce; | 603 src -= 4; |
591 dst[0] = (lf&0xFF); | 604 lf = (Sint16) ((src[1] << 8) | src[0]); |
592 dst[1] = ((lf>>8)&0xFF); | 605 rf = (Sint16) ((src[3] << 8) | src[2]); |
593 dst[2] = (rf&0xFF); | 606 ce = (lf / 2) + (rf / 2); |
594 dst[3] = ((rf>>8)&0xFF); | 607 rr = lf - ce; |
595 | 608 lr = rf - ce; |
596 dst[0+4] = (lr&0xFF); | 609 dst[0] = (lf & 0xFF); |
597 dst[1+4] = ((lr>>8)&0xFF); | 610 dst[1] = ((lf >> 8) & 0xFF); |
598 dst[2+4] = (rr&0xFF); | 611 dst[2] = (rf & 0xFF); |
599 dst[3+4] = ((rr>>8)&0xFF); | 612 dst[3] = ((rf >> 8) & 0xFF); |
600 | 613 |
601 dst[0+8] = (ce&0xFF); | 614 dst[0 + 4] = (lr & 0xFF); |
602 dst[1+8] = ((ce>>8)&0xFF); | 615 dst[1 + 4] = ((lr >> 8) & 0xFF); |
603 dst[2+8] = (ce&0xFF); | 616 dst[2 + 4] = (rr & 0xFF); |
604 dst[3+8] = ((ce>>8)&0xFF); | 617 dst[3 + 4] = ((rr >> 8) & 0xFF); |
605 } | 618 |
606 } | 619 dst[0 + 8] = (ce & 0xFF); |
607 } | 620 dst[1 + 8] = ((ce >> 8) & 0xFF); |
608 break; | 621 dst[2 + 8] = (ce & 0xFF); |
609 } | 622 dst[3 + 8] = ((ce >> 8) & 0xFF); |
610 cvt->len_cvt *= 3; | 623 } |
611 if ( cvt->filters[++cvt->filter_index] ) { | 624 } |
612 cvt->filters[cvt->filter_index](cvt, format); | 625 } |
613 } | 626 break; |
627 } | |
628 cvt->len_cvt *= 3; | |
629 if (cvt->filters[++cvt->filter_index]) { | |
630 cvt->filters[cvt->filter_index] (cvt, format); | |
631 } | |
614 } | 632 } |
615 | 633 |
616 | 634 |
617 /* Duplicate a stereo channel to a pseudo-4.0 stream */ | 635 /* Duplicate a stereo channel to a pseudo-4.0 stream */ |
618 void SDLCALL SDL_ConvertSurround_4(SDL_AudioCVT *cvt, Uint16 format) | 636 void SDLCALL |
619 { | 637 SDL_ConvertSurround_4(SDL_AudioCVT * cvt, Uint16 format) |
620 int i; | 638 { |
621 | 639 int i; |
622 #ifdef DEBUG_CONVERT | 640 |
623 fprintf(stderr, "Converting stereo to quad\n"); | 641 #ifdef DEBUG_CONVERT |
624 #endif | 642 fprintf(stderr, "Converting stereo to quad\n"); |
625 switch (format&0x8018) { | 643 #endif |
626 | 644 switch (format & 0x8018) { |
627 case AUDIO_U8: { | 645 |
628 Uint8 *src, *dst, lf, rf, ce; | 646 case AUDIO_U8: |
629 | 647 { |
630 src = (Uint8 *)(cvt->buf+cvt->len_cvt); | 648 Uint8 *src, *dst, lf, rf, ce; |
631 dst = (Uint8 *)(cvt->buf+cvt->len_cvt*2); | 649 |
632 for ( i=cvt->len_cvt; i; --i ) { | 650 src = (Uint8 *) (cvt->buf + cvt->len_cvt); |
633 dst -= 4; | 651 dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 2); |
634 src -= 2; | 652 for (i = cvt->len_cvt; i; --i) { |
635 lf = src[0]; | 653 dst -= 4; |
636 rf = src[1]; | 654 src -= 2; |
637 ce = (lf/2) + (rf/2); | 655 lf = src[0]; |
638 dst[0] = lf; | 656 rf = src[1]; |
639 dst[1] = rf; | 657 ce = (lf / 2) + (rf / 2); |
640 dst[2] = lf - ce; | 658 dst[0] = lf; |
641 dst[3] = rf - ce; | 659 dst[1] = rf; |
642 } | 660 dst[2] = lf - ce; |
643 } | 661 dst[3] = rf - ce; |
644 break; | 662 } |
645 | 663 } |
646 case AUDIO_S8: { | 664 break; |
647 Sint8 *src, *dst, lf, rf, ce; | 665 |
648 | 666 case AUDIO_S8: |
649 src = (Sint8 *)cvt->buf+cvt->len_cvt; | 667 { |
650 dst = (Sint8 *)cvt->buf+cvt->len_cvt*2; | 668 Sint8 *src, *dst, lf, rf, ce; |
651 for ( i=cvt->len_cvt; i; --i ) { | 669 |
652 dst -= 4; | 670 src = (Sint8 *) cvt->buf + cvt->len_cvt; |
653 src -= 2; | 671 dst = (Sint8 *) cvt->buf + cvt->len_cvt * 2; |
654 lf = src[0]; | 672 for (i = cvt->len_cvt; i; --i) { |
655 rf = src[1]; | 673 dst -= 4; |
656 ce = (lf/2) + (rf/2); | 674 src -= 2; |
657 dst[0] = lf; | 675 lf = src[0]; |
658 dst[1] = rf; | 676 rf = src[1]; |
659 dst[2] = lf - ce; | 677 ce = (lf / 2) + (rf / 2); |
660 dst[3] = rf - ce; | 678 dst[0] = lf; |
661 } | 679 dst[1] = rf; |
662 } | 680 dst[2] = lf - ce; |
663 break; | 681 dst[3] = rf - ce; |
664 | 682 } |
665 case AUDIO_U16: { | 683 } |
666 Uint8 *src, *dst; | 684 break; |
667 Uint16 lf, rf, ce, lr, rr; | 685 |
668 | 686 case AUDIO_U16: |
669 src = cvt->buf+cvt->len_cvt; | 687 { |
670 dst = cvt->buf+cvt->len_cvt*2; | 688 Uint8 *src, *dst; |
671 | 689 Uint16 lf, rf, ce, lr, rr; |
672 if ( (format & 0x1000) == 0x1000 ) { | 690 |
673 for ( i=cvt->len_cvt/4; i; --i ) { | 691 src = cvt->buf + cvt->len_cvt; |
674 dst -= 8; | 692 dst = cvt->buf + cvt->len_cvt * 2; |
675 src -= 4; | 693 |
676 lf = (Uint16)((src[0]<<8)|src[1]); | 694 if ((format & 0x1000) == 0x1000) { |
677 rf = (Uint16)((src[2]<<8)|src[3]); | 695 for (i = cvt->len_cvt / 4; i; --i) { |
678 ce = (lf/2) + (rf/2); | 696 dst -= 8; |
679 rr = lf - ce; | 697 src -= 4; |
680 lr = rf - ce; | 698 lf = (Uint16) ((src[0] << 8) | src[1]); |
681 dst[1] = (lf&0xFF); | 699 rf = (Uint16) ((src[2] << 8) | src[3]); |
682 dst[0] = ((lf>>8)&0xFF); | 700 ce = (lf / 2) + (rf / 2); |
683 dst[3] = (rf&0xFF); | 701 rr = lf - ce; |
684 dst[2] = ((rf>>8)&0xFF); | 702 lr = rf - ce; |
685 | 703 dst[1] = (lf & 0xFF); |
686 dst[1+4] = (lr&0xFF); | 704 dst[0] = ((lf >> 8) & 0xFF); |
687 dst[0+4] = ((lr>>8)&0xFF); | 705 dst[3] = (rf & 0xFF); |
688 dst[3+4] = (rr&0xFF); | 706 dst[2] = ((rf >> 8) & 0xFF); |
689 dst[2+4] = ((rr>>8)&0xFF); | 707 |
690 } | 708 dst[1 + 4] = (lr & 0xFF); |
691 } else { | 709 dst[0 + 4] = ((lr >> 8) & 0xFF); |
692 for ( i=cvt->len_cvt/4; i; --i ) { | 710 dst[3 + 4] = (rr & 0xFF); |
693 dst -= 8; | 711 dst[2 + 4] = ((rr >> 8) & 0xFF); |
694 src -= 4; | 712 } |
695 lf = (Uint16)((src[1]<<8)|src[0]); | 713 } else { |
696 rf = (Uint16)((src[3]<<8)|src[2]); | 714 for (i = cvt->len_cvt / 4; i; --i) { |
697 ce = (lf/2) + (rf/2); | 715 dst -= 8; |
698 rr = lf - ce; | 716 src -= 4; |
699 lr = rf - ce; | 717 lf = (Uint16) ((src[1] << 8) | src[0]); |
700 dst[0] = (lf&0xFF); | 718 rf = (Uint16) ((src[3] << 8) | src[2]); |
701 dst[1] = ((lf>>8)&0xFF); | 719 ce = (lf / 2) + (rf / 2); |
702 dst[2] = (rf&0xFF); | 720 rr = lf - ce; |
703 dst[3] = ((rf>>8)&0xFF); | 721 lr = rf - ce; |
704 | 722 dst[0] = (lf & 0xFF); |
705 dst[0+4] = (lr&0xFF); | 723 dst[1] = ((lf >> 8) & 0xFF); |
706 dst[1+4] = ((lr>>8)&0xFF); | 724 dst[2] = (rf & 0xFF); |
707 dst[2+4] = (rr&0xFF); | 725 dst[3] = ((rf >> 8) & 0xFF); |
708 dst[3+4] = ((rr>>8)&0xFF); | 726 |
709 } | 727 dst[0 + 4] = (lr & 0xFF); |
710 } | 728 dst[1 + 4] = ((lr >> 8) & 0xFF); |
711 } | 729 dst[2 + 4] = (rr & 0xFF); |
712 break; | 730 dst[3 + 4] = ((rr >> 8) & 0xFF); |
713 | 731 } |
714 case AUDIO_S16: { | 732 } |
715 Uint8 *src, *dst; | 733 } |
716 Sint16 lf, rf, ce, lr, rr; | 734 break; |
717 | 735 |
718 src = cvt->buf+cvt->len_cvt; | 736 case AUDIO_S16: |
719 dst = cvt->buf+cvt->len_cvt*2; | 737 { |
720 | 738 Uint8 *src, *dst; |
721 if ( (format & 0x1000) == 0x1000 ) { | 739 Sint16 lf, rf, ce, lr, rr; |
722 for ( i=cvt->len_cvt/4; i; --i ) { | 740 |
723 dst -= 8; | 741 src = cvt->buf + cvt->len_cvt; |
724 src -= 4; | 742 dst = cvt->buf + cvt->len_cvt * 2; |
725 lf = (Sint16)((src[0]<<8)|src[1]); | 743 |
726 rf = (Sint16)((src[2]<<8)|src[3]); | 744 if ((format & 0x1000) == 0x1000) { |
727 ce = (lf/2) + (rf/2); | 745 for (i = cvt->len_cvt / 4; i; --i) { |
728 rr = lf - ce; | 746 dst -= 8; |
729 lr = rf - ce; | 747 src -= 4; |
730 dst[1] = (lf&0xFF); | 748 lf = (Sint16) ((src[0] << 8) | src[1]); |
731 dst[0] = ((lf>>8)&0xFF); | 749 rf = (Sint16) ((src[2] << 8) | src[3]); |
732 dst[3] = (rf&0xFF); | 750 ce = (lf / 2) + (rf / 2); |
733 dst[2] = ((rf>>8)&0xFF); | 751 rr = lf - ce; |
734 | 752 lr = rf - ce; |
735 dst[1+4] = (lr&0xFF); | 753 dst[1] = (lf & 0xFF); |
736 dst[0+4] = ((lr>>8)&0xFF); | 754 dst[0] = ((lf >> 8) & 0xFF); |
737 dst[3+4] = (rr&0xFF); | 755 dst[3] = (rf & 0xFF); |
738 dst[2+4] = ((rr>>8)&0xFF); | 756 dst[2] = ((rf >> 8) & 0xFF); |
739 } | 757 |
740 } else { | 758 dst[1 + 4] = (lr & 0xFF); |
741 for ( i=cvt->len_cvt/4; i; --i ) { | 759 dst[0 + 4] = ((lr >> 8) & 0xFF); |
742 dst -= 8; | 760 dst[3 + 4] = (rr & 0xFF); |
743 src -= 4; | 761 dst[2 + 4] = ((rr >> 8) & 0xFF); |
744 lf = (Sint16)((src[1]<<8)|src[0]); | 762 } |
745 rf = (Sint16)((src[3]<<8)|src[2]); | 763 } else { |
746 ce = (lf/2) + (rf/2); | 764 for (i = cvt->len_cvt / 4; i; --i) { |
747 rr = lf - ce; | 765 dst -= 8; |
748 lr = rf - ce; | 766 src -= 4; |
749 dst[0] = (lf&0xFF); | 767 lf = (Sint16) ((src[1] << 8) | src[0]); |
750 dst[1] = ((lf>>8)&0xFF); | 768 rf = (Sint16) ((src[3] << 8) | src[2]); |
751 dst[2] = (rf&0xFF); | 769 ce = (lf / 2) + (rf / 2); |
752 dst[3] = ((rf>>8)&0xFF); | 770 rr = lf - ce; |
753 | 771 lr = rf - ce; |
754 dst[0+4] = (lr&0xFF); | 772 dst[0] = (lf & 0xFF); |
755 dst[1+4] = ((lr>>8)&0xFF); | 773 dst[1] = ((lf >> 8) & 0xFF); |
756 dst[2+4] = (rr&0xFF); | 774 dst[2] = (rf & 0xFF); |
757 dst[3+4] = ((rr>>8)&0xFF); | 775 dst[3] = ((rf >> 8) & 0xFF); |
758 } | 776 |
759 } | 777 dst[0 + 4] = (lr & 0xFF); |
760 } | 778 dst[1 + 4] = ((lr >> 8) & 0xFF); |
761 break; | 779 dst[2 + 4] = (rr & 0xFF); |
762 } | 780 dst[3 + 4] = ((rr >> 8) & 0xFF); |
763 cvt->len_cvt *= 2; | 781 } |
764 if ( cvt->filters[++cvt->filter_index] ) { | 782 } |
765 cvt->filters[cvt->filter_index](cvt, format); | 783 } |
766 } | 784 break; |
785 } | |
786 cvt->len_cvt *= 2; | |
787 if (cvt->filters[++cvt->filter_index]) { | |
788 cvt->filters[cvt->filter_index] (cvt, format); | |
789 } | |
767 } | 790 } |
768 | 791 |
769 | 792 |
770 /* Convert 8-bit to 16-bit - LSB */ | 793 /* Convert 8-bit to 16-bit - LSB */ |
771 void SDLCALL SDL_Convert16LSB(SDL_AudioCVT *cvt, Uint16 format) | 794 void SDLCALL |
772 { | 795 SDL_Convert16LSB(SDL_AudioCVT * cvt, Uint16 format) |
773 int i; | 796 { |
774 Uint8 *src, *dst; | 797 int i; |
775 | 798 Uint8 *src, *dst; |
776 #ifdef DEBUG_CONVERT | 799 |
777 fprintf(stderr, "Converting to 16-bit LSB\n"); | 800 #ifdef DEBUG_CONVERT |
778 #endif | 801 fprintf(stderr, "Converting to 16-bit LSB\n"); |
779 src = cvt->buf+cvt->len_cvt; | 802 #endif |
780 dst = cvt->buf+cvt->len_cvt*2; | 803 src = cvt->buf + cvt->len_cvt; |
781 for ( i=cvt->len_cvt; i; --i ) { | 804 dst = cvt->buf + cvt->len_cvt * 2; |
782 src -= 1; | 805 for (i = cvt->len_cvt; i; --i) { |
783 dst -= 2; | 806 src -= 1; |
784 dst[1] = *src; | 807 dst -= 2; |
785 dst[0] = 0; | 808 dst[1] = *src; |
786 } | 809 dst[0] = 0; |
787 format = ((format & ~0x0008) | AUDIO_U16LSB); | 810 } |
788 cvt->len_cvt *= 2; | 811 format = ((format & ~0x0008) | AUDIO_U16LSB); |
789 if ( cvt->filters[++cvt->filter_index] ) { | 812 cvt->len_cvt *= 2; |
790 cvt->filters[cvt->filter_index](cvt, format); | 813 if (cvt->filters[++cvt->filter_index]) { |
791 } | 814 cvt->filters[cvt->filter_index] (cvt, format); |
792 } | 815 } |
816 } | |
817 | |
793 /* Convert 8-bit to 16-bit - MSB */ | 818 /* Convert 8-bit to 16-bit - MSB */ |
794 void SDLCALL SDL_Convert16MSB(SDL_AudioCVT *cvt, Uint16 format) | 819 void SDLCALL |
795 { | 820 SDL_Convert16MSB(SDL_AudioCVT * cvt, Uint16 format) |
796 int i; | 821 { |
797 Uint8 *src, *dst; | 822 int i; |
798 | 823 Uint8 *src, *dst; |
799 #ifdef DEBUG_CONVERT | 824 |
800 fprintf(stderr, "Converting to 16-bit MSB\n"); | 825 #ifdef DEBUG_CONVERT |
801 #endif | 826 fprintf(stderr, "Converting to 16-bit MSB\n"); |
802 src = cvt->buf+cvt->len_cvt; | 827 #endif |
803 dst = cvt->buf+cvt->len_cvt*2; | 828 src = cvt->buf + cvt->len_cvt; |
804 for ( i=cvt->len_cvt; i; --i ) { | 829 dst = cvt->buf + cvt->len_cvt * 2; |
805 src -= 1; | 830 for (i = cvt->len_cvt; i; --i) { |
806 dst -= 2; | 831 src -= 1; |
807 dst[0] = *src; | 832 dst -= 2; |
808 dst[1] = 0; | 833 dst[0] = *src; |
809 } | 834 dst[1] = 0; |
810 format = ((format & ~0x0008) | AUDIO_U16MSB); | 835 } |
811 cvt->len_cvt *= 2; | 836 format = ((format & ~0x0008) | AUDIO_U16MSB); |
812 if ( cvt->filters[++cvt->filter_index] ) { | 837 cvt->len_cvt *= 2; |
813 cvt->filters[cvt->filter_index](cvt, format); | 838 if (cvt->filters[++cvt->filter_index]) { |
814 } | 839 cvt->filters[cvt->filter_index] (cvt, format); |
840 } | |
815 } | 841 } |
816 | 842 |
817 /* Convert 16-bit to 8-bit */ | 843 /* Convert 16-bit to 8-bit */ |
818 void SDLCALL SDL_Convert8(SDL_AudioCVT *cvt, Uint16 format) | 844 void SDLCALL |
819 { | 845 SDL_Convert8(SDL_AudioCVT * cvt, Uint16 format) |
820 int i; | 846 { |
821 Uint8 *src, *dst; | 847 int i; |
822 | 848 Uint8 *src, *dst; |
823 #ifdef DEBUG_CONVERT | 849 |
824 fprintf(stderr, "Converting to 8-bit\n"); | 850 #ifdef DEBUG_CONVERT |
825 #endif | 851 fprintf(stderr, "Converting to 8-bit\n"); |
826 src = cvt->buf; | 852 #endif |
827 dst = cvt->buf; | 853 src = cvt->buf; |
828 if ( (format & 0x1000) != 0x1000 ) { /* Little endian */ | 854 dst = cvt->buf; |
829 ++src; | 855 if ((format & 0x1000) != 0x1000) { /* Little endian */ |
830 } | 856 ++src; |
831 for ( i=cvt->len_cvt/2; i; --i ) { | 857 } |
832 *dst = *src; | 858 for (i = cvt->len_cvt / 2; i; --i) { |
833 src += 2; | 859 *dst = *src; |
834 dst += 1; | 860 src += 2; |
835 } | 861 dst += 1; |
836 format = ((format & ~0x9010) | AUDIO_U8); | 862 } |
837 cvt->len_cvt /= 2; | 863 format = ((format & ~0x9010) | AUDIO_U8); |
838 if ( cvt->filters[++cvt->filter_index] ) { | 864 cvt->len_cvt /= 2; |
839 cvt->filters[cvt->filter_index](cvt, format); | 865 if (cvt->filters[++cvt->filter_index]) { |
840 } | 866 cvt->filters[cvt->filter_index] (cvt, format); |
867 } | |
841 } | 868 } |
842 | 869 |
843 /* Toggle signed/unsigned */ | 870 /* Toggle signed/unsigned */ |
844 void SDLCALL SDL_ConvertSign(SDL_AudioCVT *cvt, Uint16 format) | 871 void SDLCALL |
845 { | 872 SDL_ConvertSign(SDL_AudioCVT * cvt, Uint16 format) |
846 int i; | 873 { |
847 Uint8 *data; | 874 int i; |
848 | 875 Uint8 *data; |
849 #ifdef DEBUG_CONVERT | 876 |
850 fprintf(stderr, "Converting audio signedness\n"); | 877 #ifdef DEBUG_CONVERT |
851 #endif | 878 fprintf(stderr, "Converting audio signedness\n"); |
852 data = cvt->buf; | 879 #endif |
853 if ( (format & 0xFF) == 16 ) { | 880 data = cvt->buf; |
854 if ( (format & 0x1000) != 0x1000 ) { /* Little endian */ | 881 if ((format & 0xFF) == 16) { |
855 ++data; | 882 if ((format & 0x1000) != 0x1000) { /* Little endian */ |
856 } | 883 ++data; |
857 for ( i=cvt->len_cvt/2; i; --i ) { | 884 } |
858 *data ^= 0x80; | 885 for (i = cvt->len_cvt / 2; i; --i) { |
859 data += 2; | 886 *data ^= 0x80; |
860 } | 887 data += 2; |
861 } else { | 888 } |
862 for ( i=cvt->len_cvt; i; --i ) { | 889 } else { |
863 *data++ ^= 0x80; | 890 for (i = cvt->len_cvt; i; --i) { |
864 } | 891 *data++ ^= 0x80; |
865 } | 892 } |
866 format = (format ^ 0x8000); | 893 } |
867 if ( cvt->filters[++cvt->filter_index] ) { | 894 format = (format ^ 0x8000); |
868 cvt->filters[cvt->filter_index](cvt, format); | 895 if (cvt->filters[++cvt->filter_index]) { |
869 } | 896 cvt->filters[cvt->filter_index] (cvt, format); |
897 } | |
870 } | 898 } |
871 | 899 |
872 /* Toggle endianness */ | 900 /* Toggle endianness */ |
873 void SDLCALL SDL_ConvertEndian(SDL_AudioCVT *cvt, Uint16 format) | 901 void SDLCALL |
874 { | 902 SDL_ConvertEndian(SDL_AudioCVT * cvt, Uint16 format) |
875 int i; | 903 { |
876 Uint8 *data, tmp; | 904 int i; |
877 | 905 Uint8 *data, tmp; |
878 #ifdef DEBUG_CONVERT | 906 |
879 fprintf(stderr, "Converting audio endianness\n"); | 907 #ifdef DEBUG_CONVERT |
880 #endif | 908 fprintf(stderr, "Converting audio endianness\n"); |
881 data = cvt->buf; | 909 #endif |
882 for ( i=cvt->len_cvt/2; i; --i ) { | 910 data = cvt->buf; |
883 tmp = data[0]; | 911 for (i = cvt->len_cvt / 2; i; --i) { |
884 data[0] = data[1]; | 912 tmp = data[0]; |
885 data[1] = tmp; | 913 data[0] = data[1]; |
886 data += 2; | 914 data[1] = tmp; |
887 } | 915 data += 2; |
888 format = (format ^ 0x1000); | 916 } |
889 if ( cvt->filters[++cvt->filter_index] ) { | 917 format = (format ^ 0x1000); |
890 cvt->filters[cvt->filter_index](cvt, format); | 918 if (cvt->filters[++cvt->filter_index]) { |
891 } | 919 cvt->filters[cvt->filter_index] (cvt, format); |
920 } | |
892 } | 921 } |
893 | 922 |
894 /* Convert rate up by multiple of 2 */ | 923 /* Convert rate up by multiple of 2 */ |
895 void SDLCALL SDL_RateMUL2(SDL_AudioCVT *cvt, Uint16 format) | 924 void SDLCALL |
896 { | 925 SDL_RateMUL2(SDL_AudioCVT * cvt, Uint16 format) |
897 int i; | 926 { |
898 Uint8 *src, *dst; | 927 int i; |
899 | 928 Uint8 *src, *dst; |
900 #ifdef DEBUG_CONVERT | 929 |
901 fprintf(stderr, "Converting audio rate * 2\n"); | 930 #ifdef DEBUG_CONVERT |
902 #endif | 931 fprintf(stderr, "Converting audio rate * 2\n"); |
903 src = cvt->buf+cvt->len_cvt; | 932 #endif |
904 dst = cvt->buf+cvt->len_cvt*2; | 933 src = cvt->buf + cvt->len_cvt; |
905 switch (format & 0xFF) { | 934 dst = cvt->buf + cvt->len_cvt * 2; |
906 case 8: | 935 switch (format & 0xFF) { |
907 for ( i=cvt->len_cvt; i; --i ) { | 936 case 8: |
908 src -= 1; | 937 for (i = cvt->len_cvt; i; --i) { |
909 dst -= 2; | 938 src -= 1; |
910 dst[0] = src[0]; | 939 dst -= 2; |
911 dst[1] = src[0]; | 940 dst[0] = src[0]; |
912 } | 941 dst[1] = src[0]; |
913 break; | 942 } |
914 case 16: | 943 break; |
915 for ( i=cvt->len_cvt/2; i; --i ) { | 944 case 16: |
916 src -= 2; | 945 for (i = cvt->len_cvt / 2; i; --i) { |
917 dst -= 4; | 946 src -= 2; |
918 dst[0] = src[0]; | 947 dst -= 4; |
919 dst[1] = src[1]; | 948 dst[0] = src[0]; |
920 dst[2] = src[0]; | 949 dst[1] = src[1]; |
921 dst[3] = src[1]; | 950 dst[2] = src[0]; |
922 } | 951 dst[3] = src[1]; |
923 break; | 952 } |
924 } | 953 break; |
925 cvt->len_cvt *= 2; | 954 } |
926 if ( cvt->filters[++cvt->filter_index] ) { | 955 cvt->len_cvt *= 2; |
927 cvt->filters[cvt->filter_index](cvt, format); | 956 if (cvt->filters[++cvt->filter_index]) { |
928 } | 957 cvt->filters[cvt->filter_index] (cvt, format); |
958 } | |
929 } | 959 } |
930 | 960 |
931 | 961 |
932 /* Convert rate up by multiple of 2, for stereo */ | 962 /* Convert rate up by multiple of 2, for stereo */ |
933 void SDLCALL SDL_RateMUL2_c2(SDL_AudioCVT *cvt, Uint16 format) | 963 void SDLCALL |
934 { | 964 SDL_RateMUL2_c2(SDL_AudioCVT * cvt, Uint16 format) |
935 int i; | 965 { |
936 Uint8 *src, *dst; | 966 int i; |
937 | 967 Uint8 *src, *dst; |
938 #ifdef DEBUG_CONVERT | 968 |
939 fprintf(stderr, "Converting audio rate * 2\n"); | 969 #ifdef DEBUG_CONVERT |
940 #endif | 970 fprintf(stderr, "Converting audio rate * 2\n"); |
941 src = cvt->buf+cvt->len_cvt; | 971 #endif |
942 dst = cvt->buf+cvt->len_cvt*2; | 972 src = cvt->buf + cvt->len_cvt; |
943 switch (format & 0xFF) { | 973 dst = cvt->buf + cvt->len_cvt * 2; |
944 case 8: | 974 switch (format & 0xFF) { |
945 for ( i=cvt->len_cvt/2; i; --i ) { | 975 case 8: |
946 src -= 2; | 976 for (i = cvt->len_cvt / 2; i; --i) { |
947 dst -= 4; | 977 src -= 2; |
948 dst[0] = src[0]; | 978 dst -= 4; |
949 dst[1] = src[1]; | 979 dst[0] = src[0]; |
950 dst[2] = src[0]; | 980 dst[1] = src[1]; |
951 dst[3] = src[1]; | 981 dst[2] = src[0]; |
952 } | 982 dst[3] = src[1]; |
953 break; | 983 } |
954 case 16: | 984 break; |
955 for ( i=cvt->len_cvt/4; i; --i ) { | 985 case 16: |
956 src -= 4; | 986 for (i = cvt->len_cvt / 4; i; --i) { |
957 dst -= 8; | 987 src -= 4; |
958 dst[0] = src[0]; | 988 dst -= 8; |
959 dst[1] = src[1]; | 989 dst[0] = src[0]; |
960 dst[2] = src[2]; | 990 dst[1] = src[1]; |
961 dst[3] = src[3]; | 991 dst[2] = src[2]; |
962 dst[4] = src[0]; | 992 dst[3] = src[3]; |
963 dst[5] = src[1]; | 993 dst[4] = src[0]; |
964 dst[6] = src[2]; | 994 dst[5] = src[1]; |
965 dst[7] = src[3]; | 995 dst[6] = src[2]; |
966 } | 996 dst[7] = src[3]; |
967 break; | 997 } |
968 } | 998 break; |
969 cvt->len_cvt *= 2; | 999 } |
970 if ( cvt->filters[++cvt->filter_index] ) { | 1000 cvt->len_cvt *= 2; |
971 cvt->filters[cvt->filter_index](cvt, format); | 1001 if (cvt->filters[++cvt->filter_index]) { |
972 } | 1002 cvt->filters[cvt->filter_index] (cvt, format); |
1003 } | |
973 } | 1004 } |
974 | 1005 |
975 /* Convert rate up by multiple of 2, for quad */ | 1006 /* Convert rate up by multiple of 2, for quad */ |
976 void SDLCALL SDL_RateMUL2_c4(SDL_AudioCVT *cvt, Uint16 format) | 1007 void SDLCALL |
977 { | 1008 SDL_RateMUL2_c4(SDL_AudioCVT * cvt, Uint16 format) |
978 int i; | 1009 { |
979 Uint8 *src, *dst; | 1010 int i; |
980 | 1011 Uint8 *src, *dst; |
981 #ifdef DEBUG_CONVERT | 1012 |
982 fprintf(stderr, "Converting audio rate * 2\n"); | 1013 #ifdef DEBUG_CONVERT |
983 #endif | 1014 fprintf(stderr, "Converting audio rate * 2\n"); |
984 src = cvt->buf+cvt->len_cvt; | 1015 #endif |
985 dst = cvt->buf+cvt->len_cvt*2; | 1016 src = cvt->buf + cvt->len_cvt; |
986 switch (format & 0xFF) { | 1017 dst = cvt->buf + cvt->len_cvt * 2; |
987 case 8: | 1018 switch (format & 0xFF) { |
988 for ( i=cvt->len_cvt/4; i; --i ) { | 1019 case 8: |
989 src -= 4; | 1020 for (i = cvt->len_cvt / 4; i; --i) { |
990 dst -= 8; | 1021 src -= 4; |
991 dst[0] = src[0]; | 1022 dst -= 8; |
992 dst[1] = src[1]; | 1023 dst[0] = src[0]; |
993 dst[2] = src[2]; | 1024 dst[1] = src[1]; |
994 dst[3] = src[3]; | 1025 dst[2] = src[2]; |
995 dst[4] = src[0]; | 1026 dst[3] = src[3]; |
996 dst[5] = src[1]; | 1027 dst[4] = src[0]; |
997 dst[6] = src[2]; | 1028 dst[5] = src[1]; |
998 dst[7] = src[3]; | 1029 dst[6] = src[2]; |
999 } | 1030 dst[7] = src[3]; |
1000 break; | 1031 } |
1001 case 16: | 1032 break; |
1002 for ( i=cvt->len_cvt/8; i; --i ) { | 1033 case 16: |
1003 src -= 8; | 1034 for (i = cvt->len_cvt / 8; i; --i) { |
1004 dst -= 16; | 1035 src -= 8; |
1005 dst[0] = src[0]; | 1036 dst -= 16; |
1006 dst[1] = src[1]; | 1037 dst[0] = src[0]; |
1007 dst[2] = src[2]; | 1038 dst[1] = src[1]; |
1008 dst[3] = src[3]; | 1039 dst[2] = src[2]; |
1009 dst[4] = src[4]; | 1040 dst[3] = src[3]; |
1010 dst[5] = src[5]; | 1041 dst[4] = src[4]; |
1011 dst[6] = src[6]; | 1042 dst[5] = src[5]; |
1012 dst[7] = src[7]; | 1043 dst[6] = src[6]; |
1013 dst[8] = src[0]; | 1044 dst[7] = src[7]; |
1014 dst[9] = src[1]; | 1045 dst[8] = src[0]; |
1015 dst[10] = src[2]; | 1046 dst[9] = src[1]; |
1016 dst[11] = src[3]; | 1047 dst[10] = src[2]; |
1017 dst[12] = src[4]; | 1048 dst[11] = src[3]; |
1018 dst[13] = src[5]; | 1049 dst[12] = src[4]; |
1019 dst[14] = src[6]; | 1050 dst[13] = src[5]; |
1020 dst[15] = src[7]; | 1051 dst[14] = src[6]; |
1021 } | 1052 dst[15] = src[7]; |
1022 break; | 1053 } |
1023 } | 1054 break; |
1024 cvt->len_cvt *= 2; | 1055 } |
1025 if ( cvt->filters[++cvt->filter_index] ) { | 1056 cvt->len_cvt *= 2; |
1026 cvt->filters[cvt->filter_index](cvt, format); | 1057 if (cvt->filters[++cvt->filter_index]) { |
1027 } | 1058 cvt->filters[cvt->filter_index] (cvt, format); |
1059 } | |
1028 } | 1060 } |
1029 | 1061 |
1030 | 1062 |
1031 /* Convert rate up by multiple of 2, for 5.1 */ | 1063 /* Convert rate up by multiple of 2, for 5.1 */ |
1032 void SDLCALL SDL_RateMUL2_c6(SDL_AudioCVT *cvt, Uint16 format) | 1064 void SDLCALL |
1033 { | 1065 SDL_RateMUL2_c6(SDL_AudioCVT * cvt, Uint16 format) |
1034 int i; | 1066 { |
1035 Uint8 *src, *dst; | 1067 int i; |
1036 | 1068 Uint8 *src, *dst; |
1037 #ifdef DEBUG_CONVERT | 1069 |
1038 fprintf(stderr, "Converting audio rate * 2\n"); | 1070 #ifdef DEBUG_CONVERT |
1039 #endif | 1071 fprintf(stderr, "Converting audio rate * 2\n"); |
1040 src = cvt->buf+cvt->len_cvt; | 1072 #endif |
1041 dst = cvt->buf+cvt->len_cvt*2; | 1073 src = cvt->buf + cvt->len_cvt; |
1042 switch (format & 0xFF) { | 1074 dst = cvt->buf + cvt->len_cvt * 2; |
1043 case 8: | 1075 switch (format & 0xFF) { |
1044 for ( i=cvt->len_cvt/6; i; --i ) { | 1076 case 8: |
1045 src -= 6; | 1077 for (i = cvt->len_cvt / 6; i; --i) { |
1046 dst -= 12; | 1078 src -= 6; |
1047 dst[0] = src[0]; | 1079 dst -= 12; |
1048 dst[1] = src[1]; | 1080 dst[0] = src[0]; |
1049 dst[2] = src[2]; | 1081 dst[1] = src[1]; |
1050 dst[3] = src[3]; | 1082 dst[2] = src[2]; |
1051 dst[4] = src[4]; | 1083 dst[3] = src[3]; |
1052 dst[5] = src[5]; | 1084 dst[4] = src[4]; |
1053 dst[6] = src[0]; | 1085 dst[5] = src[5]; |
1054 dst[7] = src[1]; | 1086 dst[6] = src[0]; |
1055 dst[8] = src[2]; | 1087 dst[7] = src[1]; |
1056 dst[9] = src[3]; | 1088 dst[8] = src[2]; |
1057 dst[10] = src[4]; | 1089 dst[9] = src[3]; |
1058 dst[11] = src[5]; | 1090 dst[10] = src[4]; |
1059 } | 1091 dst[11] = src[5]; |
1060 break; | 1092 } |
1061 case 16: | 1093 break; |
1062 for ( i=cvt->len_cvt/12; i; --i ) { | 1094 case 16: |
1063 src -= 12; | 1095 for (i = cvt->len_cvt / 12; i; --i) { |
1064 dst -= 24; | 1096 src -= 12; |
1065 dst[0] = src[0]; | 1097 dst -= 24; |
1066 dst[1] = src[1]; | 1098 dst[0] = src[0]; |
1067 dst[2] = src[2]; | 1099 dst[1] = src[1]; |
1068 dst[3] = src[3]; | 1100 dst[2] = src[2]; |
1069 dst[4] = src[4]; | 1101 dst[3] = src[3]; |
1070 dst[5] = src[5]; | 1102 dst[4] = src[4]; |
1071 dst[6] = src[6]; | 1103 dst[5] = src[5]; |
1072 dst[7] = src[7]; | 1104 dst[6] = src[6]; |
1073 dst[8] = src[8]; | 1105 dst[7] = src[7]; |
1074 dst[9] = src[9]; | 1106 dst[8] = src[8]; |
1075 dst[10] = src[10]; | 1107 dst[9] = src[9]; |
1076 dst[11] = src[11]; | 1108 dst[10] = src[10]; |
1077 dst[12] = src[0]; | 1109 dst[11] = src[11]; |
1078 dst[13] = src[1]; | 1110 dst[12] = src[0]; |
1079 dst[14] = src[2]; | 1111 dst[13] = src[1]; |
1080 dst[15] = src[3]; | 1112 dst[14] = src[2]; |
1081 dst[16] = src[4]; | 1113 dst[15] = src[3]; |
1082 dst[17] = src[5]; | 1114 dst[16] = src[4]; |
1083 dst[18] = src[6]; | 1115 dst[17] = src[5]; |
1084 dst[19] = src[7]; | 1116 dst[18] = src[6]; |
1085 dst[20] = src[8]; | 1117 dst[19] = src[7]; |
1086 dst[21] = src[9]; | 1118 dst[20] = src[8]; |
1087 dst[22] = src[10]; | 1119 dst[21] = src[9]; |
1088 dst[23] = src[11]; | 1120 dst[22] = src[10]; |
1089 } | 1121 dst[23] = src[11]; |
1090 break; | 1122 } |
1091 } | 1123 break; |
1092 cvt->len_cvt *= 2; | 1124 } |
1093 if ( cvt->filters[++cvt->filter_index] ) { | 1125 cvt->len_cvt *= 2; |
1094 cvt->filters[cvt->filter_index](cvt, format); | 1126 if (cvt->filters[++cvt->filter_index]) { |
1095 } | 1127 cvt->filters[cvt->filter_index] (cvt, format); |
1128 } | |
1096 } | 1129 } |
1097 | 1130 |
1098 /* Convert rate down by multiple of 2 */ | 1131 /* Convert rate down by multiple of 2 */ |
1099 void SDLCALL SDL_RateDIV2(SDL_AudioCVT *cvt, Uint16 format) | 1132 void SDLCALL |
1100 { | 1133 SDL_RateDIV2(SDL_AudioCVT * cvt, Uint16 format) |
1101 int i; | 1134 { |
1102 Uint8 *src, *dst; | 1135 int i; |
1103 | 1136 Uint8 *src, *dst; |
1104 #ifdef DEBUG_CONVERT | 1137 |
1105 fprintf(stderr, "Converting audio rate / 2\n"); | 1138 #ifdef DEBUG_CONVERT |
1106 #endif | 1139 fprintf(stderr, "Converting audio rate / 2\n"); |
1107 src = cvt->buf; | 1140 #endif |
1108 dst = cvt->buf; | 1141 src = cvt->buf; |
1109 switch (format & 0xFF) { | 1142 dst = cvt->buf; |
1110 case 8: | 1143 switch (format & 0xFF) { |
1111 for ( i=cvt->len_cvt/2; i; --i ) { | 1144 case 8: |
1112 dst[0] = src[0]; | 1145 for (i = cvt->len_cvt / 2; i; --i) { |
1113 src += 2; | 1146 dst[0] = src[0]; |
1114 dst += 1; | 1147 src += 2; |
1115 } | 1148 dst += 1; |
1116 break; | 1149 } |
1117 case 16: | 1150 break; |
1118 for ( i=cvt->len_cvt/4; i; --i ) { | 1151 case 16: |
1119 dst[0] = src[0]; | 1152 for (i = cvt->len_cvt / 4; i; --i) { |
1120 dst[1] = src[1]; | 1153 dst[0] = src[0]; |
1121 src += 4; | 1154 dst[1] = src[1]; |
1122 dst += 2; | 1155 src += 4; |
1123 } | 1156 dst += 2; |
1124 break; | 1157 } |
1125 } | 1158 break; |
1126 cvt->len_cvt /= 2; | 1159 } |
1127 if ( cvt->filters[++cvt->filter_index] ) { | 1160 cvt->len_cvt /= 2; |
1128 cvt->filters[cvt->filter_index](cvt, format); | 1161 if (cvt->filters[++cvt->filter_index]) { |
1129 } | 1162 cvt->filters[cvt->filter_index] (cvt, format); |
1163 } | |
1130 } | 1164 } |
1131 | 1165 |
1132 | 1166 |
1133 /* Convert rate down by multiple of 2, for stereo */ | 1167 /* Convert rate down by multiple of 2, for stereo */ |
1134 void SDLCALL SDL_RateDIV2_c2(SDL_AudioCVT *cvt, Uint16 format) | 1168 void SDLCALL |
1135 { | 1169 SDL_RateDIV2_c2(SDL_AudioCVT * cvt, Uint16 format) |
1136 int i; | 1170 { |
1137 Uint8 *src, *dst; | 1171 int i; |
1138 | 1172 Uint8 *src, *dst; |
1139 #ifdef DEBUG_CONVERT | 1173 |
1140 fprintf(stderr, "Converting audio rate / 2\n"); | 1174 #ifdef DEBUG_CONVERT |
1141 #endif | 1175 fprintf(stderr, "Converting audio rate / 2\n"); |
1142 src = cvt->buf; | 1176 #endif |
1143 dst = cvt->buf; | 1177 src = cvt->buf; |
1144 switch (format & 0xFF) { | 1178 dst = cvt->buf; |
1145 case 8: | 1179 switch (format & 0xFF) { |
1146 for ( i=cvt->len_cvt/4; i; --i ) { | 1180 case 8: |
1147 dst[0] = src[0]; | 1181 for (i = cvt->len_cvt / 4; i; --i) { |
1148 dst[1] = src[1]; | 1182 dst[0] = src[0]; |
1149 src += 4; | 1183 dst[1] = src[1]; |
1150 dst += 2; | 1184 src += 4; |
1151 } | 1185 dst += 2; |
1152 break; | 1186 } |
1153 case 16: | 1187 break; |
1154 for ( i=cvt->len_cvt/8; i; --i ) { | 1188 case 16: |
1155 dst[0] = src[0]; | 1189 for (i = cvt->len_cvt / 8; i; --i) { |
1156 dst[1] = src[1]; | 1190 dst[0] = src[0]; |
1157 dst[2] = src[2]; | 1191 dst[1] = src[1]; |
1158 dst[3] = src[3]; | 1192 dst[2] = src[2]; |
1159 src += 8; | 1193 dst[3] = src[3]; |
1160 dst += 4; | 1194 src += 8; |
1161 } | 1195 dst += 4; |
1162 break; | 1196 } |
1163 } | 1197 break; |
1164 cvt->len_cvt /= 2; | 1198 } |
1165 if ( cvt->filters[++cvt->filter_index] ) { | 1199 cvt->len_cvt /= 2; |
1166 cvt->filters[cvt->filter_index](cvt, format); | 1200 if (cvt->filters[++cvt->filter_index]) { |
1167 } | 1201 cvt->filters[cvt->filter_index] (cvt, format); |
1202 } | |
1168 } | 1203 } |
1169 | 1204 |
1170 | 1205 |
1171 /* Convert rate down by multiple of 2, for quad */ | 1206 /* Convert rate down by multiple of 2, for quad */ |
1172 void SDLCALL SDL_RateDIV2_c4(SDL_AudioCVT *cvt, Uint16 format) | 1207 void SDLCALL |
1173 { | 1208 SDL_RateDIV2_c4(SDL_AudioCVT * cvt, Uint16 format) |
1174 int i; | 1209 { |
1175 Uint8 *src, *dst; | 1210 int i; |
1176 | 1211 Uint8 *src, *dst; |
1177 #ifdef DEBUG_CONVERT | 1212 |
1178 fprintf(stderr, "Converting audio rate / 2\n"); | 1213 #ifdef DEBUG_CONVERT |
1179 #endif | 1214 fprintf(stderr, "Converting audio rate / 2\n"); |
1180 src = cvt->buf; | 1215 #endif |
1181 dst = cvt->buf; | 1216 src = cvt->buf; |
1182 switch (format & 0xFF) { | 1217 dst = cvt->buf; |
1183 case 8: | 1218 switch (format & 0xFF) { |
1184 for ( i=cvt->len_cvt/8; i; --i ) { | 1219 case 8: |
1185 dst[0] = src[0]; | 1220 for (i = cvt->len_cvt / 8; i; --i) { |
1186 dst[1] = src[1]; | 1221 dst[0] = src[0]; |
1187 dst[2] = src[2]; | 1222 dst[1] = src[1]; |
1188 dst[3] = src[3]; | 1223 dst[2] = src[2]; |
1189 src += 8; | 1224 dst[3] = src[3]; |
1190 dst += 4; | 1225 src += 8; |
1191 } | 1226 dst += 4; |
1192 break; | 1227 } |
1193 case 16: | 1228 break; |
1194 for ( i=cvt->len_cvt/16; i; --i ) { | 1229 case 16: |
1195 dst[0] = src[0]; | 1230 for (i = cvt->len_cvt / 16; i; --i) { |
1196 dst[1] = src[1]; | 1231 dst[0] = src[0]; |
1197 dst[2] = src[2]; | 1232 dst[1] = src[1]; |
1198 dst[3] = src[3]; | 1233 dst[2] = src[2]; |
1199 dst[4] = src[4]; | 1234 dst[3] = src[3]; |
1200 dst[5] = src[5]; | 1235 dst[4] = src[4]; |
1201 dst[6] = src[6]; | 1236 dst[5] = src[5]; |
1202 dst[7] = src[7]; | 1237 dst[6] = src[6]; |
1203 src += 16; | 1238 dst[7] = src[7]; |
1204 dst += 8; | 1239 src += 16; |
1205 } | 1240 dst += 8; |
1206 break; | 1241 } |
1207 } | 1242 break; |
1208 cvt->len_cvt /= 2; | 1243 } |
1209 if ( cvt->filters[++cvt->filter_index] ) { | 1244 cvt->len_cvt /= 2; |
1210 cvt->filters[cvt->filter_index](cvt, format); | 1245 if (cvt->filters[++cvt->filter_index]) { |
1211 } | 1246 cvt->filters[cvt->filter_index] (cvt, format); |
1247 } | |
1212 } | 1248 } |
1213 | 1249 |
1214 /* Convert rate down by multiple of 2, for 5.1 */ | 1250 /* Convert rate down by multiple of 2, for 5.1 */ |
1215 void SDLCALL SDL_RateDIV2_c6(SDL_AudioCVT *cvt, Uint16 format) | 1251 void SDLCALL |
1216 { | 1252 SDL_RateDIV2_c6(SDL_AudioCVT * cvt, Uint16 format) |
1217 int i; | 1253 { |
1218 Uint8 *src, *dst; | 1254 int i; |
1219 | 1255 Uint8 *src, *dst; |
1220 #ifdef DEBUG_CONVERT | 1256 |
1221 fprintf(stderr, "Converting audio rate / 2\n"); | 1257 #ifdef DEBUG_CONVERT |
1222 #endif | 1258 fprintf(stderr, "Converting audio rate / 2\n"); |
1223 src = cvt->buf; | 1259 #endif |
1224 dst = cvt->buf; | 1260 src = cvt->buf; |
1225 switch (format & 0xFF) { | 1261 dst = cvt->buf; |
1226 case 8: | 1262 switch (format & 0xFF) { |
1227 for ( i=cvt->len_cvt/12; i; --i ) { | 1263 case 8: |
1228 dst[0] = src[0]; | 1264 for (i = cvt->len_cvt / 12; i; --i) { |
1229 dst[1] = src[1]; | 1265 dst[0] = src[0]; |
1230 dst[2] = src[2]; | 1266 dst[1] = src[1]; |
1231 dst[3] = src[3]; | 1267 dst[2] = src[2]; |
1232 dst[4] = src[4]; | 1268 dst[3] = src[3]; |
1233 dst[5] = src[5]; | 1269 dst[4] = src[4]; |
1234 src += 12; | 1270 dst[5] = src[5]; |
1235 dst += 6; | 1271 src += 12; |
1236 } | 1272 dst += 6; |
1237 break; | 1273 } |
1238 case 16: | 1274 break; |
1239 for ( i=cvt->len_cvt/24; i; --i ) { | 1275 case 16: |
1240 dst[0] = src[0]; | 1276 for (i = cvt->len_cvt / 24; i; --i) { |
1241 dst[1] = src[1]; | 1277 dst[0] = src[0]; |
1242 dst[2] = src[2]; | 1278 dst[1] = src[1]; |
1243 dst[3] = src[3]; | 1279 dst[2] = src[2]; |
1244 dst[4] = src[4]; | 1280 dst[3] = src[3]; |
1245 dst[5] = src[5]; | 1281 dst[4] = src[4]; |
1246 dst[6] = src[6]; | 1282 dst[5] = src[5]; |
1247 dst[7] = src[7]; | 1283 dst[6] = src[6]; |
1248 dst[8] = src[8]; | 1284 dst[7] = src[7]; |
1249 dst[9] = src[9]; | 1285 dst[8] = src[8]; |
1250 dst[10] = src[10]; | 1286 dst[9] = src[9]; |
1251 dst[11] = src[11]; | 1287 dst[10] = src[10]; |
1252 src += 24; | 1288 dst[11] = src[11]; |
1253 dst += 12; | 1289 src += 24; |
1254 } | 1290 dst += 12; |
1255 break; | 1291 } |
1256 } | 1292 break; |
1257 cvt->len_cvt /= 2; | 1293 } |
1258 if ( cvt->filters[++cvt->filter_index] ) { | 1294 cvt->len_cvt /= 2; |
1259 cvt->filters[cvt->filter_index](cvt, format); | 1295 if (cvt->filters[++cvt->filter_index]) { |
1260 } | 1296 cvt->filters[cvt->filter_index] (cvt, format); |
1297 } | |
1261 } | 1298 } |
1262 | 1299 |
1263 /* Very slow rate conversion routine */ | 1300 /* Very slow rate conversion routine */ |
1264 void SDLCALL SDL_RateSLOW(SDL_AudioCVT *cvt, Uint16 format) | 1301 void SDLCALL |
1265 { | 1302 SDL_RateSLOW(SDL_AudioCVT * cvt, Uint16 format) |
1266 double ipos; | 1303 { |
1267 int i, clen; | 1304 double ipos; |
1268 | 1305 int i, clen; |
1269 #ifdef DEBUG_CONVERT | 1306 |
1270 fprintf(stderr, "Converting audio rate * %4.4f\n", 1.0/cvt->rate_incr); | 1307 #ifdef DEBUG_CONVERT |
1271 #endif | 1308 fprintf(stderr, "Converting audio rate * %4.4f\n", 1.0 / cvt->rate_incr); |
1272 clen = (int)((double)cvt->len_cvt / cvt->rate_incr); | 1309 #endif |
1273 if ( cvt->rate_incr > 1.0 ) { | 1310 clen = (int) ((double) cvt->len_cvt / cvt->rate_incr); |
1274 switch (format & 0xFF) { | 1311 if (cvt->rate_incr > 1.0) { |
1275 case 8: { | 1312 switch (format & 0xFF) { |
1276 Uint8 *output; | 1313 case 8: |
1277 | 1314 { |
1278 output = cvt->buf; | 1315 Uint8 *output; |
1279 ipos = 0.0; | 1316 |
1280 for ( i=clen; i; --i ) { | 1317 output = cvt->buf; |
1281 *output = cvt->buf[(int)ipos]; | 1318 ipos = 0.0; |
1282 ipos += cvt->rate_incr; | 1319 for (i = clen; i; --i) { |
1283 output += 1; | 1320 *output = cvt->buf[(int) ipos]; |
1284 } | 1321 ipos += cvt->rate_incr; |
1285 } | 1322 output += 1; |
1286 break; | 1323 } |
1287 | 1324 } |
1288 case 16: { | 1325 break; |
1289 Uint16 *output; | 1326 |
1290 | 1327 case 16: |
1291 clen &= ~1; | 1328 { |
1292 output = (Uint16 *)cvt->buf; | 1329 Uint16 *output; |
1293 ipos = 0.0; | 1330 |
1294 for ( i=clen/2; i; --i ) { | 1331 clen &= ~1; |
1295 *output=((Uint16 *)cvt->buf)[(int)ipos]; | 1332 output = (Uint16 *) cvt->buf; |
1296 ipos += cvt->rate_incr; | 1333 ipos = 0.0; |
1297 output += 1; | 1334 for (i = clen / 2; i; --i) { |
1298 } | 1335 *output = ((Uint16 *) cvt->buf)[(int) ipos]; |
1299 } | 1336 ipos += cvt->rate_incr; |
1300 break; | 1337 output += 1; |
1301 } | 1338 } |
1302 } else { | 1339 } |
1303 switch (format & 0xFF) { | 1340 break; |
1304 case 8: { | 1341 } |
1305 Uint8 *output; | 1342 } else { |
1306 | 1343 switch (format & 0xFF) { |
1307 output = cvt->buf+clen; | 1344 case 8: |
1308 ipos = (double)cvt->len_cvt; | 1345 { |
1309 for ( i=clen; i; --i ) { | 1346 Uint8 *output; |
1310 ipos -= cvt->rate_incr; | 1347 |
1311 output -= 1; | 1348 output = cvt->buf + clen; |
1312 *output = cvt->buf[(int)ipos]; | 1349 ipos = (double) cvt->len_cvt; |
1313 } | 1350 for (i = clen; i; --i) { |
1314 } | 1351 ipos -= cvt->rate_incr; |
1315 break; | 1352 output -= 1; |
1316 | 1353 *output = cvt->buf[(int) ipos]; |
1317 case 16: { | 1354 } |
1318 Uint16 *output; | 1355 } |
1319 | 1356 break; |
1320 clen &= ~1; | 1357 |
1321 output = (Uint16 *)(cvt->buf+clen); | 1358 case 16: |
1322 ipos = (double)cvt->len_cvt/2; | 1359 { |
1323 for ( i=clen/2; i; --i ) { | 1360 Uint16 *output; |
1324 ipos -= cvt->rate_incr; | 1361 |
1325 output -= 1; | 1362 clen &= ~1; |
1326 *output=((Uint16 *)cvt->buf)[(int)ipos]; | 1363 output = (Uint16 *) (cvt->buf + clen); |
1327 } | 1364 ipos = (double) cvt->len_cvt / 2; |
1328 } | 1365 for (i = clen / 2; i; --i) { |
1329 break; | 1366 ipos -= cvt->rate_incr; |
1330 } | 1367 output -= 1; |
1331 } | 1368 *output = ((Uint16 *) cvt->buf)[(int) ipos]; |
1332 cvt->len_cvt = clen; | 1369 } |
1333 if ( cvt->filters[++cvt->filter_index] ) { | 1370 } |
1334 cvt->filters[cvt->filter_index](cvt, format); | 1371 break; |
1335 } | 1372 } |
1336 } | 1373 } |
1337 | 1374 cvt->len_cvt = clen; |
1338 int SDL_ConvertAudio(SDL_AudioCVT *cvt) | 1375 if (cvt->filters[++cvt->filter_index]) { |
1339 { | 1376 cvt->filters[cvt->filter_index] (cvt, format); |
1340 /* Make sure there's data to convert */ | 1377 } |
1341 if ( cvt->buf == NULL ) { | 1378 } |
1342 SDL_SetError("No buffer allocated for conversion"); | 1379 |
1343 return(-1); | 1380 int |
1344 } | 1381 SDL_ConvertAudio(SDL_AudioCVT * cvt) |
1345 /* Return okay if no conversion is necessary */ | 1382 { |
1346 cvt->len_cvt = cvt->len; | 1383 /* Make sure there's data to convert */ |
1347 if ( cvt->filters[0] == NULL ) { | 1384 if (cvt->buf == NULL) { |
1348 return(0); | 1385 SDL_SetError("No buffer allocated for conversion"); |
1349 } | 1386 return (-1); |
1350 | 1387 } |
1351 /* Set up the conversion and go! */ | 1388 /* Return okay if no conversion is necessary */ |
1352 cvt->filter_index = 0; | 1389 cvt->len_cvt = cvt->len; |
1353 cvt->filters[0](cvt, cvt->src_format); | 1390 if (cvt->filters[0] == NULL) { |
1354 return(0); | 1391 return (0); |
1392 } | |
1393 | |
1394 /* Set up the conversion and go! */ | |
1395 cvt->filter_index = 0; | |
1396 cvt->filters[0] (cvt, cvt->src_format); | |
1397 return (0); | |
1355 } | 1398 } |
1356 | 1399 |
1357 /* Creates a set of audio filters to convert from one format to another. | 1400 /* Creates a set of audio filters to convert from one format to another. |
1358 Returns -1 if the format conversion is not supported, or 1 if the | 1401 Returns -1 if the format conversion is not supported, or 1 if the |
1359 audio filter is set up. | 1402 audio filter is set up. |
1360 */ | 1403 */ |
1361 | 1404 |
1362 int SDL_BuildAudioCVT(SDL_AudioCVT *cvt, | 1405 int |
1363 Uint16 src_format, Uint8 src_channels, int src_rate, | 1406 SDL_BuildAudioCVT(SDL_AudioCVT * cvt, |
1364 Uint16 dst_format, Uint8 dst_channels, int dst_rate) | 1407 Uint16 src_format, Uint8 src_channels, int src_rate, |
1408 Uint16 dst_format, Uint8 dst_channels, int dst_rate) | |
1365 { | 1409 { |
1366 /*printf("Build format %04x->%04x, channels %u->%u, rate %d->%d\n", | 1410 /*printf("Build format %04x->%04x, channels %u->%u, rate %d->%d\n", |
1367 src_format, dst_format, src_channels, dst_channels, src_rate, dst_rate);*/ | 1411 src_format, dst_format, src_channels, dst_channels, src_rate, dst_rate);*/ |
1368 /* Start off with no conversion necessary */ | 1412 /* Start off with no conversion necessary */ |
1369 cvt->needed = 0; | 1413 cvt->needed = 0; |
1370 cvt->filter_index = 0; | 1414 cvt->filter_index = 0; |
1371 cvt->filters[0] = NULL; | 1415 cvt->filters[0] = NULL; |
1372 cvt->len_mult = 1; | 1416 cvt->len_mult = 1; |
1373 cvt->len_ratio = 1.0; | 1417 cvt->len_ratio = 1.0; |
1374 | 1418 |
1375 /* First filter: Endian conversion from src to dst */ | 1419 /* First filter: Endian conversion from src to dst */ |
1376 if ( (src_format & 0x1000) != (dst_format & 0x1000) | 1420 if ((src_format & 0x1000) != (dst_format & 0x1000) |
1377 && ((src_format & 0xff) != 8) ) { | 1421 && ((src_format & 0xff) != 8)) { |
1378 cvt->filters[cvt->filter_index++] = SDL_ConvertEndian; | 1422 cvt->filters[cvt->filter_index++] = SDL_ConvertEndian; |
1379 } | 1423 } |
1380 | 1424 |
1381 /* Second filter: Sign conversion -- signed/unsigned */ | 1425 /* Second filter: Sign conversion -- signed/unsigned */ |
1382 if ( (src_format & 0x8000) != (dst_format & 0x8000) ) { | 1426 if ((src_format & 0x8000) != (dst_format & 0x8000)) { |
1383 cvt->filters[cvt->filter_index++] = SDL_ConvertSign; | 1427 cvt->filters[cvt->filter_index++] = SDL_ConvertSign; |
1384 } | 1428 } |
1385 | 1429 |
1386 /* Next filter: Convert 16 bit <--> 8 bit PCM */ | 1430 /* Next filter: Convert 16 bit <--> 8 bit PCM */ |
1387 if ( (src_format & 0xFF) != (dst_format & 0xFF) ) { | 1431 if ((src_format & 0xFF) != (dst_format & 0xFF)) { |
1388 switch (dst_format&0x10FF) { | 1432 switch (dst_format & 0x10FF) { |
1389 case AUDIO_U8: | 1433 case AUDIO_U8: |
1390 cvt->filters[cvt->filter_index++] = | 1434 cvt->filters[cvt->filter_index++] = SDL_Convert8; |
1391 SDL_Convert8; | 1435 cvt->len_ratio /= 2; |
1392 cvt->len_ratio /= 2; | 1436 break; |
1393 break; | 1437 case AUDIO_U16LSB: |
1394 case AUDIO_U16LSB: | 1438 cvt->filters[cvt->filter_index++] = SDL_Convert16LSB; |
1395 cvt->filters[cvt->filter_index++] = | 1439 cvt->len_mult *= 2; |
1396 SDL_Convert16LSB; | 1440 cvt->len_ratio *= 2; |
1397 cvt->len_mult *= 2; | 1441 break; |
1398 cvt->len_ratio *= 2; | 1442 case AUDIO_U16MSB: |
1399 break; | 1443 cvt->filters[cvt->filter_index++] = SDL_Convert16MSB; |
1400 case AUDIO_U16MSB: | 1444 cvt->len_mult *= 2; |
1401 cvt->filters[cvt->filter_index++] = | 1445 cvt->len_ratio *= 2; |
1402 SDL_Convert16MSB; | 1446 break; |
1403 cvt->len_mult *= 2; | 1447 } |
1404 cvt->len_ratio *= 2; | 1448 } |
1405 break; | 1449 |
1406 } | 1450 /* Last filter: Mono/Stereo conversion */ |
1407 } | 1451 if (src_channels != dst_channels) { |
1408 | 1452 if ((src_channels == 1) && (dst_channels > 1)) { |
1409 /* Last filter: Mono/Stereo conversion */ | 1453 cvt->filters[cvt->filter_index++] = SDL_ConvertStereo; |
1410 if ( src_channels != dst_channels ) { | 1454 cvt->len_mult *= 2; |
1411 if ( (src_channels == 1) && (dst_channels > 1) ) { | 1455 src_channels = 2; |
1412 cvt->filters[cvt->filter_index++] = | 1456 cvt->len_ratio *= 2; |
1413 SDL_ConvertStereo; | 1457 } |
1414 cvt->len_mult *= 2; | 1458 if ((src_channels == 2) && (dst_channels == 6)) { |
1415 src_channels = 2; | 1459 cvt->filters[cvt->filter_index++] = SDL_ConvertSurround; |
1416 cvt->len_ratio *= 2; | 1460 src_channels = 6; |
1417 } | 1461 cvt->len_mult *= 3; |
1418 if ( (src_channels == 2) && | 1462 cvt->len_ratio *= 3; |
1419 (dst_channels == 6) ) { | 1463 } |
1420 cvt->filters[cvt->filter_index++] = | 1464 if ((src_channels == 2) && (dst_channels == 4)) { |
1421 SDL_ConvertSurround; | 1465 cvt->filters[cvt->filter_index++] = SDL_ConvertSurround_4; |
1422 src_channels = 6; | 1466 src_channels = 4; |
1423 cvt->len_mult *= 3; | 1467 cvt->len_mult *= 2; |
1424 cvt->len_ratio *= 3; | 1468 cvt->len_ratio *= 2; |
1425 } | 1469 } |
1426 if ( (src_channels == 2) && | 1470 while ((src_channels * 2) <= dst_channels) { |
1427 (dst_channels == 4) ) { | 1471 cvt->filters[cvt->filter_index++] = SDL_ConvertStereo; |
1428 cvt->filters[cvt->filter_index++] = | 1472 cvt->len_mult *= 2; |
1429 SDL_ConvertSurround_4; | 1473 src_channels *= 2; |
1430 src_channels = 4; | 1474 cvt->len_ratio *= 2; |
1431 cvt->len_mult *= 2; | 1475 } |
1432 cvt->len_ratio *= 2; | 1476 if ((src_channels == 6) && (dst_channels <= 2)) { |
1433 } | 1477 cvt->filters[cvt->filter_index++] = SDL_ConvertStrip; |
1434 while ( (src_channels*2) <= dst_channels ) { | 1478 src_channels = 2; |
1435 cvt->filters[cvt->filter_index++] = | 1479 cvt->len_ratio /= 3; |
1436 SDL_ConvertStereo; | 1480 } |
1437 cvt->len_mult *= 2; | 1481 if ((src_channels == 6) && (dst_channels == 4)) { |
1438 src_channels *= 2; | 1482 cvt->filters[cvt->filter_index++] = SDL_ConvertStrip_2; |
1439 cvt->len_ratio *= 2; | 1483 src_channels = 4; |
1440 } | 1484 cvt->len_ratio /= 2; |
1441 if ( (src_channels == 6) && | 1485 } |
1442 (dst_channels <= 2) ) { | 1486 /* This assumes that 4 channel audio is in the format: |
1443 cvt->filters[cvt->filter_index++] = | 1487 Left {front/back} + Right {front/back} |
1444 SDL_ConvertStrip; | 1488 so converting to L/R stereo works properly. |
1445 src_channels = 2; | 1489 */ |
1446 cvt->len_ratio /= 3; | 1490 while (((src_channels % 2) == 0) && |
1447 } | 1491 ((src_channels / 2) >= dst_channels)) { |
1448 if ( (src_channels == 6) && | 1492 cvt->filters[cvt->filter_index++] = SDL_ConvertMono; |
1449 (dst_channels == 4) ) { | 1493 src_channels /= 2; |
1450 cvt->filters[cvt->filter_index++] = | 1494 cvt->len_ratio /= 2; |
1451 SDL_ConvertStrip_2; | 1495 } |
1452 src_channels = 4; | 1496 if (src_channels != dst_channels) { |
1453 cvt->len_ratio /= 2; | 1497 /* Uh oh.. */ ; |
1454 } | 1498 } |
1455 /* This assumes that 4 channel audio is in the format: | 1499 } |
1456 Left {front/back} + Right {front/back} | 1500 |
1457 so converting to L/R stereo works properly. | 1501 /* Do rate conversion */ |
1458 */ | 1502 cvt->rate_incr = 0.0; |
1459 while ( ((src_channels%2) == 0) && | 1503 if ((src_rate / 100) != (dst_rate / 100)) { |
1460 ((src_channels/2) >= dst_channels) ) { | 1504 Uint32 hi_rate, lo_rate; |
1461 cvt->filters[cvt->filter_index++] = | 1505 int len_mult; |
1462 SDL_ConvertMono; | 1506 double len_ratio; |
1463 src_channels /= 2; | 1507 void (SDLCALL * rate_cvt) (SDL_AudioCVT * cvt, Uint16 format); |
1464 cvt->len_ratio /= 2; | 1508 |
1465 } | 1509 if (src_rate > dst_rate) { |
1466 if ( src_channels != dst_channels ) { | 1510 hi_rate = src_rate; |
1467 /* Uh oh.. */; | 1511 lo_rate = dst_rate; |
1468 } | 1512 switch (src_channels) { |
1469 } | 1513 case 1: |
1470 | 1514 rate_cvt = SDL_RateDIV2; |
1471 /* Do rate conversion */ | 1515 break; |
1472 cvt->rate_incr = 0.0; | 1516 case 2: |
1473 if ( (src_rate/100) != (dst_rate/100) ) { | 1517 rate_cvt = SDL_RateDIV2_c2; |
1474 Uint32 hi_rate, lo_rate; | 1518 break; |
1475 int len_mult; | 1519 case 4: |
1476 double len_ratio; | 1520 rate_cvt = SDL_RateDIV2_c4; |
1477 void (SDLCALL *rate_cvt)(SDL_AudioCVT *cvt, Uint16 format); | 1521 break; |
1478 | 1522 case 6: |
1479 if ( src_rate > dst_rate ) { | 1523 rate_cvt = SDL_RateDIV2_c6; |
1480 hi_rate = src_rate; | 1524 break; |
1481 lo_rate = dst_rate; | 1525 default: |
1482 switch (src_channels) { | 1526 return -1; |
1483 case 1: rate_cvt = SDL_RateDIV2; break; | 1527 } |
1484 case 2: rate_cvt = SDL_RateDIV2_c2; break; | 1528 len_mult = 1; |
1485 case 4: rate_cvt = SDL_RateDIV2_c4; break; | 1529 len_ratio = 0.5; |
1486 case 6: rate_cvt = SDL_RateDIV2_c6; break; | 1530 } else { |
1487 default: return -1; | 1531 hi_rate = dst_rate; |
1488 } | 1532 lo_rate = src_rate; |
1489 len_mult = 1; | 1533 switch (src_channels) { |
1490 len_ratio = 0.5; | 1534 case 1: |
1491 } else { | 1535 rate_cvt = SDL_RateMUL2; |
1492 hi_rate = dst_rate; | 1536 break; |
1493 lo_rate = src_rate; | 1537 case 2: |
1494 switch (src_channels) { | 1538 rate_cvt = SDL_RateMUL2_c2; |
1495 case 1: rate_cvt = SDL_RateMUL2; break; | 1539 break; |
1496 case 2: rate_cvt = SDL_RateMUL2_c2; break; | 1540 case 4: |
1497 case 4: rate_cvt = SDL_RateMUL2_c4; break; | 1541 rate_cvt = SDL_RateMUL2_c4; |
1498 case 6: rate_cvt = SDL_RateMUL2_c6; break; | 1542 break; |
1499 default: return -1; | 1543 case 6: |
1500 } | 1544 rate_cvt = SDL_RateMUL2_c6; |
1501 len_mult = 2; | 1545 break; |
1502 len_ratio = 2.0; | 1546 default: |
1503 } | 1547 return -1; |
1504 /* If hi_rate = lo_rate*2^x then conversion is easy */ | 1548 } |
1505 while ( ((lo_rate*2)/100) <= (hi_rate/100) ) { | 1549 len_mult = 2; |
1506 cvt->filters[cvt->filter_index++] = rate_cvt; | 1550 len_ratio = 2.0; |
1507 cvt->len_mult *= len_mult; | 1551 } |
1508 lo_rate *= 2; | 1552 /* If hi_rate = lo_rate*2^x then conversion is easy */ |
1509 cvt->len_ratio *= len_ratio; | 1553 while (((lo_rate * 2) / 100) <= (hi_rate / 100)) { |
1510 } | 1554 cvt->filters[cvt->filter_index++] = rate_cvt; |
1511 /* We may need a slow conversion here to finish up */ | 1555 cvt->len_mult *= len_mult; |
1512 if ( (lo_rate/100) != (hi_rate/100) ) { | 1556 lo_rate *= 2; |
1557 cvt->len_ratio *= len_ratio; | |
1558 } | |
1559 /* We may need a slow conversion here to finish up */ | |
1560 if ((lo_rate / 100) != (hi_rate / 100)) { | |
1513 #if 1 | 1561 #if 1 |
1514 /* The problem with this is that if the input buffer is | 1562 /* The problem with this is that if the input buffer is |
1515 say 1K, and the conversion rate is say 1.1, then the | 1563 say 1K, and the conversion rate is say 1.1, then the |
1516 output buffer is 1.1K, which may not be an acceptable | 1564 output buffer is 1.1K, which may not be an acceptable |
1517 buffer size for the audio driver (not a power of 2) | 1565 buffer size for the audio driver (not a power of 2) |
1518 */ | 1566 */ |
1519 /* For now, punt and hope the rate distortion isn't great. | 1567 /* For now, punt and hope the rate distortion isn't great. |
1520 */ | 1568 */ |
1521 #else | 1569 #else |
1522 if ( src_rate < dst_rate ) { | 1570 if (src_rate < dst_rate) { |
1523 cvt->rate_incr = (double)lo_rate/hi_rate; | 1571 cvt->rate_incr = (double) lo_rate / hi_rate; |
1524 cvt->len_mult *= 2; | 1572 cvt->len_mult *= 2; |
1525 cvt->len_ratio /= cvt->rate_incr; | 1573 cvt->len_ratio /= cvt->rate_incr; |
1526 } else { | 1574 } else { |
1527 cvt->rate_incr = (double)hi_rate/lo_rate; | 1575 cvt->rate_incr = (double) hi_rate / lo_rate; |
1528 cvt->len_ratio *= cvt->rate_incr; | 1576 cvt->len_ratio *= cvt->rate_incr; |
1529 } | 1577 } |
1530 cvt->filters[cvt->filter_index++] = SDL_RateSLOW; | 1578 cvt->filters[cvt->filter_index++] = SDL_RateSLOW; |
1531 #endif | 1579 #endif |
1532 } | 1580 } |
1533 } | 1581 } |
1534 | 1582 |
1535 /* Set up the filter information */ | 1583 /* Set up the filter information */ |
1536 if ( cvt->filter_index != 0 ) { | 1584 if (cvt->filter_index != 0) { |
1537 cvt->needed = 1; | 1585 cvt->needed = 1; |
1538 cvt->src_format = src_format; | 1586 cvt->src_format = src_format; |
1539 cvt->dst_format = dst_format; | 1587 cvt->dst_format = dst_format; |
1540 cvt->len = 0; | 1588 cvt->len = 0; |
1541 cvt->buf = NULL; | 1589 cvt->buf = NULL; |
1542 cvt->filters[cvt->filter_index] = NULL; | 1590 cvt->filters[cvt->filter_index] = NULL; |
1543 } | 1591 } |
1544 return(cvt->needed); | 1592 return (cvt->needed); |
1545 } | 1593 } |
1594 | |
1595 /* vi: set ts=4 sw=4 expandtab: */ |