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;