winmm waveOutGetPosition test

Robert Reif reif at earthlink.net
Mon May 31 17:56:59 CDT 2004


Adds a test to check playback position after done playing.

This test is only executed in interactive mode.  It shows two
bugs in wine:  position in ms is not calculated accurately and
the wavemap device doesn't always calculate position in samples
properly.
-------------- next part --------------
Index: dlls/winmm/tests/wave.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/tests/wave.c,v
retrieving revision 1.26
diff -u -r1.26 wave.c
--- dlls/winmm/tests/wave.c	27 May 2004 20:00:26 -0000	1.26
+++ dlls/winmm/tests/wave.c	31 May 2004 22:48:54 -0000
@@ -185,6 +185,55 @@
 #undef ADD_FLAG
 }
 
+static void check_position(int device, HWAVEOUT wout, double duration, LPWAVEFORMATEX pwfx)
+{
+    MMTIME mmtime;
+    MMRESULT rc;
+
+    mmtime.wType = TIME_BYTES;
+    rc=waveOutGetPosition(wout, &mmtime, sizeof(mmtime));
+    ok(rc==MMSYSERR_NOERROR,
+       "waveOutGetPosition: device=%d rc=%s\n",device,wave_out_error(rc));
+    if (mmtime.wType == TIME_BYTES)
+        ok(mmtime.u.cb==duration*pwfx->nAvgBytesPerSec,
+           "waveOutGetPosition returned %ld bytes, should be %ld\n",
+           mmtime.u.cb, (DWORD)(duration*pwfx->nAvgBytesPerSec));
+
+    mmtime.wType = TIME_SAMPLES;
+    rc=waveOutGetPosition(wout, &mmtime, sizeof(mmtime));
+    ok(rc==MMSYSERR_NOERROR,
+       "waveOutGetPosition: device=%d rc=%s\n",device,wave_out_error(rc));
+    if (mmtime.wType == TIME_SAMPLES)
+        ok(mmtime.u.sample==duration*pwfx->nSamplesPerSec,
+           "waveOutGetPosition returned %ld samples, should be %ld\n",
+           mmtime.u.sample, (DWORD)(duration*pwfx->nSamplesPerSec));
+
+    mmtime.wType = TIME_MS;
+    rc=waveOutGetPosition(wout, &mmtime, sizeof(mmtime));
+    ok(rc==MMSYSERR_NOERROR,
+       "waveOutGetPosition: device=%d rc=%s\n",device,wave_out_error(rc));
+    if (mmtime.wType == TIME_MS)
+        ok(mmtime.u.ms==(DWORD)(duration*1000),
+           "waveOutGetPosition returned %ld ms, should be %ld\n",
+           mmtime.u.ms, (DWORD)(duration*1000));
+
+    mmtime.wType = TIME_SMPTE;
+    rc=waveOutGetPosition(wout, &mmtime, sizeof(mmtime));
+    ok(rc==MMSYSERR_NOERROR,
+       "waveOutGetPosition: device=%d rc=%s\n",device,wave_out_error(rc));
+    if (mmtime.wType == TIME_SMPTE)
+        ok(mmtime.u.smpte.hour==(BYTE)(floor(duration/(60*60))) &&
+           mmtime.u.smpte.min==(BYTE)(fmod(floor(duration/60), 60)) &&
+           mmtime.u.smpte.sec==(BYTE)(fmod(duration,60)) &&
+           mmtime.u.smpte.frame==(BYTE)(fmod(duration*mmtime.u.smpte.fps, mmtime.u.smpte.fps)),
+           "waveOutGetPosition returned %d:%d:%d %d, should be %d:%d:%d %d\n",
+           mmtime.u.smpte.hour, mmtime.u.smpte.min, mmtime.u.smpte.sec, mmtime.u.smpte.frame,
+           (BYTE)(floor(duration/(60*60))),
+           (BYTE)(fmod(floor(duration/60), 60)),
+           (BYTE)(fmod(duration,60)),
+           (BYTE)(fmod(duration*mmtime.u.smpte.fps, mmtime.u.smpte.fps)));
+}
+
 static void wave_out_test_deviceOut(int device, double duration, LPWAVEFORMATEX pwfx, DWORD format, DWORD flags, LPWAVEOUTCAPS pcaps)
 {
     HWAVEOUT wout;
@@ -261,6 +311,8 @@
 
         rc=waveOutSetVolume(wout,volume);
         ok(rc==MMSYSERR_NOERROR,"waveOutSetVolume: device=%d rc=%s\n",device,wave_out_error(rc));
+
+        check_position(device, wout, duration, pwfx);
     }
 
     rc=waveOutUnprepareHeader(wout, &frag, sizeof(frag));


More information about the wine-patches mailing list