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;