From 68e7ae2575b1d50f5fba051e14525c5bf06f0224 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?J=C3=B6rg=20H=C3=B6hle?= Date: Sat, 17 Oct 2009 21:30:33 +0200 Subject: [PATCH] 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; } /************************************************************************** -- 1.5.6.3