diff --git a/src/audio/macosx/SDL_coreaudio.c b/src/audio/macosx/SDL_coreaudio.c index 729aca00d187daff01f75ba2a228042c7158cd02..8db7254bd7bf7f90ee6369353a09078cbbdab627 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 25aa9c21736df7302bcc9a59ca6d5ce770c31a91..e06411d98c4b7f7b1b7b4bf52ad09cfae1d47f34 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;