Module: wine Branch: master Commit: bd6f6bc2dd7ba366dddb186cebbc1b1f4fcb1015 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bd6f6bc2dd7ba366dddb186ceb...
Author: Andrew Eikum aeikum@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);