From cd017561106c7276c8863b316221d40690503b31 Mon Sep 17 00:00:00 2001
From: Francois Gouget <fgouget@codeweavers.com>
Date: Fri, 13 Nov 2020 14:57:37 +0100
Subject: [PATCH] mmdevapi:render: Explore the stream ramp up duration and
 impact on position.
To: Wine Devel <wine-devel@winehq.org>

---
 dlls/mmdevapi/tests/render.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index dcb3ecb3f4f..bcc1fe7ee8e 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -946,7 +946,7 @@ static UINT32 get_ms_since(LARGE_INTEGER *out_time)
     return (out_time->QuadPart - last_time.QuadPart) * 1000 / freq.QuadPart;
 }
 
-static void test_clock(int share)
+static void test_clock(int share, int ramp_up_delay)
 {
     HRESULT hr;
     IAudioClient *ac;
@@ -1104,7 +1104,7 @@ static void test_clock(int share)
     hr = IAudioClient_Start(ac); /* #1 */
     ok(hr == S_OK, "Start failed: %08x\n", hr);
 
-    Sleep(100);
+    Sleep(ramp_up_delay);
 
     hr = IAudioClient_GetStreamLatency(ac, &t1);
     ok(hr == S_OK, "GetStreamLatency failed: %08x\n", hr);
@@ -1114,9 +1114,18 @@ static void test_clock(int share)
     slept += get_ms_since(&last_time);
     ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
     ok(pos > 0, "Position %u vs. last %u\n", (UINT)pos,0);
+    trace("share=%d ramp_up_delay=%u pos=%.2f slept=%u ms\n", share, ramp_up_delay, ((double)pos)*1000.0/freq, slept);
+    ok(pos*1000/freq <= 100, "Position %u (%u ms) too far after playing %ums\n", (UINT)pos, (UINT)(pos*1000/freq), slept);
+    last = pos;
+
+    Sleep(100);
+
+    hr = IAudioClock_GetPosition(acl, &pos, NULL);
+    slept = get_ms_since(&last_time);
+    ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
     /* in rare cases is slept*1.1 not enough with dmix */
-    trace("GetPos 1: share=%d ratio=%.2f\n", share, ((double)pos)*1000.0/freq/slept);
-    ok(pos*1000/freq <= slept*1.4, "Position %u (%ums) too far after playing %ums\n", (UINT)pos, (UINT)(pos*1000/freq), slept);
+    trace("share=%d ramp_up_delay=%u ratio=%.2f\n", share, ramp_up_delay, ((double)(pos-last))*1000.0/freq/slept);
+    ok(pos*1000/freq <= slept*1.4, "Position %u (%ums) too far after playing %ums\n", (UINT)(pos-last), (UINT)((pos-last)*1000/freq), slept);
     last = pos;
 
     hr = IAudioClient_Stop(ac);
@@ -2384,7 +2393,7 @@ START_TEST(render)
 {
     HRESULT hr;
     DWORD mode;
-    int i;
+    int i, ramp_up_delay;
 
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
     hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme);
@@ -2419,10 +2428,13 @@ START_TEST(render)
     test_event();
     test_padding();
     }
-    for (i = 0; i < 100; i++)
+    for (i = 0; i < 40; i++)
     {
-        test_clock(1);
-        test_clock(0);
+        for (ramp_up_delay = 0; ramp_up_delay <= 200; ramp_up_delay += 5)
+        {
+            test_clock(1, ramp_up_delay);
+            test_clock(0, ramp_up_delay);
+        }
     }
     if (0) {
     test_session();
-- 
2.20.1

