[PATCH 1/5] mfmediaengine: Implement error property.

Nikolay Sivov nsivov at codeweavers.com
Thu Jun 4 05:41:45 CDT 2020


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

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index d77b1e4afee..dba55bb937d 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -84,6 +84,7 @@ struct media_engine
     double default_playback_rate;
     double volume;
     double duration;
+    MF_MEDIA_ENGINE_ERR error_code;
     IMFMediaSession *session;
     IMFSourceResolver *resolver;
     CRITICAL_SECTION cs;
@@ -512,16 +513,44 @@ static ULONG WINAPI media_engine_Release(IMFMediaEngine *iface)
 
 static HRESULT WINAPI media_engine_GetError(IMFMediaEngine *iface, IMFMediaError **error)
 {
-    FIXME("(%p, %p): stub.\n", iface, error);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, error);
+
+    *error = NULL;
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else if (engine->error_code)
+    {
+        if (SUCCEEDED(hr = create_media_error(error)))
+            IMFMediaError_SetErrorCode(*error, engine->error_code);
+    }
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
-static HRESULT WINAPI media_engine_SetErrorCode(IMFMediaEngine *iface, MF_MEDIA_ENGINE_ERR error)
+static HRESULT WINAPI media_engine_SetErrorCode(IMFMediaEngine *iface, MF_MEDIA_ENGINE_ERR code)
 {
-    FIXME("(%p, %d): stub.\n", iface, error);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %u.\n", iface, code);
+
+    if ((unsigned int)code > MF_MEDIA_ENGINE_ERR_ENCRYPTED)
+        return E_INVALIDARG;
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else
+        engine->error_code = code;
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI media_engine_SetSourceElements(IMFMediaEngine *iface, IMFMediaEngineSrcElements *elements)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 2f114db7e9e..660e5b95331 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -503,45 +503,47 @@ static void test_error(void)
 
     eo = (void *)0xdeadbeef;
     hr = IMFMediaEngine_GetError(media_engine, &eo);
-todo_wine {
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!eo, "Unexpected instance.\n");
-}
+
     hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_ENCRYPTED + 1);
-todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
     hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_ABORTED);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
     eo = NULL;
     hr = IMFMediaEngine_GetError(media_engine, &eo);
-todo_wine {
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!!eo, "Unexpected instance.\n");
-}
+
     eo2 = NULL;
     hr = IMFMediaEngine_GetError(media_engine, &eo2);
-todo_wine {
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(eo2 != eo, "Unexpected instance.\n");
-}
-    if (eo2)
-        IMFMediaError_Release(eo2);
-    if (eo)
-        IMFMediaError_Release(eo);
+
+    IMFMediaError_Release(eo2);
+    IMFMediaError_Release(eo);
 
     hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_NOERROR);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
     eo = (void *)0xdeadbeef;
     hr = IMFMediaEngine_GetError(media_engine, &eo);
-todo_wine {
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!eo, "Unexpected instance.\n");
-}
+
+    hr = IMFMediaEngine_Shutdown(media_engine);
+    ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+
+    eo = (void *)0xdeadbeef;
+    hr = IMFMediaEngine_GetError(media_engine, &eo);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+    ok(!eo, "Unexpected instance.\n");
+
+    hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_NOERROR);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
     IMFMediaEngine_Release(media_engine);
 
     /* Error object. */
-- 
2.26.2




More information about the wine-devel mailing list