=?UTF-8?Q?J=C3=B6rg=20H=C3=B6hle=20?=: winmm: More compatible waveIn/Out[Un ]Prepare WHDR_* flag handling.

Alexandre Julliard julliard at winehq.org
Wed Feb 13 13:54:29 CST 2013


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

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sun Jan 27 10:43:43 2013 +0100

winmm: More compatible waveIn/Out[Un]Prepare WHDR_* flag handling.

---

 dlls/winmm/tests/wave.c |   23 +++++++++++++++++++++++
 dlls/winmm/waveform.c   |   23 +++++++++++------------
 2 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c
index 97849f5..9e59e2f 100644
--- a/dlls/winmm/tests/wave.c
+++ b/dlls/winmm/tests/wave.c
@@ -809,6 +809,29 @@ static void wave_out_test_deviceOut(int device, double duration,
            "waveOutUnprepareHeader(%s): rc=%s\n",dev_name(device),
            wave_out_error(rc));
     }
+
+    ok(frags[0].dwFlags==(interactive ? WHDR_DONE : 0), "dwFlags(%d)=%x\n",device,frags[0].dwFlags);
+
+    frags[0].dwFlags |= WHDR_DONE;
+    rc=waveOutUnprepareHeader(wout, &frags[0], sizeof(frags[0]));
+    ok(rc==MMSYSERR_NOERROR, "waveOutUnprepareHeader(%d): rc=%s\n",device,wave_out_error(rc));
+    ok(frags[0].dwFlags==WHDR_DONE, "dwFlags(%d)=%x\n",device,frags[0].dwFlags);
+
+    frags[0].dwFlags |= WHDR_INQUEUE;
+    rc=waveOutPrepareHeader(wout, &frags[0], sizeof(frags[0]));
+    ok(rc==MMSYSERR_NOERROR, "waveOutPrepareHeader(%d): rc=%s\n",device,wave_out_error(rc));
+    ok(frags[0].dwFlags==WHDR_PREPARED, "dwFlags(%d)=%x\n",device,frags[0].dwFlags);
+
+    frags[0].dwFlags |= WHDR_INQUEUE;
+    rc=waveOutPrepareHeader(wout, &frags[0], sizeof(frags[0]));
+    ok(rc==MMSYSERR_NOERROR, "waveOutPrepareHeader(%d): rc=%s\n",device,wave_out_error(rc));
+    ok(frags[0].dwFlags==(WHDR_PREPARED|WHDR_INQUEUE), "dwFlags(%d)=%x\n",device,frags[0].dwFlags);
+
+    frags[0].dwFlags &= ~(WHDR_INQUEUE|WHDR_DONE);
+    rc=waveOutUnprepareHeader(wout, &frags[0], sizeof(frags[0]));
+    ok(rc==MMSYSERR_NOERROR, "waveOutUnprepareHeader(%d): rc=%s\n",device,wave_out_error(rc));
+    ok(frags[0].dwFlags==0, "dwFlags(%d)=%x\n",device,frags[0].dwFlags);
+
     rc=waveOutClose(wout);
     ok(rc==MMSYSERR_NOERROR,"waveOutClose(%s): rc=%s\n",dev_name(device),
        wave_out_error(rc));
diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c
index e6fe360..a5ffbc0 100644
--- a/dlls/winmm/waveform.c
+++ b/dlls/winmm/waveform.c
@@ -1517,7 +1517,7 @@ static LRESULT WINMM_PrepareHeader(HWAVE hwave, WAVEHDR *header)
     LeaveCriticalSection(&device->lock);
 
     header->dwFlags |= WHDR_PREPARED;
-    header->dwFlags &= ~WHDR_DONE;
+    header->dwFlags &= ~(WHDR_DONE|WHDR_INQUEUE); /* flags cleared since w2k */
 
     return MMSYSERR_NOERROR;
 }
@@ -1542,7 +1542,6 @@ static LRESULT WINMM_UnprepareHeader(HWAVE hwave, WAVEHDR *header)
     LeaveCriticalSection(&device->lock);
 
     header->dwFlags &= ~WHDR_PREPARED;
-    header->dwFlags |= WHDR_DONE;
 
     return MMSYSERR_NOERROR;
 }
@@ -2782,8 +2781,8 @@ UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut,
     if(!lpWaveOutHdr || uSize < sizeof(WAVEHDR))
         return MMSYSERR_INVALPARAM;
 
-    if(lpWaveOutHdr->dwFlags & WHDR_INQUEUE)
-        return WAVERR_STILLPLAYING;
+    if(lpWaveOutHdr->dwFlags & WHDR_PREPARED)
+        return MMSYSERR_NOERROR;
 
     return WINMM_PrepareHeader((HWAVE)hWaveOut, lpWaveOutHdr);
 }
@@ -2798,13 +2797,13 @@ UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut,
 
     if(!lpWaveOutHdr || uSize < sizeof(WAVEHDR))
         return MMSYSERR_INVALPARAM;
-    
-    if(!(lpWaveOutHdr->dwFlags & WHDR_PREPARED))
-        return MMSYSERR_NOERROR;
 
     if(lpWaveOutHdr->dwFlags & WHDR_INQUEUE)
         return WAVERR_STILLPLAYING;
 
+    if(!(lpWaveOutHdr->dwFlags & WHDR_PREPARED))
+        return MMSYSERR_NOERROR;
+
     return WINMM_UnprepareHeader((HWAVE)hWaveOut, lpWaveOutHdr);
 }
 
@@ -3412,8 +3411,8 @@ UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr,
     if(!lpWaveInHdr || uSize < sizeof(WAVEHDR))
         return MMSYSERR_INVALPARAM;
 
-    if(lpWaveInHdr->dwFlags & WHDR_INQUEUE)
-        return WAVERR_STILLPLAYING;
+    if(lpWaveInHdr->dwFlags & WHDR_PREPARED)
+        return MMSYSERR_NOERROR;
 
     return WINMM_PrepareHeader((HWAVE)hWaveIn, lpWaveInHdr);
 }
@@ -3429,12 +3428,12 @@ UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR* lpWaveInHdr,
     if(!lpWaveInHdr || uSize < sizeof(WAVEHDR))
         return MMSYSERR_INVALPARAM;
 
-    if(!(lpWaveInHdr->dwFlags & WHDR_PREPARED))
-        return MMSYSERR_NOERROR;
-
     if(lpWaveInHdr->dwFlags & WHDR_INQUEUE)
         return WAVERR_STILLPLAYING;
 
+    if(!(lpWaveInHdr->dwFlags & WHDR_PREPARED))
+        return MMSYSERR_NOERROR;
+
     return WINMM_UnprepareHeader((HWAVE)hWaveIn, lpWaveInHdr);
 }
 




More information about the wine-cvs mailing list