From 4651b42009f63978793772fa444a6d98220af704 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 28 Oct 2006 07:44:38 +0000 Subject: [PATCH] Fix potential memory leaks if CoreAudio initialization fails. --- src/audio/macosx/SDL_coreaudio.c | 47 ++++++++++++++++++-------------- src/audio/macosx/SDL_coreaudio.h | 1 + 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/audio/macosx/SDL_coreaudio.c b/src/audio/macosx/SDL_coreaudio.c index 729aca00d..8db7254bd 100644 --- a/src/audio/macosx/SDL_coreaudio.c +++ b/src/audio/macosx/SDL_coreaudio.c @@ -315,26 +315,29 @@ static void COREAUDIO_CloseDevice(_THIS) { if (this->hidden != NULL) { - OSStatus result = noErr; - AURenderCallbackStruct callback; - const AudioUnitElement output_bus = 0; - const AudioUnitElement input_bus = 1; - const int iscapture = this->iscapture; - const AudioUnitElement bus = ((iscapture) ? input_bus : output_bus); - const AudioUnitScope scope = ((iscapture) ? kAudioUnitScope_Output : - kAudioUnitScope_Input); - - /* stop processing the audio unit */ - result = AudioOutputUnitStop(this->hidden->audioUnit); - - /* Remove the input callback */ - SDL_memset(&callback, '\0', sizeof (AURenderCallbackStruct)); - result = AudioUnitSetProperty(this->hidden->audioUnit, - kAudioUnitProperty_SetRenderCallback, - scope, bus, &callback, sizeof (callback)); - - CloseComponent(this->hidden->audioUnit); - + if (this->hidden->audioUnitOpened) { + OSStatus result = noErr; + AURenderCallbackStruct callback; + const AudioUnitElement output_bus = 0; + const AudioUnitElement input_bus = 1; + const int iscapture = this->iscapture; + const AudioUnitElement bus = ((iscapture) ? input_bus : output_bus); + const AudioUnitScope scope = ((iscapture) ? kAudioUnitScope_Output : + kAudioUnitScope_Input); + + /* stop processing the audio unit */ + result = AudioOutputUnitStop(this->hidden->audioUnit); + + /* Remove the input callback */ + SDL_memset(&callback, '\0', sizeof (AURenderCallbackStruct)); + result = AudioUnitSetProperty(this->hidden->audioUnit, + kAudioUnitProperty_SetRenderCallback, + scope, bus, &callback, + sizeof (callback)); + + CloseComponent(this->hidden->audioUnit); + this->hidden->audioUnitOpened = 0; + } SDL_free(this->hidden->buffer); SDL_free(this->hidden); this->hidden = NULL; @@ -435,6 +438,8 @@ prepare_audiounit(_THIS, const char *devname, int iscapture, result = OpenAComponent(comp, &this->hidden->audioUnit); CHECK_RESULT("OpenAComponent"); + this->hidden->audioUnitOpened = 1; + // !!! FIXME: this is wrong? enableIO = ((iscapture) ? 1 : 0); result = AudioUnitSetProperty(this->hidden->audioUnit, @@ -544,6 +549,7 @@ COREAUDIO_OpenDevice(_THIS, const char *devname, int iscapture) } if (!valid_datatype) { /* shouldn't happen, but just in case... */ + COREAUDIO_CloseDevice(this); SDL_SetError("Unsupported audio format"); return 0; } @@ -554,6 +560,7 @@ COREAUDIO_OpenDevice(_THIS, const char *devname, int iscapture) strdesc.mBytesPerFrame * strdesc.mFramesPerPacket; if (!prepare_audiounit(this, devname, iscapture, &strdesc)) { + COREAUDIO_CloseDevice(this); \ return 0; /* prepare_audiounit() will call SDL_SetError()... */ } diff --git a/src/audio/macosx/SDL_coreaudio.h b/src/audio/macosx/SDL_coreaudio.h index 25aa9c217..e06411d98 100644 --- a/src/audio/macosx/SDL_coreaudio.h +++ b/src/audio/macosx/SDL_coreaudio.h @@ -32,6 +32,7 @@ struct SDL_PrivateAudioData { AudioUnit audioUnit; + int audioUnitInitialized; void *buffer; UInt32 bufferOffset; UInt32 bufferSize;