Mercurial > sdl-ios-xcode
view test/loopwave.c @ 2043:adf732f1f016
Formatting update
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 24 Sep 2006 15:56:55 +0000 |
parents | c121d94672cb |
children | 5f6550e5184f |
line wrap: on
line source
/* Program to load a wave file and loop playing it using SDL sound */ /* loopwaves.c is much more robust in handling WAVE files -- This is only for simple WAVEs */ #include "SDL_config.h" #include <stdio.h> #include <stdlib.h> #if HAVE_SIGNAL_H #include <signal.h> #endif #include "SDL.h" #include "SDL_audio.h" struct { SDL_AudioSpec spec; Uint8 *sound; /* Pointer to wave data */ Uint32 soundlen; /* Length of wave data */ int soundpos; /* Current play position */ } wave; /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ static void quit(int rc) { SDL_Quit(); exit(rc); } void SDLCALL fillerup(void *unused, Uint8 * stream, int len) { Uint8 *waveptr; int waveleft; /* Set up the pointers */ waveptr = wave.sound + wave.soundpos; waveleft = wave.soundlen - wave.soundpos; /* Go! */ while (waveleft <= len) { SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME); stream += waveleft; len -= waveleft; waveptr = wave.sound; waveleft = wave.soundlen; wave.soundpos = 0; } SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME); wave.soundpos += len; } static int done = 0; void poked(int sig) { done = 1; } int main(int argc, char *argv[]) { int i, n; /* Print available audio drivers */ n = SDL_GetNumAudioDrivers(); if (n == 0) { printf("No built-in audio drivers\n"); } else { printf("Built-in audio drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { printf(","); } printf(" %s", SDL_GetAudioDriver(i)); } printf("\n"); } /* Load the SDL library */ if (SDL_Init(SDL_INIT_AUDIO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); return (1); } if (argv[1] == NULL) { argv[1] = "sample.wav"; } /* Load the wave file into memory */ if (SDL_LoadWAV(argv[1], &wave.spec, &wave.sound, &wave.soundlen) == NULL) { fprintf(stderr, "Couldn't load %s: %s\n", argv[1], SDL_GetError()); quit(1); } wave.spec.callback = fillerup; #if HAVE_SIGNAL_H /* Set the signals */ #ifdef SIGHUP signal(SIGHUP, poked); #endif signal(SIGINT, poked); #ifdef SIGQUIT signal(SIGQUIT, poked); #endif signal(SIGTERM, poked); #endif /* HAVE_SIGNAL_H */ /* Initialize fillerup() variables */ if (SDL_OpenAudio(&wave.spec, NULL) < 0) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); SDL_FreeWAV(wave.sound); quit(2); } SDL_PauseAudio(0); /* Let the audio run */ printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver()); while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING)) SDL_Delay(1000); /* Clean up on signal */ SDL_CloseAudio(); SDL_FreeWAV(wave.sound); SDL_Quit(); return (0); }