diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 1017509402f55d2b13537a77995f48dcd1588a6f..ad4cf27700502e7883c7e6d87d558f9036704b89 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -2357,7 +2357,8 @@ UINT WINAPI waveOutClose(HWAVEOUT hWaveOut)
 	return MMSYSERR_INVALHANDLE;
 
     dwRet = MMDRV_Close(wmld, WODM_CLOSE);
-    MMDRV_Free(hWaveOut, wmld);
+    if (dwRet != WAVERR_STILLPLAYING)
+	MMDRV_Free(hWaveOut, wmld);
 
     return dwRet;
 }
@@ -2706,7 +2707,8 @@ UINT WINAPI waveInClose(HWAVEIN hWaveIn)
 	return MMSYSERR_INVALHANDLE;
 
     dwRet = MMDRV_Message(wmld, WIDM_CLOSE, 0L, 0L, TRUE);
-    MMDRV_Free(hWaveIn, wmld);
+    if (dwRet != WAVERR_STILLPLAYING)
+	MMDRV_Free(hWaveIn, wmld);
     return dwRet;
 }