# HG changeset patch # User Sam Lantinga # Date 1108237148 0 # Node ID c5dedfdb4e42739e06697f3ccc325259e6e3da04 # Parent 50f4e7e4d117961f510d5c033f6676e98caf60b4 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. diff -r 50f4e7e4d117 -r c5dedfdb4e42 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<size; ++frag_spec ); if ( (0x01<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);