Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix potential memory leaks if CoreAudio initialization fails.
  • Loading branch information
icculus committed Oct 28, 2006
1 parent fb85a39 commit 4651b42
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 20 deletions.
47 changes: 27 additions & 20 deletions src/audio/macosx/SDL_coreaudio.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}
Expand All @@ -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()... */
}

Expand Down
1 change: 1 addition & 0 deletions src/audio/macosx/SDL_coreaudio.h
Expand Up @@ -32,6 +32,7 @@
struct SDL_PrivateAudioData
{
AudioUnit audioUnit;
int audioUnitInitialized;
void *buffer;
UInt32 bufferOffset;
UInt32 bufferSize;
Expand Down

0 comments on commit 4651b42

Please sign in to comment.