Mercurial > SDL_sound_CoreAudio
diff playsound/playsound.c @ 58:4a51162099e0
Renamed from test/test_sdlsound.c ... lots of other updates, too.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Mon, 24 Sep 2001 15:28:32 +0000 |
parents | |
children | 7505dcf8d3b7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/playsound/playsound.c Mon Sep 24 15:28:32 2001 +0000 @@ -0,0 +1,260 @@ +/* + * SDL_sound -- An abstract sound format decoding API. + * Copyright (C) 2001 Ryan C. Gordon. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * This is a quick and dirty test of SDL_sound. + * + * Please see the file LICENSE in the source's root directory. + * + * This file written by Ryan C. Gordon. (icculus@clutteredmind.org) + */ + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include "SDL.h" +#include "SDL_sound.h" + +#define PLAYSOUND_VER_MAJOR 0 +#define PLAYSOUND_VER_MINOR 1 +#define PLAYSOUND_VER_PATCH 1 + + +static void output_versions(const char *argv0) +{ + Sound_Version compiled; + Sound_Version linked; + SDL_version sdl_compiled; + const SDL_version *sdl_linked; + + SOUND_VERSION(&compiled); + Sound_GetLinkedVersion(&linked); + SDL_VERSION(&sdl_compiled); + sdl_linked = SDL_Linked_Version(); + + fprintf(stderr, + "%s version %d.%d.%d.\n" + " Compiled against SDL_sound version %d.%d.%d,\n" + " and linked against %d.%d.%d.\n" + " Compiled against SDL version %d.%d.%d,\n" + " and linked against %d.%d.%d.\n\n", + argv0, + PLAYSOUND_VER_MAJOR, PLAYSOUND_VER_MINOR, PLAYSOUND_VER_PATCH, + compiled.major, compiled.minor, compiled.patch, + linked.major, linked.minor, linked.patch, + sdl_compiled.major, sdl_compiled.minor, sdl_compiled.patch, + sdl_linked->major, sdl_linked->minor, sdl_linked->patch); +} /* output_versions */ + + +static void output_decoders(void) +{ + const Sound_DecoderInfo **rc = Sound_AvailableDecoders(); + const Sound_DecoderInfo **i; + + fprintf(stderr, "Supported sound formats:\n"); + if (rc == NULL) + fprintf(stderr, " * Apparently, NONE!\n"); + else + { + for (i = rc; *i != NULL; i++) + { + fprintf(stderr, " * %s: %s\n Written by %s.\n %s\n", + (*i)->extension, (*i)->description, + (*i)->author, (*i)->url); + } /* for */ + } /* else */ + + fprintf(stderr, "\n"); +} /* output_decoders */ + + +static volatile int done_flag = 0; + +static void audio_callback(void *userdata, Uint8 *stream, int len) +{ + static Uint8 overflow[16384]; /* this is a hack. */ + static Uint32 overflowBytes = 0; + Sound_Sample *sample = *((Sound_Sample **) userdata); + Uint32 bw = 0; /* bytes written to stream*/ + Uint32 rc; /* return code */ + + if (overflowBytes > 0) + { + bw = (overflowBytes < len) ? overflowBytes : len; + memcpy(stream, overflow, bw); + overflowBytes -= bw; + } /* if */ + + while ((bw < len) && (!done_flag)) + { + rc = Sound_Decode(sample); + if (rc > 0) + { + if (bw + rc > len) + { + overflowBytes = (bw + rc) - len; + memcpy(overflow, + ((Uint8 *) sample->buffer) + (rc - overflowBytes), + overflowBytes); + rc -= overflowBytes; + } /* if */ + + memcpy(stream + bw, sample->buffer, rc); + bw += rc; + } /* if */ + + if (sample->flags & SOUND_SAMPLEFLAG_EOF) + done_flag = 1; + + else if (sample->flags & SOUND_SAMPLEFLAG_ERROR) + { + fprintf(stderr, "Error condition in decoding!\n" + " problem: [%s].\n", Sound_GetError()); + done_flag = 1; + } /* else if */ + } /* while */ + + assert(bw <= len); + + if (bw < len) + memset(stream + bw, '\0', len - bw); +} /* audio_callback */ + + +static void output_usage(const char *argv0) +{ + fprintf(stderr, "USAGE: %s <soundFile1> [soundFile2] ... [soundFileN]\n", + argv0); +} /* output_usage */ + + +int main(int argc, char **argv) +{ + Sound_AudioInfo sound_desired; + SDL_AudioSpec sdl_desired; + Sound_Sample *sample; + int i; + + if (argc < 2) + { + output_usage(argv[0]); + return(42); + } /* if */ + + for (i = 0; i < argc; i++) + { + if (strncmp(argv[i], "--", 2) != 0) + continue; + + if ( (strcmp(argv[i], "--version") == 0) || + (strcmp(argv[i], "--help") == 0 ) ) + { + output_versions(argv[0]); + output_usage(argv[0]); + } /* if */ + + else if (strcmp(argv[i], "--decoders") == 0) + { + if (!Sound_Init()) + { + fprintf(stderr, "Sound_Init() failed!\n" + " reason: [%s].\n", Sound_GetError()); + SDL_Quit(); + return(42); + } /* if */ + + output_decoders(); + Sound_Quit(); + return(0); + } /* else if */ + + else + { + fprintf(stderr, "unknown option: \"%s\"\n", argv[i]); + return(42); + } /* else */ + } /* for */ + + if (SDL_Init(SDL_INIT_AUDIO) == -1) + { + fprintf(stderr, "SDL_Init(SDL_INIT_AUDIO) failed!\n" + " reason: [%s].\n", SDL_GetError()); + return(42); + } /* if */ + + if (!Sound_Init()) + { + fprintf(stderr, "Sound_Init() failed!\n" + " reason: [%s].\n", Sound_GetError()); + SDL_Quit(); + return(42); + } /* if */ + + sound_desired.rate = 44100; + sound_desired.channels = 2; + sound_desired.format = AUDIO_S16SYS; + + sdl_desired.freq = 44100; + sdl_desired.format = AUDIO_S16SYS; + sdl_desired.channels = 2; + sdl_desired.samples = 4096; + sdl_desired.callback = audio_callback; + sdl_desired.userdata = &sample; + + if ( SDL_OpenAudio(&sdl_desired, NULL) < 0 ) + { + fprintf(stderr, "Couldn't open audio device!\n" + " reason: [%s].\n", SDL_GetError()); + Sound_Quit(); + SDL_Quit(); + return(42); + } /* if */ + + for (i = 1; i < argc; i++) + { + if (strncmp(argv[i], "--", 2) == 0) + continue; + + printf("Now playing [%s]...\n", argv[i]); + + sample = Sound_NewSampleFromFile(argv[i], &sound_desired, 4096 * 4); + if (!sample) + { + fprintf(stderr, "Couldn't load \"%s\"!\n" + " reason: [%s].\n", argv[i], Sound_GetError()); + continue; + } /* if */ + + done_flag = 0; + SDL_PauseAudio(0); + while (!done_flag) + SDL_Delay(10); + SDL_PauseAudio(1); + + Sound_FreeSample(sample); + } /* for */ + + Sound_Quit(); + SDL_Quit(); + return(0); +} /* main */ + +/* end of playsound.c ... */ +