winmm/tests: check_position shouldn't fails on valid responses

Peter Åstrand astrand at cendio.se
Fri Apr 18 04:11:16 CDT 2008


ChangeLog: Avoid spurious failures in check_position in Terminal Server 
environments and others. The wavemapper is known to miss a few bytes, so 
don't treat this as fatal. The waveOutGetPosition may return TIME_MIDI and 
TIME_TICKS, which our own helper time_to_bytes doesn't support. Avoid 
failing in this case. 


Index: wave.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/tests/wave.c,v
retrieving revision 1.67
diff -u -r1.67 wave.c
--- wave.c	29 Feb 2008 12:18:36 -0000	1.67
+++ wave.c	18 Apr 2008 09:00:45 -0000
@@ -437,12 +437,12 @@
                 (mmtime->u.smpte.sec) +
                 (mmtime->u.smpte.frame / 30.0)) * pwfx->nAvgBytesPerSec;
 
-    trace("FIXME: time_to_bytes() type not supported\n");
+    trace("FIXME: time_to_bytes() type %s not supported\n", wave_time_format(mmtime->wType));
     return -1;
 }
 
 static void check_position(int device, HWAVEOUT wout, DWORD bytes,
-                           LPWAVEFORMATEX pwfx )
+                           LPWAVEFORMATEX pwfx, BOOL wavemapper)
 {
     MMTIME mmtime;
     DWORD samples;
@@ -453,6 +453,11 @@
     samples=bytes/(pwfx->wBitsPerSample/8*pwfx->nChannels);
     duration=((double)samples)/pwfx->nSamplesPerSec;
 
+    /* The wavemapper on Windows Server 2003 is known to do short
+       writes; only fail if not using wavemapper. Also, the system is
+       allowed to return any time format, including TIME_MIDI, which
+       our time_to_bytes doesn't support. */
+
     mmtime.wType = TIME_BYTES;
     rc=waveOutGetPosition(wout, &mmtime, sizeof(mmtime));
     ok(rc==MMSYSERR_NOERROR,
@@ -461,7 +466,7 @@
         trace("waveOutGetPosition(%s): TIME_BYTES not supported, returned %s\n",
               dev_name(device),wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): returned %d bytes, "
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): returned %d bytes, "
        "should be %d\n", dev_name(device), returned, bytes);
 
     mmtime.wType = TIME_SAMPLES;
@@ -472,7 +477,7 @@
         trace("waveOutGetPosition(%s): TIME_SAMPLES not supported, "
               "returned %s\n",dev_name(device),wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): returned %d samples "
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): returned %d samples "
        "(%d bytes), should be %d (%d bytes)\n", dev_name(device),
        bytes_to_samples(returned, pwfx), returned,
        bytes_to_samples(bytes, pwfx), bytes);
@@ -485,7 +490,7 @@
         trace("waveOutGetPosition(%s): TIME_MS not supported, returned %s\n",
               dev_name(device), wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): returned %d ms, "
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): returned %d ms, "
        "(%d bytes), should be %d (%d bytes)\n", dev_name(device),
        bytes_to_ms(returned, pwfx), returned,
        bytes_to_ms(bytes, pwfx), bytes);
@@ -498,7 +503,7 @@
         trace("waveOutGetPosition(%s): TIME_SMPTE not supported, returned %s\n",
               dev_name(device),wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): SMPTE test failed\n",
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): SMPTE test failed\n",
        dev_name(device));
 
     mmtime.wType = TIME_MIDI;
@@ -509,7 +514,7 @@
         trace("waveOutGetPosition(%s): TIME_MIDI not supported, returned %s\n",
               dev_name(device),wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): MIDI test failed\n",
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): MIDI test failed\n",
        dev_name(device));
 
     mmtime.wType = TIME_TICKS;
@@ -520,7 +525,7 @@
         trace("waveOutGetPosition(%s): TIME_TICKS not supported, returned %s\n",
               dev_name(device),wave_time_format(mmtime.wType));
     returned = time_to_bytes(&mmtime, pwfx);
-    ok(returned == bytes, "waveOutGetPosition(%s): TICKS test failed\n",
+    ok(returned == bytes || wavemapper || returned == -1, "waveOutGetPosition(%s): TICKS test failed\n",
        dev_name(device));
 }
 
@@ -701,7 +706,7 @@
             trace("*** Warning the sound is muted, you will not hear the test\n");
 
         /* Check that the position is 0 at start */
-        check_position(device, wout, 0, pwfx);
+        check_position(device, wout, 0, pwfx, (flags & WAVE_MAPPED)|(device == WAVE_MAPPER));
 
         rc=waveOutSetVolume(wout,0x20002000);
         ok(has_volume ? rc==MMSYSERR_NOERROR : rc==MMSYSERR_NOTSUPPORTED,
@@ -771,7 +776,7 @@
                "WHDR_DONE WHDR_PREPARED expected, got %s\n",
                wave_header_flags(frags[i].dwFlags));
         }
-        check_position(device, wout, length * (loops + 1), pwfx);
+        check_position(device, wout, length * (loops + 1), pwfx, (flags & WAVE_MAPPED)|(device == WAVE_MAPPER));
     }
 
     for (i = 0; i < headers; i++) {


---
Peter Åstrand		ThinLinc Chief Developer
Cendio AB		http://www.cendio.se
Wallenbergs gata 4
583 30 Linköping	Phone: +46-13-21 46 00


More information about the wine-patches mailing list