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);