Nikolay Sivov : mf/sar: Handle shutdown state in rendering callback.

Alexandre Julliard julliard at winehq.org
Wed Jan 27 15:35:04 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 27 17:37:47 2021 +0300

mf/sar: Handle shutdown state in rendering callback.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mf/sar.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index d839cba90f1..9030b3a81c0 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -1750,9 +1750,8 @@ static HRESULT WINAPI audio_renderer_render_callback_GetParameters(IMFAsyncCallb
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI audio_renderer_render_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
+static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResult *result)
 {
-    struct audio_renderer *renderer = impl_from_render_callback_IMFAsyncCallback(iface);
     unsigned int src_frames, dst_frames, max_frames, src_len;
     struct queued_object *obj, *obj2;
     BOOL keep_sample = FALSE;
@@ -1760,8 +1759,6 @@ static HRESULT WINAPI audio_renderer_render_callback_Invoke(IMFAsyncCallback *if
     BYTE *dst, *src;
     HRESULT hr;
 
-    EnterCriticalSection(&renderer->cs);
-
     LIST_FOR_EACH_ENTRY_SAFE(obj, obj2, &renderer->queue, struct queued_object, entry)
     {
         if (obj->type == OBJECT_TYPE_MARKER)
@@ -1816,7 +1813,15 @@ static HRESULT WINAPI audio_renderer_render_callback_Invoke(IMFAsyncCallback *if
 
     if (FAILED(hr = MFPutWaitingWorkItem(renderer->buffer_ready_event, 0, result, &renderer->buffer_ready_key)))
         WARN("Failed to submit wait item, hr %#x.\n", hr);
+}
 
+static HRESULT WINAPI audio_renderer_render_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
+{
+    struct audio_renderer *renderer = impl_from_render_callback_IMFAsyncCallback(iface);
+
+    EnterCriticalSection(&renderer->cs);
+    if (!(renderer->flags & SAR_SHUT_DOWN))
+        audio_renderer_render(renderer, result);
     LeaveCriticalSection(&renderer->cs);
 
     return S_OK;




More information about the wine-cvs mailing list