[PATCH 3/3] mfmediaengine: Send "pause" event on Pause().

Nikolay Sivov nsivov at codeweavers.com
Fri May 29 13:28:40 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfmediaengine/main.c                | 21 +++++++++++++++++++--
 dlls/mfmediaengine/tests/mfmediaengine.c | 17 +++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 13cbeb4b8db..fcef1be048f 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -476,9 +476,26 @@ static HRESULT WINAPI media_engine_Play(IMFMediaEngine *iface)
 
 static HRESULT WINAPI media_engine_Pause(IMFMediaEngine *iface)
 {
-    FIXME("(%p): stub.\n", iface);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p.\n", iface);
+
+    EnterCriticalSection(&engine->cs);
+
+    if (!(engine->flags & FLAGS_ENGINE_PAUSED))
+    {
+        engine->flags &= ~FLAGS_ENGINE_WAITING;
+        engine->flags |= FLAGS_ENGINE_PAUSED;
+
+        IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0);
+        IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0);
+    }
+
+    IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0);
+
+    LeaveCriticalSection(&engine->cs);
+
+    return S_OK;
 }
 
 static BOOL WINAPI media_engine_GetMuted(IMFMediaEngine *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index e7cb6432b92..a3db611e9fc 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -421,6 +421,23 @@ static void test_Play(void)
     ok(!ret, "Unexpected state %d.\n", ret);
 
     IMFMediaEngine_Release(media_engine);
+
+    /* Play -> Pause */
+    media_engine = create_media_engine(callback);
+
+    hr = IMFMediaEngine_Play(media_engine);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ret = IMFMediaEngine_IsPaused(media_engine);
+    ok(!ret, "Unexpected state %d.\n", ret);
+
+    hr = IMFMediaEngine_Pause(media_engine);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ret = IMFMediaEngine_IsPaused(media_engine);
+    ok(!!ret, "Unexpected state %d.\n", ret);
+
+    IMFMediaEngine_Release(media_engine);
 }
 
 START_TEST(mfmediaengine)
-- 
2.26.2




More information about the wine-devel mailing list