Mercurial > sdl-ios-xcode
annotate test/testwin.c @ 1260:80f8c94b5199
Date: 10 Jun 2003 15:30:59 -0400
From: Mike Shal
Subject: [SDL] Bug in SDL_wave.c?
Hey everyone, I'm not sure if this is a bug in SDL, or if I just have
incorrect WAV files. The problem I'm having is loading multiple
concatenated WAVs from SDL_LoadWAV_RW. Some WAV files put comments at
the end of the file (which may be bad form), and SDL doesn't skip past
them when reading from the RWops. So the next WAV I try to load will
start at the comment section of the previous WAV, which obviously
doesn't work. If anyone else is having this problem, one quick fix you
can do is run sox on the bad WAVs, which strips out all of the comment
sections.
Eg:
$ sox sound.wav tmp.wav
$ mv -f tmp.wav sound.wav
The other fix is to patch SDL_wave.c, which is included with this email.
(Assuming I made the patch correctly :). All it does is calculate how
much remaining space there is in the WAV file after the data chunk, and
does SDL_RWseek to skip it. I don't think it should interfere with
anything else, but if someone could check it that would be nice :). If
the bug is really with SDL and not with my WAVs, can someone work this
into the next version of SDL? Thanks,
-Mike Shal
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 24 Jan 2006 07:20:18 +0000 |
parents | 51a8702d8ecd |
children | 14717b52abc0 |
rev | line source |
---|---|
0 | 1 |
2 /* Bring up a window and play with it */ | |
3 | |
4 #include <stdlib.h> | |
5 #include <stdio.h> | |
6 #include <string.h> | |
7 | |
8 #define BENCHMARK_SDL | |
9 | |
10 #define NOTICE(X) printf("%s", X); | |
11 | |
12 #include "SDL.h" | |
13 | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
14 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
15 static void quit(int rc) |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
16 { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
17 SDL_Quit(); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
18 exit(rc); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
19 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
20 |
0 | 21 void DrawPict(SDL_Surface *screen, char *bmpfile, |
22 int speedy, int flip, int nofade) | |
23 { | |
24 SDL_Surface *picture; | |
25 SDL_Rect dest, update; | |
26 int i, centered; | |
27 int ncolors; | |
28 SDL_Color *colors, *cmap; | |
29 | |
30 /* Load the image into a surface */ | |
31 if ( bmpfile == NULL ) { | |
32 bmpfile = "sample.bmp"; /* Sample image */ | |
33 } | |
34 fprintf(stderr, "Loading picture: %s\n", bmpfile); | |
35 picture = SDL_LoadBMP(bmpfile); | |
36 if ( picture == NULL ) { | |
37 fprintf(stderr, "Couldn't load %s: %s\n", bmpfile, | |
38 SDL_GetError()); | |
39 return; | |
40 } | |
41 | |
42 /* Set the display colors -- on a hicolor display this is a no-op */ | |
43 if ( picture->format->palette ) { | |
44 ncolors = picture->format->palette->ncolors; | |
45 colors = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
46 cmap = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
47 memcpy(colors, picture->format->palette->colors, | |
48 ncolors*sizeof(SDL_Color)); | |
49 } else { | |
50 int r, g, b; | |
51 | |
52 /* Allocate 256 color palette */ | |
53 ncolors = 256; | |
54 colors = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
55 cmap = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
56 | |
57 /* Set a 3,3,2 color cube */ | |
58 for ( r=0; r<8; ++r ) { | |
59 for ( g=0; g<8; ++g ) { | |
60 for ( b=0; b<4; ++b ) { | |
61 i = ((r<<5)|(g<<2)|b); | |
62 colors[i].r = r<<5; | |
63 colors[i].g = g<<5; | |
64 colors[i].b = b<<6; | |
65 } | |
66 } | |
67 } | |
68 } | |
69 NOTICE("testwin: setting colors\n"); | |
70 if ( ! SDL_SetColors(screen, colors, 0, ncolors) && | |
71 (screen->format->palette != NULL) ) { | |
72 fprintf(stderr, | |
73 "Warning: Couldn't set all of the colors, but SDL will map the image\n" | |
74 " (colormap fading will suffer - try the -warp option)\n" | |
75 ); | |
76 } | |
77 | |
78 /* Set the screen to black (not really necessary) */ | |
79 if ( SDL_LockSurface(screen) == 0 ) { | |
80 Uint32 black; | |
81 Uint8 *pixels; | |
82 | |
83 black = SDL_MapRGB(screen->format, 0, 0, 0); | |
84 pixels = (Uint8 *)screen->pixels; | |
85 for ( i=0; i<screen->h; ++i ) { | |
86 memset(pixels, black, | |
87 screen->w*screen->format->BytesPerPixel); | |
88 pixels += screen->pitch; | |
89 } | |
90 SDL_UnlockSurface(screen); | |
91 SDL_UpdateRect(screen, 0, 0, 0, 0); | |
92 } | |
93 | |
94 /* Display the picture */ | |
95 if ( speedy ) { | |
96 SDL_Surface *displayfmt; | |
97 | |
98 fprintf(stderr, "Converting picture\n"); | |
99 displayfmt = SDL_DisplayFormat(picture); | |
100 if ( displayfmt == NULL ) { | |
101 fprintf(stderr, | |
102 "Couldn't convert image: %s\n", SDL_GetError()); | |
103 goto done; | |
104 } | |
105 SDL_FreeSurface(picture); | |
106 picture = displayfmt; | |
107 } | |
108 printf("(image surface located in %s memory)\n", | |
109 (picture->flags&SDL_HWSURFACE) ? "video" : "system"); | |
110 centered = (screen->w - picture->w)/2; | |
111 if ( centered < 0 ) { | |
112 centered = 0; | |
113 } | |
114 dest.y = (screen->h - picture->h)/2; | |
115 dest.w = picture->w; | |
116 dest.h = picture->h; | |
117 NOTICE("testwin: moving image\n"); | |
118 for ( i=0; i<=centered; ++i ) { | |
119 dest.x = i; | |
120 update = dest; | |
121 if ( SDL_BlitSurface(picture, NULL, screen, &update) < 0 ) { | |
122 fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); | |
123 break; | |
124 } | |
125 if ( flip ) { | |
126 SDL_Flip(screen); | |
127 } else { | |
128 SDL_UpdateRects(screen, 1, &update); | |
129 } | |
130 } | |
131 | |
132 #ifdef SCREENSHOT | |
133 if ( SDL_SaveBMP(screen, "screen.bmp") < 0 ) | |
134 printf("Couldn't save screen: %s\n", SDL_GetError()); | |
135 #endif | |
136 | |
137 #ifndef BENCHMARK_SDL | |
138 /* Let it sit there for a while */ | |
139 SDL_Delay(5*1000); | |
140 #endif | |
141 /* Fade the colormap */ | |
142 if ( ! nofade ) { | |
143 int maxstep; | |
144 SDL_Color final; | |
145 SDL_Color palcolors[256]; | |
146 struct { | |
147 Sint16 r, g, b; | |
148 } cdist[256]; | |
149 | |
150 NOTICE("testwin: fading out...\n"); | |
151 memcpy(cmap, colors, ncolors*sizeof(SDL_Color)); | |
152 maxstep = 32-1; | |
153 final.r = 0xFF; | |
154 final.g = 0x00; | |
155 final.b = 0x00; | |
156 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
157 for ( i=0; i<ncolors; ++i ) { | |
158 cdist[i].r = final.r-palcolors[i].r; | |
159 cdist[i].g = final.g-palcolors[i].g; | |
160 cdist[i].b = final.b-palcolors[i].b; | |
161 } | |
162 for ( i=0; i<=maxstep/2; ++i ) { /* halfway fade */ | |
163 int c; | |
164 for ( c=0; c<ncolors; ++c ) { | |
165 colors[c].r = | |
166 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
167 colors[c].g = | |
168 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
169 colors[c].b = | |
170 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
171 } | |
172 SDL_SetColors(screen, colors, 0, ncolors); | |
173 SDL_Delay(1); | |
174 } | |
175 final.r = 0x00; | |
176 final.g = 0x00; | |
177 final.b = 0x00; | |
178 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
179 for ( i=0; i<ncolors; ++i ) { | |
180 cdist[i].r = final.r-palcolors[i].r; | |
181 cdist[i].g = final.g-palcolors[i].g; | |
182 cdist[i].b = final.b-palcolors[i].b; | |
183 } | |
184 maxstep /= 2; | |
185 for ( i=0; i<=maxstep; ++i ) { /* finish fade out */ | |
186 int c; | |
187 for ( c=0; c<ncolors; ++c ) { | |
188 colors[c].r = | |
189 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
190 colors[c].g = | |
191 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
192 colors[c].b = | |
193 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
194 } | |
195 SDL_SetColors(screen, colors, 0, ncolors); | |
196 SDL_Delay(1); | |
197 } | |
198 for ( i=0; i<ncolors; ++i ) { | |
199 colors[i].r = final.r; | |
200 colors[i].g = final.g; | |
201 colors[i].b = final.b; | |
202 } | |
203 SDL_SetColors(screen, colors, 0, ncolors); | |
204 NOTICE("testwin: fading in...\n"); | |
205 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
206 for ( i=0; i<ncolors; ++i ) { | |
207 cdist[i].r = cmap[i].r-palcolors[i].r; | |
208 cdist[i].g = cmap[i].g-palcolors[i].g; | |
209 cdist[i].b = cmap[i].b-palcolors[i].b; | |
210 } | |
211 for ( i=0; i<=maxstep; ++i ) { /* 32 step fade in */ | |
212 int c; | |
213 for ( c=0; c<ncolors; ++c ) { | |
214 colors[c].r = | |
215 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
216 colors[c].g = | |
217 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
218 colors[c].b = | |
219 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
220 } | |
221 SDL_SetColors(screen, colors, 0, ncolors); | |
222 SDL_Delay(1); | |
223 } | |
224 NOTICE("testwin: fading over\n"); | |
225 } | |
226 | |
227 done: | |
228 /* Free the picture and return */ | |
229 SDL_FreeSurface(picture); | |
230 free(colors); free(cmap); | |
231 return; | |
232 } | |
233 | |
234 int main(int argc, char *argv[]) | |
235 { | |
236 SDL_Surface *screen; | |
237 /* Options */ | |
238 int speedy, flip, nofade; | |
239 int delay; | |
240 int w, h; | |
241 int desired_bpp; | |
242 Uint32 video_flags; | |
243 #ifdef BENCHMARK_SDL | |
244 Uint32 then, now; | |
245 #endif | |
246 /* Set default options and check command-line */ | |
247 speedy = 0; | |
248 flip = 0; | |
249 nofade = 0; | |
250 delay = 1; | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
251 |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
252 #ifdef _WIN32_WCE |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
253 w = 640; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
254 h = 320; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
255 desired_bpp = 0; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
256 video_flags = SDL_FULLSCREEN; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
257 #else |
0 | 258 w = 640; |
259 h = 480; | |
260 desired_bpp = 0; | |
261 video_flags = 0; | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
262 #endif |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
263 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
264 fprintf(stderr, |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
265 "Couldn't initialize SDL: %s\n", SDL_GetError()); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
266 return(1); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
267 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
268 |
0 | 269 while ( argc > 1 ) { |
270 if ( strcmp(argv[1], "-speedy") == 0 ) { | |
271 speedy = 1; | |
272 argv += 1; | |
273 argc -= 1; | |
274 } else | |
275 if ( strcmp(argv[1], "-nofade") == 0 ) { | |
276 nofade = 1; | |
277 argv += 1; | |
278 argc -= 1; | |
279 } else | |
280 if ( strcmp(argv[1], "-delay") == 0 ) { | |
281 if ( argv[2] ) { | |
282 delay = atoi(argv[2]); | |
283 argv += 2; | |
284 argc -= 2; | |
285 } else { | |
286 fprintf(stderr, | |
287 "The -delay option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
288 quit(1); |
0 | 289 } |
290 } else | |
291 if ( strcmp(argv[1], "-width") == 0 ) { | |
292 if ( argv[2] && ((w = atoi(argv[2])) > 0) ) { | |
293 argv += 2; | |
294 argc -= 2; | |
295 } else { | |
296 fprintf(stderr, | |
297 "The -width option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
298 quit(1); |
0 | 299 } |
300 } else | |
301 if ( strcmp(argv[1], "-height") == 0 ) { | |
302 if ( argv[2] && ((h = atoi(argv[2])) > 0) ) { | |
303 argv += 2; | |
304 argc -= 2; | |
305 } else { | |
306 fprintf(stderr, | |
307 "The -height option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
308 quit(1); |
0 | 309 } |
310 } else | |
311 if ( strcmp(argv[1], "-bpp") == 0 ) { | |
312 if ( argv[2] ) { | |
313 desired_bpp = atoi(argv[2]); | |
314 argv += 2; | |
315 argc -= 2; | |
316 } else { | |
317 fprintf(stderr, | |
318 "The -bpp option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
319 quit(1); |
0 | 320 } |
321 } else | |
322 if ( strcmp(argv[1], "-warp") == 0 ) { | |
323 video_flags |= SDL_HWPALETTE; | |
324 argv += 1; | |
325 argc -= 1; | |
326 } else | |
327 if ( strcmp(argv[1], "-hw") == 0 ) { | |
328 video_flags |= SDL_HWSURFACE; | |
329 argv += 1; | |
330 argc -= 1; | |
331 } else | |
332 if ( strcmp(argv[1], "-flip") == 0 ) { | |
333 video_flags |= SDL_DOUBLEBUF; | |
334 argv += 1; | |
335 argc -= 1; | |
336 } else | |
337 if ( strcmp(argv[1], "-fullscreen") == 0 ) { | |
338 video_flags |= SDL_FULLSCREEN; | |
339 argv += 1; | |
340 argc -= 1; | |
341 } else | |
342 break; | |
343 } | |
344 | |
345 /* Initialize the display */ | |
346 screen = SDL_SetVideoMode(w, h, desired_bpp, video_flags); | |
347 if ( screen == NULL ) { | |
348 fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n", | |
349 w, h, desired_bpp, SDL_GetError()); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
350 quit(1); |
0 | 351 } |
228
153f221b7d48
Give more info about the current video mode
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
352 printf("Set%s %dx%dx%d mode\n", |
153f221b7d48
Give more info about the current video mode
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
353 screen->flags & SDL_FULLSCREEN ? " fullscreen" : "", |
0 | 354 screen->w, screen->h, screen->format->BitsPerPixel); |
355 printf("(video surface located in %s memory)\n", | |
356 (screen->flags&SDL_HWSURFACE) ? "video" : "system"); | |
357 if ( screen->flags & SDL_DOUBLEBUF ) { | |
358 printf("Double-buffering enabled\n"); | |
359 flip = 1; | |
360 } | |
361 | |
362 /* Set the window manager title bar */ | |
363 SDL_WM_SetCaption("SDL test window", "testwin"); | |
364 | |
365 /* Do all the drawing work */ | |
366 #ifdef BENCHMARK_SDL | |
367 then = SDL_GetTicks(); | |
368 DrawPict(screen, argv[1], speedy, flip, nofade); | |
369 now = SDL_GetTicks(); | |
370 printf("Time: %d milliseconds\n", now-then); | |
371 #else | |
372 DrawPict(screen, argv[1], speedy, flip, nofade); | |
373 #endif | |
374 SDL_Delay(delay*1000); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
375 SDL_Quit(); |
0 | 376 return(0); |
377 } |