Anton Baskanov : amstream: Support the event parameter in IDirectDrawStreamSample::Update.

Alexandre Julliard julliard at winehq.org
Tue Oct 26 09:40:27 CDT 2021


Module: wine
Branch: stable
Commit: a0711d16fa2bdf592354be1d6d768f2048c49ecf
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a0711d16fa2bdf592354be1d6d768f2048c49ecf

Author: Anton Baskanov <baskanov at gmail.com>
Date:   Wed Apr 21 12:53:34 2021 +0700

amstream: Support the event parameter in IDirectDrawStreamSample::Update.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50628
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit b8a646f4997b1f695f340ed97fde716f834652e7)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/amstream/ddrawstream.c    | 12 +++++-------
 dlls/amstream/tests/amstream.c | 17 +++++++----------
 2 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c
index d6f07e1b10a..94f5c38301c 100644
--- a/dlls/amstream/ddrawstream.c
+++ b/dlls/amstream/ddrawstream.c
@@ -77,6 +77,7 @@ struct ddraw_sample
     STREAM_TIME end_time;
     BOOL continuous_update;
     CONDITION_VARIABLE update_cv;
+    HANDLE external_event;
 
     struct list entry;
     HRESULT update_hr;
@@ -91,6 +92,8 @@ static void remove_queued_update(struct ddraw_sample *sample)
     sample->busy = FALSE;
     list_remove(&sample->entry);
     WakeConditionVariable(&sample->update_cv);
+    if (sample->external_event)
+        SetEvent(sample->external_event);
 }
 
 static void flush_update_queue(struct ddraw_stream *stream, HRESULT update_hr)
@@ -1583,12 +1586,6 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
         return E_NOTIMPL;
     }
 
-    if (event)
-    {
-        FIXME("Event parameter support is not implemented!\n");
-        return E_NOTIMPL;
-    }
-
     EnterCriticalSection(&sample->parent->cs);
 
     if (sample->parent->state != State_Running)
@@ -1612,10 +1609,11 @@ static HRESULT WINAPI ddraw_sample_Update(IDirectDrawStreamSample *iface,
 
     sample->update_hr = MS_S_NOUPDATE;
     sample->busy = TRUE;
+    sample->external_event = event;
     list_add_tail(&sample->parent->update_queue, &sample->entry);
     WakeConditionVariable(&sample->parent->update_queued_cv);
 
-    if (flags & SSUPDATE_ASYNC)
+    if ((flags & SSUPDATE_ASYNC) || event)
     {
         LeaveCriticalSection(&sample->parent->cs);
         return MS_S_PENDING;
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index c5089a82f23..3d38d195f7f 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -7796,20 +7796,17 @@ static void test_ddrawstreamsample_update(void)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
     hr = IDirectDrawStreamSample_Update(stream_sample, 0, event, NULL, 0);
-    todo_wine ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
+    ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);
 
     ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
 
-    if (hr == MS_S_PENDING)
-    {
-        media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
-        hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
-        ok(hr == S_OK, "Got hr %#x.\n", hr);
-        ref = IMediaSample_Release(media_sample);
-        ok(!ref, "Got outstanding refcount %d.\n", ref);
-    }
+    media_sample = ammediastream_allocate_sample(&source, test_data, sizeof(test_data));
+    hr = IMemInputPin_Receive(source.source.pMemInputPin, media_sample);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ref = IMediaSample_Release(media_sample);
+    ok(!ref, "Got outstanding refcount %d.\n", ref);
 
-    todo_wine ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n");
+    ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n");
 
     hr = IDirectDrawStreamSample_Update(stream_sample, SSUPDATE_ASYNC, NULL, NULL, 0);
     ok(hr == MS_S_PENDING, "Got hr %#x.\n", hr);




More information about the wine-cvs mailing list