Giovanni Mascellani : mf/sar: Query for current padding before requesting sample buffer.

Alexandre Julliard julliard at winehq.org
Tue Jun 22 16:17:06 CDT 2021


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

Author: Giovanni Mascellani <gmascellani at codeweavers.com>
Date:   Mon Jun 21 17:52:53 2021 +0200

mf/sar: Query for current padding before requesting sample buffer.

According to both MSDN and our impementation, GetBufferSize returns the
size of the buffer, but it doesn't guarantee that all of it is available.
In order to know how much of it is available, the caller must also call
GetCurrentPadding and subtract that number to the buffer size. Failing
to do so might result in GetBuffer returning an error.

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

---

 dlls/mf/sar.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index 77cbfcb21da..eba822ae0fe 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -1751,7 +1751,7 @@ static HRESULT WINAPI audio_renderer_render_callback_GetParameters(IMFAsyncCallb
 
 static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResult *result)
 {
-    unsigned int src_frames, dst_frames, max_frames, src_len;
+    unsigned int src_frames, dst_frames, max_frames, pad_frames, src_len;
     struct queued_object *obj, *obj2;
     BOOL keep_sample = FALSE;
     IMFMediaBuffer *buffer;
@@ -1775,20 +1775,24 @@ static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResul
                     {
                         if (SUCCEEDED(IAudioClient_GetBufferSize(renderer->audio_client, &max_frames)))
                         {
-                            src_frames -= obj->u.sample.frame_offset;
-                            dst_frames = min(src_frames, max_frames);
-
-                            if (SUCCEEDED(hr = IAudioRenderClient_GetBuffer(renderer->audio_render_client, dst_frames, &dst)))
+                            if (SUCCEEDED(IAudioClient_GetCurrentPadding(renderer->audio_client, &pad_frames)))
                             {
-                                memcpy(dst, src + obj->u.sample.frame_offset * renderer->frame_size,
-                                        dst_frames * renderer->frame_size);
+                                max_frames -= pad_frames;
+                                src_frames -= obj->u.sample.frame_offset;
+                                dst_frames = min(src_frames, max_frames);
 
-                                IAudioRenderClient_ReleaseBuffer(renderer->audio_render_client, dst_frames, 0);
+                                if (SUCCEEDED(hr = IAudioRenderClient_GetBuffer(renderer->audio_render_client, dst_frames, &dst)))
+                                {
+                                    memcpy(dst, src + obj->u.sample.frame_offset * renderer->frame_size,
+                                            dst_frames * renderer->frame_size);
 
-                                obj->u.sample.frame_offset += dst_frames;
-                            }
+                                    IAudioRenderClient_ReleaseBuffer(renderer->audio_render_client, dst_frames, 0);
 
-                            keep_sample = FAILED(hr) || src_frames > max_frames;
+                                    obj->u.sample.frame_offset += dst_frames;
+                                }
+
+                                keep_sample = FAILED(hr) || src_frames > max_frames;
+                            }
                         }
                     }
                     IMFMediaBuffer_Unlock(buffer);




More information about the wine-cvs mailing list