SDL 1.2.13
[crawl:crawl-sdl.git] / test / loopwave.c
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 }