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 } 115