[PATCH v4 2/2] mf/sar: Allow requesting more than a sample per period.

Nikolay Sivov nsivov at codeweavers.com
Wed Jun 23 16:04:57 CDT 2021


On 6/22/21 5:34 PM, Giovanni Mascellani wrote:
> @@ -1359,7 +1369,10 @@ static HRESULT WINAPI audio_renderer_stream_ProcessSample(IMFStreamSink *iface,
>      EnterCriticalSection(&renderer->cs);
>      if (renderer->state == STREAM_STATE_RUNNING)
>          hr = stream_queue_sample(renderer, sample);
> -    renderer->flags &= ~SAR_SAMPLE_REQUESTED;
> +    if (renderer->queued_frames < renderer->target_queued_frames)
> +        IMFMediaEventQueue_QueueEventParamVar(renderer->stream_event_queue, MEStreamSinkRequestSample, &GUID_NULL, S_OK, NULL);
> +    else
> +        renderer->flags &= ~SAR_SAMPLE_REQUESTED;
>      LeaveCriticalSection(&renderer->cs);
Let's request only when running.

> +    if (FAILED(hr = IAudioClient_GetDevicePeriod(renderer->audio_client, &period, NULL)))
> +    {
> +        WARN("Failed to retrieve device period, hr %#x.\n", hr);
> +        return hr;
> +    }
> +    renderer->target_queued_frames = 2 * period * samples_per_second / 10000000;
> +
Could this be replaced with GetBufferSize() that returns size in frames?

> @@ -1789,6 +1812,7 @@ static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResul
>                                      IAudioRenderClient_ReleaseBuffer(renderer->audio_render_client, dst_frames, 0);
>  
>                                      obj->u.sample.frame_offset += dst_frames;
> +                                    renderer->queued_frames -= dst_frames;
queued_frames should be reset when every time we empty this list.

Have you tested patch v4 with the game?



More information about the wine-devel mailing list