From d23e338e0933b26ec54a0dfa9d30e4842aec5978 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 13 Jan 2012 02:39:41 -0500 Subject: [PATCH] Don't do extra memory allocations if we're not going to end up converting the audio. Added a missing file close. --- mixer.c | 52 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/mixer.c b/mixer.c index 602d7a54..52977c2e 100644 --- a/mixer.c +++ b/mixer.c @@ -614,6 +614,9 @@ Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc) } if ( !loaded ) { free(chunk); + if ( freesrc ) { + SDL_RWclose(src); + } return(NULL); } @@ -623,31 +626,36 @@ Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc) #endif /* Build the audio converter and create conversion buffers */ - if ( SDL_BuildAudioCVT(&wavecvt, - wavespec.format, wavespec.channels, wavespec.freq, - mixer.format, mixer.channels, mixer.freq) < 0 ) { - SDL_FreeWAV(chunk->abuf); - free(chunk); - return(NULL); - } - samplesize = ((wavespec.format & 0xFF)/8)*wavespec.channels; - wavecvt.len = chunk->alen & ~(samplesize-1); - wavecvt.buf = (Uint8 *)calloc(1, wavecvt.len*wavecvt.len_mult); - if ( wavecvt.buf == NULL ) { - SDL_SetError("Out of memory"); + if ( wavespec.format != mixer.format || + wavespec.channels != mixer.channels || + wavespec.freq != mixer.freq ) { + if ( SDL_BuildAudioCVT(&wavecvt, + wavespec.format, wavespec.channels, wavespec.freq, + mixer.format, mixer.channels, mixer.freq) < 0 ) { + SDL_FreeWAV(chunk->abuf); + free(chunk); + return(NULL); + } + samplesize = ((wavespec.format & 0xFF)/8)*wavespec.channels; + wavecvt.len = chunk->alen & ~(samplesize-1); + wavecvt.buf = (Uint8 *)calloc(1, wavecvt.len*wavecvt.len_mult); + if ( wavecvt.buf == NULL ) { + SDL_SetError("Out of memory"); + SDL_FreeWAV(chunk->abuf); + free(chunk); + return(NULL); + } + memcpy(wavecvt.buf, chunk->abuf, chunk->alen); SDL_FreeWAV(chunk->abuf); - free(chunk); - return(NULL); - } - memcpy(wavecvt.buf, chunk->abuf, chunk->alen); - SDL_FreeWAV(chunk->abuf); - /* Run the audio converter */ - if ( SDL_ConvertAudio(&wavecvt) < 0 ) { - free(wavecvt.buf); - free(chunk); - return(NULL); + /* Run the audio converter */ + if ( SDL_ConvertAudio(&wavecvt) < 0 ) { + free(wavecvt.buf); + free(chunk); + return(NULL); + } } + chunk->allocated = 1; chunk->abuf = wavecvt.buf; chunk->alen = wavecvt.len_cvt;