[vlc-devel] [PATCH v2] aout: wasapi: use a vlc_timer for the deferred start

Thomas Guillem thomas at gllm.fr
Thu Jun 11 13:16:16 CEST 2020


LGTM

On Wed, Jun 10, 2020, at 09:45, Steve Lhomme wrote:
> The timer API is not supported in Winstore builds so switch to something that
> works for all.
> 
> The timer (thread based) is created once and armed/disarmed when needed.
> ---
>  modules/audio_output/wasapi.c | 35 ++++++++++++++---------------------
>  1 file changed, 14 insertions(+), 21 deletions(-)
> 
> diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
> index 5180e93f8e89..76cee613125c 100644
> --- a/modules/audio_output/wasapi.c
> +++ b/modules/audio_output/wasapi.c
> @@ -91,7 +91,7 @@ static msftime_t GetQPC(void)
>  typedef struct aout_stream_sys
>  {
>      IAudioClient *client;
> -    HANDLE hTimer;
> +    vlc_timer_t timer;
>  
>  #define STARTED_STATE_INIT 0
>  #define STARTED_STATE_OK 1
> @@ -112,11 +112,7 @@ typedef struct aout_stream_sys
>  static void ResetTimer(aout_stream_t *s)
>  {
>      aout_stream_sys_t *sys = s->sys;
> -    if (sys->hTimer != NULL)
> -    {
> -        DeleteTimerQueueTimer(NULL, sys->hTimer, INVALID_HANDLE_VALUE);
> -        sys->hTimer = NULL;
> -    }
> +    vlc_timer_disarm(sys->timer);
>  }
>  
>  /*** VLC audio output callbacks ***/
> @@ -160,7 +156,7 @@ static HRESULT TimeGet(aout_stream_t *s, vlc_tick_t 
> *restrict delay)
>      return hr;
>  }
>  
> -static void CALLBACK StartDeferredCallback(void *val, BOOLEAN timeout)
> +static void StartDeferredCallback(void *val)
>  {
>      aout_stream_t *s = val;
>      aout_stream_sys_t *sys = s->sys;
> @@ -168,7 +164,6 @@ static void CALLBACK StartDeferredCallback(void 
> *val, BOOLEAN timeout)
>      HRESULT hr = IAudioClient_Start(sys->client);
>      atomic_store(&sys->started_state,
>                   SUCCEEDED(hr) ? STARTED_STATE_OK : 
> STARTED_STATE_ERROR);
> -    (void) timeout;
>  }
>  
>  static HRESULT StartDeferred(aout_stream_t *s, vlc_tick_t date)
> @@ -176,22 +171,13 @@ static HRESULT StartDeferred(aout_stream_t *s, 
> vlc_tick_t date)
>      aout_stream_sys_t *sys = s->sys;
>      vlc_tick_t written = vlc_tick_from_frac(sys->written, sys->rate);
>      vlc_tick_t start_delay = date - vlc_tick_now() - written;
> -    DWORD start_delay_ms = start_delay > 0 ? 
> MS_FROM_VLC_TICK(start_delay) : 0;
>      BOOL timer_updated = false;
>  
>      /* Create or update the current timer */
> -    if (start_delay_ms > 0)
> +    if (start_delay > 0)
>      {
> -        if (sys->hTimer == NULL)
> -            timer_updated =
> -                CreateTimerQueueTimer(&sys->hTimer, NULL, 
> StartDeferredCallback,
> -                                      s, start_delay_ms, 0,
> -                                      WT_EXECUTEDEFAULT | 
> WT_EXECUTEONLYONCE);
> -        else
> -            timer_updated =
> -                ChangeTimerQueueTimer(NULL, sys->hTimer, 
> start_delay_ms, 0);
> -        if (!timer_updated)
> -            msg_Warn(s, "timer update failed, starting now");
> +        vlc_timer_schedule( sys->timer, false, start_delay, 0);
> +        timer_updated = true;
>      }
>      else
>          ResetTimer(s);
> @@ -585,6 +571,7 @@ static void Stop(aout_stream_t *s)
>  
>      IAudioClient_Release(sys->client);
>  
> +    vlc_timer_destroy(sys->timer);
>      free(sys);
>  }
>  
> @@ -747,8 +734,13 @@ static HRESULT Start(aout_stream_t *s, 
> audio_sample_format_t *restrict pfmt,
>      if (unlikely(sys == NULL))
>          return E_OUTOFMEMORY;
>      sys->client = NULL;
> -    sys->hTimer = NULL;
>      atomic_init(&sys->started_state, STARTED_STATE_INIT);
> +    if (unlikely(vlc_timer_create( &sys->timer, StartDeferredCallback, 
> s ) != 0))
> +    {
> +        msg_Err(s, "failed to create the delayed start timer");
> +        free(sys);
> +        return E_UNEXPECTED;
> +    }
>  
>      /* Configure audio stream */
>      WAVEFORMATEXTENSIBLE_IEC61937 wf_iec61937;
> @@ -900,6 +892,7 @@ error:
>      CoTaskMemFree(pwf_mix);
>      if (sys->client != NULL)
>          IAudioClient_Release(sys->client);
> +    vlc_timer_destroy(sys->timer);
>      free(sys);
>      return hr;
>  }
> -- 
> 2.26.2
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list