Date: Tue, 01 Feb 2005 17:53:07 -0800
authorSam Lantinga <slouken@libsdl.org>
Sat, 12 Feb 2005 19:39:08 +0000
changeset 1037 c5dedfdb4e42
parent 1036 50f4e7e4d117
child 1038 29d7db09776e
Date: Tue, 01 Feb 2005 17:53:07 -0800 From: Bill May Subject: [SDL] Diffs for dsp audio in case of failures. The rewrite recently done for 1.2.8 forgot to handle error cases by closing the audio. Here is a patch that does.
src/audio/dsp/SDL_dspaudio.c
--- a/src/audio/dsp/SDL_dspaudio.c	Sat Feb 12 18:03:54 2005 +0000
+++ b/src/audio/dsp/SDL_dspaudio.c	Sat Feb 12 19:39:08 2005 +0000
@@ -187,6 +187,7 @@
 		flags &= ~O_NONBLOCK;
 		if ( fcntl(audio_fd, F_SETFL, flags) < 0 ) {
 			SDL_SetError("Couldn't set audio blocking mode");
+			DSP_CloseAudio(this);
 			return(-1);
 		}
 	}
@@ -195,6 +196,7 @@
 	if ( ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &value) < 0 ) {
 		perror("SNDCTL_DSP_GETFMTS");
 		SDL_SetError("Couldn't get audio format list");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 
@@ -252,6 +254,7 @@
 	}
 	if ( format == 0 ) {
 		SDL_SetError("Couldn't find any hardware audio formats");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 	spec->format = test_format;
@@ -262,6 +265,7 @@
 						(value != format) ) {
 		perror("SNDCTL_DSP_SETFMT");
 		SDL_SetError("Couldn't set audio format");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 
@@ -270,6 +274,7 @@
 	if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &value) < 0 ) {
 		perror("SNDCTL_DSP_CHANNELS");
 		SDL_SetError("Cannot set the number of channels");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 	spec->channels = value;
@@ -279,6 +284,7 @@
 	if ( ioctl(audio_fd, SNDCTL_DSP_SPEED, &value) < 0 ) {
 		perror("SNDCTL_DSP_SPEED");
 		SDL_SetError("Couldn't set audio frequency");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 	spec->freq = value;
@@ -290,6 +296,7 @@
 	for ( frag_spec = 0; (0x01<<frag_spec) < spec->size; ++frag_spec );
 	if ( (0x01<<frag_spec) != spec->size ) {
 		SDL_SetError("Fragment size must be a power of two");
+		DSP_CloseAudio(this);
 		return(-1);
 	}
 	frag_spec |= 0x00020000;	/* two fragments, for low latency */
@@ -317,6 +324,7 @@
 	mixlen = spec->size;
 	mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen);
 	if ( mixbuf == NULL ) {
+	  DSP_CloseAudio(this);
 		return(-1);
 	}
 	memset(mixbuf, spec->silence, spec->size);