Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/sar.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c index e318576e80e..d839cba90f1 100644 --- a/dlls/mf/sar.c +++ b/dlls/mf/sar.c @@ -228,7 +228,13 @@ static ULONG WINAPI audio_renderer_sink_AddRef(IMFMediaSink *iface)
static void audio_renderer_release_audio_client(struct audio_renderer *renderer) { + struct queued_object *obj, *obj2; + MFCancelWorkItem(renderer->buffer_ready_key); + LIST_FOR_EACH_ENTRY_SAFE(obj, obj2, &renderer->queue, struct queued_object, entry) + { + release_pending_object(obj); + } renderer->buffer_ready_key = 0; if (renderer->audio_client) { @@ -253,7 +259,6 @@ static ULONG WINAPI audio_renderer_sink_Release(IMFMediaSink *iface) { struct audio_renderer *renderer = impl_from_IMFMediaSink(iface); ULONG refcount = InterlockedDecrement(&renderer->refcount); - struct queued_object *obj, *obj2;
TRACE("%p, refcount %u.\n", iface, refcount);
@@ -273,10 +278,6 @@ static ULONG WINAPI audio_renderer_sink_Release(IMFMediaSink *iface) IMFMediaType_Release(renderer->current_media_type); audio_renderer_release_audio_client(renderer); CloseHandle(renderer->buffer_ready_event); - LIST_FOR_EACH_ENTRY_SAFE(obj, obj2, &renderer->queue, struct queued_object, entry) - { - release_pending_object(obj); - } DeleteCriticalSection(&renderer->cs); heap_free(renderer); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- 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;