A bit more robust against wave???Open failures.

diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c
index de8aca1..5fe5886 100644
--- a/dlls/dsound/dsound_main.c
+++ b/dlls/dsound/dsound_main.c
@@ -1186,12 +1186,13 @@
 			IDsDriverBuffer_Release(primarybuf->hwbuf);
 			waveOutClose(dsb->dsound->hwo);
 			dsb->dsound->hwo = 0;
-			waveOutOpen(&(dsb->dsound->hwo), dsb->dsound->drvdesc.dnDevNode,
-				    &(primarybuf->wfx), (DWORD)DSOUND_callback, (DWORD)dsb->dsound,
-				    CALLBACK_FUNCTION | WAVE_DIRECTSOUND);
-			err = IDsDriver_CreateSoundBuffer(dsb->dsound->driver,&(dsb->wfx),dsb->dsbd.dwFlags,0,
-							  &(dsb->buflen),&(dsb->buffer),
-							  (LPVOID)&(dsb->hwbuf));
+			err = mmErr(waveOutOpen(&(dsb->dsound->hwo), dsb->dsound->drvdesc.dnDevNode,
+                                                &(primarybuf->wfx), (DWORD)DSOUND_callback, (DWORD)dsb->dsound,
+                                                CALLBACK_FUNCTION | WAVE_DIRECTSOUND));
+                        if (err == DS_OK)
+                            err = IDsDriver_CreateSoundBuffer(dsb->dsound->driver,&(dsb->wfx),dsb->dsbd.dwFlags,0,
+                                                              &(dsb->buflen),&(dsb->buffer),
+                                                              (LPVOID)&(dsb->hwbuf));
 		}
 	}
 	else
@@ -1253,10 +1254,11 @@
 		DSOUND_PrimaryClose(primarybuf);
 		waveOutClose(This->dsound->hwo);
 		This->dsound->hwo = 0;
-                waveOutOpen(&(This->dsound->hwo), This->dsound->drvdesc.dnDevNode,
-			    &(primarybuf->wfx), (DWORD)DSOUND_callback, (DWORD)This->dsound,
-			    CALLBACK_FUNCTION | WAVE_DIRECTSOUND);
-		DSOUND_PrimaryOpen(primarybuf);
+                err = mmErr(waveOutOpen(&(This->dsound->hwo), This->dsound->drvdesc.dnDevNode,
+                                        &(primarybuf->wfx), (DWORD)DSOUND_callback, (DWORD)This->dsound,
+                                        CALLBACK_FUNCTION | WAVE_DIRECTSOUND));
+                if (err == DS_OK)
+                    DSOUND_PrimaryOpen(primarybuf);
 	}
 	if (primarybuf->hwbuf) {
 		err = IDsDriverBuffer_SetFormat(primarybuf->hwbuf, &(primarybuf->wfx));
@@ -1269,13 +1271,14 @@
 			if (primarybuf->state == STATE_PLAYING) primarybuf->state = STATE_STARTING;
 			else if (primarybuf->state == STATE_STOPPING) primarybuf->state = STATE_STOPPED;
 		}
+                /* FIXME: should we set err back to DS_OK in all cases ? */
 	}
 	DSOUND_RecalcFormat(primarybuf);
 
 	LeaveCriticalSection(&(This->dsound->lock));
 	/* **** */
 
-	return DS_OK;
+	return err;
 }
 
 static HRESULT WINAPI IDirectSoundBufferImpl_SetVolume(