|
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 */ |
|
7 #include "SDL_config.h" |
|
8 |
|
9 #include <stdio.h> |
|
10 #include <stdlib.h> |
|
11 |
|
12 #if HAVE_SIGNAL_H |
|
13 #include <signal.h> |
|
14 #endif |
|
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 |
|
26 |
|
27 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ |
|
28 static void quit(int rc) |
|
29 { |
|
30 SDL_Quit(); |
|
31 exit(rc); |
|
32 } |
|
33 |
|
34 |
|
35 void SDLCALL fillerup(void *unused, Uint8 *stream, int len) |
|
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 ) { |
|
46 SDL_memcpy(stream, waveptr, waveleft); |
|
47 stream += waveleft; |
|
48 len -= waveleft; |
|
49 waveptr = wave.sound; |
|
50 waveleft = wave.soundlen; |
|
51 wave.soundpos = 0; |
|
52 } |
|
53 SDL_memcpy(stream, waveptr, len); |
|
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()); |
|
70 return(1); |
|
71 } |
|
72 if ( argv[1] == NULL ) { |
|
73 argv[1] = "sample.wav"; |
|
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()); |
|
80 quit(1); |
|
81 } |
|
82 |
|
83 wave.spec.callback = fillerup; |
|
84 #if HAVE_SIGNAL_H |
|
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); |
|
94 #endif /* HAVE_SIGNAL_H */ |
|
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); |
|
100 quit(2); |
|
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); |
|
112 SDL_Quit(); |
|
113 return(0); |
|
114 } |