test/loopwave.c
changeset 0 74212992fb08
child 1151 be9c9c8f6d53
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
       
     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 
       
     8 #include <stdio.h>
       
     9 #include <stdlib.h>
       
    10 #include <signal.h>
       
    11 
       
    12 #include "SDL.h"
       
    13 #include "SDL_audio.h"
       
    14 
       
    15 struct {
       
    16 	SDL_AudioSpec spec;
       
    17 	Uint8   *sound;			/* Pointer to wave data */
       
    18 	Uint32   soundlen;		/* Length of wave data */
       
    19 	int      soundpos;		/* Current play position */
       
    20 } wave;
       
    21 
       
    22 void fillerup(void *unused, Uint8 *stream, int len)
       
    23 {
       
    24 	Uint8 *waveptr;
       
    25 	int    waveleft;
       
    26 
       
    27 	/* Set up the pointers */
       
    28 	waveptr = wave.sound + wave.soundpos;
       
    29 	waveleft = wave.soundlen - wave.soundpos;
       
    30 
       
    31 	/* Go! */
       
    32 	while ( waveleft <= len ) {
       
    33 		SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME);
       
    34 		stream += waveleft;
       
    35 		len -= waveleft;
       
    36 		waveptr = wave.sound;
       
    37 		waveleft = wave.soundlen;
       
    38 		wave.soundpos = 0;
       
    39 	}
       
    40 	SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME);
       
    41 	wave.soundpos += len;
       
    42 }
       
    43 
       
    44 static int done = 0;
       
    45 void poked(int sig)
       
    46 {
       
    47 	done = 1;
       
    48 }
       
    49 
       
    50 int main(int argc, char *argv[])
       
    51 {
       
    52 	char name[32];
       
    53 
       
    54 	/* Load the SDL library */
       
    55 	if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
       
    56 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
       
    57 		exit(1);
       
    58 	}
       
    59 	atexit(SDL_Quit);
       
    60 
       
    61 	if ( argv[1] == NULL ) {
       
    62 		fprintf(stderr, "Usage: %s <wavefile>\n", argv[0]);
       
    63 		exit(1);
       
    64 	}
       
    65 
       
    66 	/* Load the wave file into memory */
       
    67 	if ( SDL_LoadWAV(argv[1],
       
    68 			&wave.spec, &wave.sound, &wave.soundlen) == NULL ) {
       
    69 		fprintf(stderr, "Couldn't load %s: %s\n",
       
    70 						argv[1], SDL_GetError());
       
    71 		exit(1);
       
    72 	}
       
    73 	wave.spec.callback = fillerup;
       
    74 
       
    75 	/* Set the signals */
       
    76 #ifdef SIGHUP
       
    77 	signal(SIGHUP, poked);
       
    78 #endif
       
    79 	signal(SIGINT, poked);
       
    80 #ifdef SIGQUIT
       
    81 	signal(SIGQUIT, poked);
       
    82 #endif
       
    83 	signal(SIGTERM, poked);
       
    84 
       
    85 	/* Initialize fillerup() variables */
       
    86 	if ( SDL_OpenAudio(&wave.spec, NULL) < 0 ) {
       
    87 		fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
       
    88 		SDL_FreeWAV(wave.sound);
       
    89 		exit(2);
       
    90 	}
       
    91 	SDL_PauseAudio(0);
       
    92 
       
    93 	/* Let the audio run */
       
    94 	printf("Using audio driver: %s\n", SDL_AudioDriverName(name, 32));
       
    95 	while ( ! done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) )
       
    96 		SDL_Delay(1000);
       
    97 
       
    98 	/* Clean up on signal */
       
    99 	SDL_CloseAudio();
       
   100 	SDL_FreeWAV(wave.sound);
       
   101 	return(0);
       
   102 }