Module: wine Branch: master Commit: b7f5d908b5d5699a567ca2931e604060ffdf6f87 URL: https://gitlab.winehq.org/wine/wine/-/commit/b7f5d908b5d5699a567ca2931e60406...
Author: Giovanni Mascellani gmascellani@codeweavers.com Date: Thu Nov 10 13:10:06 2022 +0100
winegstreamer: Synchronize access to the media source from callbacks.
---
dlls/winegstreamer/media_source.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index ccc13b5e000..edae7a47ac8 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -557,32 +557,36 @@ static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFA IUnknown *state; HRESULT hr;
- if (source->state == SOURCE_SHUTDOWN) - return S_OK; - if (FAILED(hr = IMFAsyncResult_GetState(result, &state))) return hr;
+ EnterCriticalSection(&source->cs); + command = impl_from_async_command_IUnknown(state); switch (command->op) { case SOURCE_ASYNC_START: - start_pipeline(source, command); + if (source->state != SOURCE_SHUTDOWN) + start_pipeline(source, command); break; case SOURCE_ASYNC_PAUSE: - pause_pipeline(source); + if (source->state != SOURCE_SHUTDOWN) + pause_pipeline(source); break; case SOURCE_ASYNC_STOP: - stop_pipeline(source); + if (source->state != SOURCE_SHUTDOWN) + stop_pipeline(source); break; case SOURCE_ASYNC_REQUEST_SAMPLE: if (source->state == SOURCE_PAUSED) enqueue_token(command->u.request_sample.stream, command->u.request_sample.token); - else + else if (source->state == SOURCE_RUNNING) wait_on_sample(command->u.request_sample.stream, command->u.request_sample.token); break; }
+ LeaveCriticalSection(&source->cs); + IUnknown_Release(state);
return S_OK;