[PATCH 2/6] mfmediaengine: Send "volumechange" event on muted state change.

Nikolay Sivov nsivov at codeweavers.com
Tue Jun 2 03:41:05 CDT 2020


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

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index b9bf3c7027b..731bccb581d 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -63,6 +63,7 @@ enum media_engine_flags
     FLAGS_ENGINE_LOOP = 0x80,
     FLAGS_ENGINE_PAUSED = 0x100,
     FLAGS_ENGINE_WAITING = 0x200,
+    FLAGS_ENGINE_MUTED = 0x400,
 };
 
 struct media_engine
@@ -542,16 +543,36 @@ static HRESULT WINAPI media_engine_Pause(IMFMediaEngine *iface)
 
 static BOOL WINAPI media_engine_GetMuted(IMFMediaEngine *iface)
 {
-    FIXME("(%p): stub.\n", iface);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+    BOOL ret;
 
-    return FALSE;
+    TRACE("%p.\n", iface);
+
+    EnterCriticalSection(&engine->cs);
+    ret = !!(engine->flags & FLAGS_ENGINE_MUTED);
+    LeaveCriticalSection(&engine->cs);
+
+    return ret;
 }
 
 static HRESULT WINAPI media_engine_SetMuted(IMFMediaEngine *iface, BOOL muted)
 {
-    FIXME("(%p, %d): stub.\n", iface, muted);
+    struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %d.\n", iface, muted);
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else if (!!(engine->flags & FLAGS_ENGINE_MUTED) ^ !!muted)
+    {
+        media_engine_set_flag(engine, FLAGS_ENGINE_MUTED, muted);
+        IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_VOLUMECHANGE, 0, 0);
+    }
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static double WINAPI media_engine_GetVolume(IMFMediaEngine *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 4079e9aa70f..0839d1d4451 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -361,14 +361,13 @@ todo_wine
     ok(!state, "Unexpected state.\n");
 
     hr = IMFMediaEngine_SetMuted(media_engine, TRUE);
-todo_wine
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
     val = IMFMediaEngine_GetVolume(media_engine);
 todo_wine
     ok(val == 1.0, "Unexpected value %f.\n", val);
 
-    val = IMFMediaEngine_SetVolume(media_engine, 2.0);
+    hr = IMFMediaEngine_SetVolume(media_engine, 2.0);
 todo_wine
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
@@ -465,6 +464,34 @@ static void test_playback_rate(void)
     IMFMediaEngine_Release(media_engine);
 }
 
+static void test_mute(void)
+{
+    struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1};
+    IMFMediaEngineNotify *callback = &notify_impl.IMFMediaEngineNotify_iface;
+    IMFMediaEngine *media_engine;
+    HRESULT hr;
+    BOOL ret;
+
+    media_engine = create_media_engine(callback);
+
+    ret = IMFMediaEngine_GetMuted(media_engine);
+    ok(!ret, "Unexpected state.\n");
+
+    hr = IMFMediaEngine_SetMuted(media_engine, TRUE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ret = IMFMediaEngine_GetMuted(media_engine);
+    ok(ret, "Unexpected state.\n");
+
+    hr = IMFMediaEngine_Shutdown(media_engine);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ret = IMFMediaEngine_GetMuted(media_engine);
+    ok(ret, "Unexpected state.\n");
+
+    IMFMediaEngine_Release(media_engine);
+}
+
 START_TEST(mfmediaengine)
 {
     HRESULT hr;
@@ -490,6 +517,7 @@ START_TEST(mfmediaengine)
     test_Shutdown();
     test_Play();
     test_playback_rate();
+    test_mute();
 
     IMFMediaEngineClassFactory_Release(factory);
 
-- 
2.26.2




More information about the wine-devel mailing list