From: Giovanni Mascellani <gmascellani(a)codeweavers.com> This is required so that Shutdown() won't proceed while a sample request is blocked in wg_parser_stream_get_buffer(). --- dlls/winegstreamer/media_source.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index c56df5d62ae..72607df8892 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -92,6 +92,7 @@ struct media_source IMFMediaEventQueue *event_queue; IMFByteStream *byte_stream; + CRITICAL_SECTION shutdown_cs; CRITICAL_SECTION cs; struct wg_parser *wg_parser; @@ -568,6 +569,7 @@ static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFA if (FAILED(hr = IMFAsyncResult_GetState(result, &state))) return hr; + EnterCriticalSection(&source->shutdown_cs); EnterCriticalSection(&source->cs); if (source->state == SOURCE_SHUTDOWN) @@ -598,6 +600,7 @@ static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFA } LeaveCriticalSection(&source->cs); + LeaveCriticalSection(&source->shutdown_cs); IUnknown_Release(state); @@ -1238,6 +1241,7 @@ static ULONG WINAPI media_source_Release(IMFMediaSource *iface) IMFMediaSource_Shutdown(&source->IMFMediaSource_iface); IMFMediaEventQueue_Release(source->event_queue); DeleteCriticalSection(&source->cs); + DeleteCriticalSection(&source->shutdown_cs); free(source); } @@ -1406,12 +1410,14 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface) TRACE("%p.\n", iface); + EnterCriticalSection(&source->shutdown_cs); EnterCriticalSection(&source->cs); is_shutdown = source->state == SOURCE_SHUTDOWN; source->state = SOURCE_SHUTDOWN; for (i = 0; i < source->stream_count; i++) source->streams[i]->state = STREAM_SHUTDOWN; LeaveCriticalSection(&source->cs); + LeaveCriticalSection(&source->shutdown_cs); if (is_shutdown) return MF_E_SHUTDOWN; @@ -1502,6 +1508,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ object->byte_stream = bytestream; IMFByteStream_AddRef(bytestream); object->rate = 1.0f; + InitializeCriticalSection(&object->shutdown_cs); InitializeCriticalSection(&object->cs); if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1278