[WINMM] wave in prepare/unprepare header

Robert Reif reif at earthlink.net
Tue Mar 15 17:50:15 CST 2005


Provide default implementation of waveInPrepareHeader and
waveInUnprepareHeader if driver doesn't support them.
-------------- next part --------------
Index: dlls/winmm/winmm.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.50
diff -u -p -r1.50 winmm.c
--- dlls/winmm/winmm.c	15 Mar 2005 15:38:34 -0000	1.50
+++ dlls/winmm/winmm.c	15 Mar 2005 23:46:07 -0000
@@ -2584,6 +2584,7 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN 
 				UINT uSize)
 {
     LPWINE_MLD		wmld;
+    UINT                result;
 
     TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);
 
@@ -2593,9 +2594,18 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN 
     if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL)
 	return MMSYSERR_INVALHANDLE;
 
+    if ((result = MMDRV_Message(wmld, WIDM_PREPARE, (DWORD_PTR)lpWaveInHdr,
+                                uSize, TRUE)) != MMSYSERR_NOTSUPPORTED)
+        return result;
+
+    if (lpWaveInHdr->dwFlags & WHDR_INQUEUE)
+        return WAVERR_STILLPLAYING;
+
+    lpWaveInHdr->dwFlags |= WHDR_PREPARED;
+    lpWaveInHdr->dwFlags &= ~WHDR_DONE;
     lpWaveInHdr->dwBytesRecorded = 0;
 
-    return MMDRV_Message(wmld, WIDM_PREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE);
+    return MMSYSERR_NOERROR;
 }
 
 /**************************************************************************
@@ -2605,20 +2615,30 @@ UINT WINAPI waveInUnprepareHeader(HWAVEI
 				  UINT uSize)
 {
     LPWINE_MLD		wmld;
+    UINT                result;
 
     TRACE("(%p, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);
 
     if (lpWaveInHdr == NULL || uSize < sizeof (WAVEHDR))
 	return MMSYSERR_INVALPARAM;
 
-    if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED)) {
+    if (!(lpWaveInHdr->dwFlags & WHDR_PREPARED))
 	return MMSYSERR_NOERROR;
-    }
 
     if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL)
 	return MMSYSERR_INVALHANDLE;
 
-    return MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD_PTR)lpWaveInHdr, uSize, TRUE);
+    if ((result = MMDRV_Message(wmld, WIDM_UNPREPARE, (DWORD_PTR)lpWaveInHdr,
+                                uSize, TRUE)) != MMSYSERR_NOTSUPPORTED)
+        return result;
+
+    if (lpWaveInHdr->dwFlags & WHDR_INQUEUE)
+        return WAVERR_STILLPLAYING;
+
+    lpWaveInHdr->dwFlags &= ~WHDR_PREPARED;
+    lpWaveInHdr->dwFlags |= WHDR_DONE;
+
+    return MMSYSERR_NOERROR;
 }
 
 /**************************************************************************


More information about the wine-patches mailing list