test/loopwave.c
author Sam Lantinga <slouken@libsdl.org>
Sat, 20 May 2006 04:35:58 +0000
branchSDL-1.3
changeset 1660 8b9d79e7eacf
parent 1659 14717b52abc0
child 1662 782fd950bd46
permissions -rw-r--r--
Added API requested in bug #43:

Added SDL_GetNumVideoDrivers() and SDL_GetVideoDriver().
Replaced SDL_VideoDriverName() with SDL_GetCurrentVideoDriver()
Added SDL_GetNumAudioDrivers() and SDL_GetAudioDriver().
Replaced SDL_AudioDriverName() with SDL_GetCurrentAudioDriver()
     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_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME);
    47 		stream += waveleft;
    48 		len -= waveleft;
    49 		waveptr = wave.sound;
    50 		waveleft = wave.soundlen;
    51 		wave.soundpos = 0;
    52 	}
    53 	SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME);
    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 	int i, n;
    66 
    67 	/* Print available audio drivers */
    68 	n = SDL_GetNumAudioDrivers();
    69 	if ( n == 0 ) {
    70 		printf("No built-in audio drivers\n");
    71 	} else {
    72 		printf("Built-in audio drivers:");
    73 		for ( i = 0; i < n; ++i ) {
    74 			if ( i > 0 ) {
    75 				printf(",");
    76 			}
    77 			printf(" %s", SDL_GetAudioDriver(i));
    78 		}
    79 		printf("\n");
    80 	}
    81 
    82 	/* Load the SDL library */
    83 	if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
    84 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
    85 		return(1);
    86 	}
    87 	if ( argv[1] == NULL ) {
    88 		argv[1] = "sample.wav";
    89 	}
    90 	/* Load the wave file into memory */
    91 	if ( SDL_LoadWAV(argv[1],
    92 			&wave.spec, &wave.sound, &wave.soundlen) == NULL ) {
    93 		fprintf(stderr, "Couldn't load %s: %s\n",
    94 						argv[1], SDL_GetError());
    95 		quit(1);
    96 	}
    97 
    98 	wave.spec.callback = fillerup;
    99 #if HAVE_SIGNAL_H
   100 	/* Set the signals */
   101 #ifdef SIGHUP
   102 	signal(SIGHUP, poked);
   103 #endif
   104 	signal(SIGINT, poked);
   105 #ifdef SIGQUIT
   106 	signal(SIGQUIT, poked);
   107 #endif
   108 	signal(SIGTERM, poked);
   109 #endif /* HAVE_SIGNAL_H */
   110 
   111 	/* Initialize fillerup() variables */
   112 	if ( SDL_OpenAudio(&wave.spec, NULL) < 0 ) {
   113 		fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
   114 		SDL_FreeWAV(wave.sound);
   115 		quit(2);
   116 	}
   117 	SDL_PauseAudio(0);
   118 
   119 	/* Let the audio run */
   120 	printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
   121 	while ( ! done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) )
   122 		SDL_Delay(1000);
   123 
   124 	/* Clean up on signal */
   125 	SDL_CloseAudio();
   126 	SDL_FreeWAV(wave.sound);
   127 	SDL_Quit();
   128 	return(0);
   129 }