Mercurial > sdl-ios-xcode
diff src/audio/disk/SDL_diskaudio.c @ 1465:8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Converted the disk audio driver to SDL_RWops for portability
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 04 Mar 2006 08:24:35 +0000 |
parents | d910939febfa |
children | 84535f702874 |
line wrap: on
line diff
--- a/src/audio/disk/SDL_diskaudio.c Sat Mar 04 05:13:03 2006 +0000 +++ b/src/audio/disk/SDL_diskaudio.c Sat Mar 04 08:24:35 2006 +0000 @@ -26,16 +26,11 @@ /* Output raw audio data to a file. */ +#if HAVE_STDIO_H #include <stdio.h> -#include <string.h> /* For strerror() */ -#include <errno.h> -#include <unistd.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> +#endif - +#include "SDL_rwops.h" #include "SDL_timer.h" #include "SDL_audio.h" #include "../SDL_audiomem.h" @@ -61,44 +56,18 @@ static const char *DISKAUD_GetOutputFilename(void) { - const char *envr = SDL_getenv(DISKENVR_OUTFILE); - return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE); + const char *envr = SDL_getenv(DISKENVR_OUTFILE); + return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE); } /* Audio driver bootstrap functions */ static int DISKAUD_Available(void) { -#if 0 - int fd; - int available; - int exists = 0; - struct stat statbuf; - const char *fname = DISKAUD_GetOutputFilename(); const char *envr = SDL_getenv("SDL_AUDIODRIVER"); - available = 0; - - if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) { - if (stat(fname, &statbuf) == 0) - exists = 1; - - fd = open(fname, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); - if ( fd != -1 ) { - available = 1; - close(fd); - if (!exists) { - unlink(fname); - } - } - } - return(available); -#else - const char *envr = SDL_getenv("SDL_AUDIODRIVER"); - if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) { + if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) { return(1); } - return(0); -#endif } static void DISKAUD_DeleteDevice(SDL_AudioDevice *device) @@ -110,7 +79,7 @@ static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex) { SDL_AudioDevice *this; - const char *envr; + const char *envr; /* Initialize all variables that we clean on shutdown */ this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); @@ -128,8 +97,8 @@ } SDL_memset(this->hidden, 0, (sizeof *this->hidden)); - envr = SDL_getenv(DISKENVR_WRITEDELAY); - this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY; + envr = SDL_getenv(DISKENVR_WRITEDELAY); + this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY; /* Set the function pointers */ this->OpenAudio = DISKAUD_OpenAudio; @@ -151,26 +120,20 @@ /* This function waits until it is possible to write a full sound buffer */ static void DISKAUD_WaitAudio(_THIS) { - SDL_Delay(this->hidden->write_delay); + SDL_Delay(this->hidden->write_delay); } static void DISKAUD_PlayAudio(_THIS) { int written; - /* Write the audio data, checking for EAGAIN on broken audio drivers */ - do { - written = write(this->hidden->audio_fd, - this->hidden->mixbuf, + /* Write the audio data */ + written = SDL_RWwrite(this->hidden->output, + this->hidden->mixbuf, 1, this->hidden->mixlen); - if ( (written < 0) && ((errno == 0) || (errno == EAGAIN)) ) { - SDL_Delay(1); /* Let a little CPU time go by */ - } - } while ( (written < 0) && - ((errno == 0) || (errno == EAGAIN) || (errno == EINTR)) ); /* If we couldn't write, assume fatal error for now */ - if ( written < 0 ) { + if ( written != this->hidden->mixlen ) { this->enabled = 0; } #ifdef DEBUG_AUDIO @@ -189,25 +152,26 @@ SDL_FreeAudioMem(this->hidden->mixbuf); this->hidden->mixbuf = NULL; } - if ( this->hidden->audio_fd >= 0 ) { - close(this->hidden->audio_fd); - this->hidden->audio_fd = -1; + if ( this->hidden->output != NULL ) { + SDL_RWclose(this->hidden->output); + this->hidden->output = NULL; } } static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec) { - const char *fname = DISKAUD_GetOutputFilename(); + const char *fname = DISKAUD_GetOutputFilename(); /* Open the audio device */ - this->hidden->audio_fd = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); - if ( this->hidden->audio_fd < 0 ) { - SDL_SetError("Couldn't open %s: %s", fname, strerror(errno)); + this->hidden->output = SDL_RWFromFile(fname, "wb"); + if ( this->hidden->output == NULL ) { return(-1); } - fprintf(stderr, "WARNING: You are using the SDL disk writer" +#if HAVE_STDIO_H + fprintf(stderr, "WARNING: You are using the SDL disk writer" " audio driver!\n Writing to file [%s].\n", fname); +#endif /* Allocate mixing buffer */ this->hidden->mixlen = spec->size;