Andrew Eikum : mmdevapi: Prevent deadlock when releasing a stream that' s still playing.

Alexandre Julliard julliard at winehq.org
Tue Jan 11 10:08:25 CST 2011


Module: wine
Branch: master
Commit: bd6f6bc2dd7ba366dddb186cebbc1b1f4fcb1015
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bd6f6bc2dd7ba366dddb186cebbc1b1f4fcb1015

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon Jan 10 14:10:50 2011 -0600

mmdevapi: Prevent deadlock when releasing a stream that's still playing.

---

 dlls/mmdevapi/audio.c        |    3 ++
 dlls/mmdevapi/tests/render.c |   47 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/dlls/mmdevapi/audio.c b/dlls/mmdevapi/audio.c
index 6217cba..56e6187 100644
--- a/dlls/mmdevapi/audio.c
+++ b/dlls/mmdevapi/audio.c
@@ -313,7 +313,10 @@ HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv)
 static void AudioClient_Destroy(ACImpl *This)
 {
     if (This->timer_id)
+    {
         DeleteTimerQueueTimer(NULL, This->timer_id, INVALID_HANDLE_VALUE);
+        This->timer_id = 0;
+    }
     if (This->render)
         AudioRenderClient_Destroy(This->render);
     if (This->capture)
diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index 22e8c9b..f7d7eb1 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -334,6 +334,52 @@ static void test_references(void)
     ok(ref == 0, "AudioClock_Release gave wrong refcount: %u\n", ref);
 }
 
+static void test_event(void)
+{
+    HANDLE event;
+    HRESULT hr;
+    IAudioClient *ac;
+    WAVEFORMATEX *pwfx;
+
+    hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+            NULL, (void**)&ac);
+    ok(hr == S_OK, "Activation failed with %08x\n", hr);
+    if(hr != S_OK)
+        return;
+
+    hr = IAudioClient_GetMixFormat(ac, &pwfx);
+    ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
+    if(hr != S_OK)
+        return;
+
+    hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED,
+            AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 5000000,
+            0, pwfx, NULL);
+    ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+    event = CreateEventW(NULL, FALSE, FALSE, NULL);
+    ok(event != NULL, "CreateEvent failed\n");
+
+    hr = IAudioClient_Start(ac);
+    ok(hr == AUDCLNT_E_EVENTHANDLE_NOT_SET, "Start failed: %08x\n", hr);
+
+    hr = IAudioClient_SetEventHandle(ac, event);
+    ok(hr == S_OK, "SetEventHandle failed: %08x\n", hr);
+
+    hr = IAudioClient_Start(ac);
+    ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+    hr = IAudioClient_Stop(ac);
+    ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+    /* test releasing a playing stream */
+    hr = IAudioClient_Start(ac);
+    ok(hr == S_OK, "Start failed: %08x\n", hr);
+    IAudioClient_Release(ac);
+
+    CloseHandle(event);
+}
+
 START_TEST(render)
 {
     HRESULT hr;
@@ -360,6 +406,7 @@ START_TEST(render)
 
     test_audioclient();
     test_references();
+    test_event();
 
     IMMDevice_Release(dev);
 




More information about the wine-cvs mailing list