test/loopwave.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 09 May 2006 07:26:58 +0000
changeset 1790 828a17e05192
parent 1769 290b5baf2fca
child 1660 8b9d79e7eacf
child 1895 c121d94672cb
child 4002 e905bb5d9bc3
permissions -rw-r--r--
Date: Mon, 8 May 2006 14:19:30 -0700
From: Bob Ippolito
Subject: SDL trunk (r2346) and Mac OS X

The current state of the trunk doesn't quite compile on Mac OS X,
I've attached a series of patches that gets it to compile and kills a
few warnings.

sdl-trunk-r2346-dlcompat-warnings.diff:
The dlcompat thing is just loaded with incorrect type signatures ..
some of them have changed since 10.2 and others are just flat wrong.
This puts it in sync with the latest headers. People on 10.2 will get
the warnings instead of people with new kits.
     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 	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 }