Mercurial > sdl-ios-xcode
annotate test/loopwave.c @ 4106:12bb6311fd5d SDL-1.2
Hans de Goede fixed bug #495
When running boswars: http://www.boswars.org/ on a machine with intel
integrathed graphics it crashes when it tries to play the initial theora
splashscreen video:
X Error of failed request: BadAlloc (insufficient resources for operation)
Major opcode of failed request: 140 (XVideo)
Minor opcode of failed request: 19 ()
Serial number of failed request: 25
Current serial number in output stream: 26
boswars: xcb_xlib.c:41: xcb_xlib_lock: Assertion `!c->xlib.lock' failed.
Aborted
I recognized this problem from a few years back, when I encountered it while
working on the Xv blitter for xmame. The problem is that for some reason
creation the Xvport and XvImage succeeds, and failure (lack of resources / hw
capability?) is only indicated during the first XvPut[Shm]Image. I've written a
patch for SDL using the work around for this I developed for xmame (and which
is still used successfully in xmame after many years of usage).
I'll admit it isn't very pretty, but after investigating several possibilities
this was the best option, any other fixes would need changes to the SDL api and
abi.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 29 Dec 2007 02:23:48 +0000 |
parents | e905bb5d9bc3 |
children |
rev | line source |
---|---|
0 | 1 |
2 /* Program to load a wave file and loop playing it using SDL sound */ | |
3 | |
4 /* loopwaves.c is much more robust in handling WAVE files -- | |
5 This is only for simple WAVEs | |
6 */ | |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
7 #include "SDL_config.h" |
0 | 8 |
9 #include <stdio.h> | |
10 #include <stdlib.h> | |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
11 |
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
12 #if HAVE_SIGNAL_H |
0 | 13 #include <signal.h> |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
14 #endif |
0 | 15 |
16 #include "SDL.h" | |
17 #include "SDL_audio.h" | |
18 | |
19 struct { | |
20 SDL_AudioSpec spec; | |
21 Uint8 *sound; /* Pointer to wave data */ | |
22 Uint32 soundlen; /* Length of wave data */ | |
23 int soundpos; /* Current play position */ | |
24 } wave; | |
25 | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
26 |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
27 /* 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:
0
diff
changeset
|
28 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:
0
diff
changeset
|
29 { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
30 SDL_Quit(); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
31 exit(rc); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
32 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
33 |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
34 |
1769 | 35 void SDLCALL fillerup(void *unused, Uint8 *stream, int len) |
0 | 36 { |
37 Uint8 *waveptr; | |
38 int waveleft; | |
39 | |
40 /* Set up the pointers */ | |
41 waveptr = wave.sound + wave.soundpos; | |
42 waveleft = wave.soundlen - wave.soundpos; | |
43 | |
44 /* Go! */ | |
45 while ( waveleft <= len ) { | |
4002
e905bb5d9bc3
Fixed our own test app. :)
Ryan C. Gordon <icculus@icculus.org>
parents:
1769
diff
changeset
|
46 SDL_memcpy(stream, waveptr, waveleft); |
0 | 47 stream += waveleft; |
48 len -= waveleft; | |
49 waveptr = wave.sound; | |
50 waveleft = wave.soundlen; | |
51 wave.soundpos = 0; | |
52 } | |
4002
e905bb5d9bc3
Fixed our own test app. :)
Ryan C. Gordon <icculus@icculus.org>
parents:
1769
diff
changeset
|
53 SDL_memcpy(stream, waveptr, len); |
0 | 54 wave.soundpos += len; |
55 } | |
56 | |
57 static int done = 0; | |
58 void poked(int sig) | |
59 { | |
60 done = 1; | |
61 } | |
62 | |
63 int main(int argc, char *argv[]) | |
64 { | |
65 char name[32]; | |
66 | |
67 /* Load the SDL library */ | |
68 if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) { | |
69 fprintf(stderr, "Couldn't initialize SDL: %s\n",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:
0
diff
changeset
|
70 return(1); |
0 | 71 } |
72 if ( argv[1] == NULL ) { | |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
73 argv[1] = "sample.wav"; |
0 | 74 } |
75 /* Load the wave file into memory */ | |
76 if ( SDL_LoadWAV(argv[1], | |
77 &wave.spec, &wave.sound, &wave.soundlen) == NULL ) { | |
78 fprintf(stderr, "Couldn't load %s: %s\n", | |
79 argv[1], 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:
0
diff
changeset
|
80 quit(1); |
0 | 81 } |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
82 |
0 | 83 wave.spec.callback = fillerup; |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
84 #if HAVE_SIGNAL_H |
0 | 85 /* Set the signals */ |
86 #ifdef SIGHUP | |
87 signal(SIGHUP, poked); | |
88 #endif | |
89 signal(SIGINT, poked); | |
90 #ifdef SIGQUIT | |
91 signal(SIGQUIT, poked); | |
92 #endif | |
93 signal(SIGTERM, poked); | |
1463
0394f8ebc42d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1151
diff
changeset
|
94 #endif /* HAVE_SIGNAL_H */ |
0 | 95 |
96 /* Initialize fillerup() variables */ | |
97 if ( SDL_OpenAudio(&wave.spec, NULL) < 0 ) { | |
98 fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); | |
99 SDL_FreeWAV(wave.sound); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
100 quit(2); |
0 | 101 } |
102 SDL_PauseAudio(0); | |
103 | |
104 /* Let the audio run */ | |
105 printf("Using audio driver: %s\n", SDL_AudioDriverName(name, 32)); | |
106 while ( ! done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) ) | |
107 SDL_Delay(1000); | |
108 | |
109 /* Clean up on signal */ | |
110 SDL_CloseAudio(); | |
111 SDL_FreeWAV(wave.sound); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
112 SDL_Quit(); |
0 | 113 return(0); |
114 } |