Jörg Höhle : mciwave: Do not lie about state when winmm fails in Pause or Resume.

Alexandre Julliard julliard at winehq.org
Mon Oct 26 10:08:37 CDT 2009


Module: wine
Branch: master
Commit: 3c6496d7b5ec76a722c9f2d7bf3d965d15461c6a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c6496d7b5ec76a722c9f2d7bf3d965d15461c6a

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sat Oct 17 21:30:33 2009 +0200

mciwave: Do not lie about state when winmm fails in Pause or Resume.

---

 dlls/mciwave/mciwave.c |   33 +++++++++++++++++++++++++--------
 1 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/dlls/mciwave/mciwave.c b/dlls/mciwave/mciwave.c
index a0415bd..664cc44 100644
--- a/dlls/mciwave/mciwave.c
+++ b/dlls/mciwave/mciwave.c
@@ -1134,20 +1134,28 @@ static DWORD WAVE_mciPause(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_GENERIC_PARM
 
     switch (wmw->dwStatus) {
     case MCI_MODE_PLAY:
-	wmw->dwStatus = MCI_MODE_PAUSE;
 	dwRet = waveOutPause(wmw->hWave);
+	if (dwRet==MMSYSERR_NOERROR) wmw->dwStatus = MCI_MODE_PAUSE;
+	else { /* When playthread was not started yet, winmm not opened, error 5 MMSYSERR_INVALHANDLE */
+	    ERR("waveOutPause error %d\n",dwRet);
+	    dwRet = MCIERR_INTERNAL;
+	}
 	break;
     case MCI_MODE_RECORD:
-	wmw->dwStatus = MCI_MODE_PAUSE;
 	dwRet = waveInStop(wmw->hWave);
+	if (dwRet==MMSYSERR_NOERROR) wmw->dwStatus = MCI_MODE_PAUSE;
+	else {
+	    ERR("waveInStop error %d\n",dwRet);
+	    dwRet = MCIERR_INTERNAL;
+	}
 	break;
     case MCI_MODE_PAUSE:
 	dwRet = MMSYSERR_NOERROR;
 	break;
     default:
-	return MCIERR_NONAPPLICABLE_FUNCTION;
+	dwRet = MCIERR_NONAPPLICABLE_FUNCTION;
     }
-    return (dwRet == MMSYSERR_NOERROR) ? 0 : MCIERR_INTERNAL;
+    return dwRet;
 }
 
 /**************************************************************************
@@ -1164,12 +1172,21 @@ static DWORD WAVE_mciResume(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_GENERIC_PAR
 
     switch (wmw->dwStatus) {
     case MCI_MODE_PAUSE:
+	/* Only update dwStatus if wave* succeeds and will exchange buffers buffers. */
 	if (wmw->fInput) {
-	    wmw->dwStatus = MCI_MODE_RECORD;
 	    dwRet = waveInStart(wmw->hWave);
+	    if (dwRet==MMSYSERR_NOERROR) wmw->dwStatus = MCI_MODE_RECORD;
+	    else {
+		ERR("waveInStart error %d\n",dwRet);
+		dwRet = MCIERR_INTERNAL;
+	    }
 	} else {
-	    wmw->dwStatus = MCI_MODE_PLAY;
 	    dwRet = waveOutRestart(wmw->hWave);
+	    if (dwRet==MMSYSERR_NOERROR) wmw->dwStatus = MCI_MODE_PLAY;
+	    else {
+		ERR("waveOutRestart error %d\n",dwRet);
+		dwRet = MCIERR_INTERNAL;
+	    }
 	}
 	break;
     case MCI_MODE_PLAY:
@@ -1177,9 +1194,9 @@ static DWORD WAVE_mciResume(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_GENERIC_PAR
 	dwRet = MMSYSERR_NOERROR;
 	break;
     default:
-	return MCIERR_NONAPPLICABLE_FUNCTION;
+	dwRet = MCIERR_NONAPPLICABLE_FUNCTION;
     }
-    return (dwRet == MMSYSERR_NOERROR) ? 0 : MCIERR_INTERNAL;
+    return dwRet;
 }
 
 /**************************************************************************




More information about the wine-cvs mailing list