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

Steve Lhomme robux4 at ycbcr.xyz
Tue Jun 9 16:48:48 CEST 2020


The timer API is not supported in Winstore builds so switch to something that
works for all.
---
 modules/audio_output/wasapi.c | 41 ++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
index ecfcc99ae1dd..3644d7cea5ae 100644
--- a/modules/audio_output/wasapi.c
+++ b/modules/audio_output/wasapi.c
@@ -91,7 +91,8 @@ static msftime_t GetQPC(void)
 typedef struct aout_stream_sys
 {
     IAudioClient *client;
-    HANDLE hTimer;
+    vlc_timer_t timer;
+    atomic_bool has_timer;
 
 #define STARTED_STATE_INIT 0
 #define STARTED_STATE_OK 1
@@ -112,11 +113,8 @@ 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;
-    }
+    if (atomic_exchange(&sys->has_timer,false))
+        vlc_timer_destroy(sys->timer);
 }
 
 /*** VLC audio output callbacks ***/
@@ -160,7 +158,7 @@ static HRESULT TimeGet(aout_stream_t *s, vlc_tick_t *restrict delay)
     return hr;
 }
 
-static void DoStartDeferred(void *val)
+static void StartDeferredCallback(void *val)
 {
     aout_stream_t *s = val;
     aout_stream_sys_t *sys = s->sys;
@@ -169,25 +167,24 @@ static void DoStartDeferred(void *val)
     atomic_store(&sys->started_state,
                  SUCCEEDED(hr) ? STARTED_STATE_OK : STARTED_STATE_ERROR);
 }
-static void CALLBACK StartDeferredCallback(void *val, BOOLEAN timeout)
-{
-    DoStartDeferred(val);
-    (void)timeout;
-}
 
 static bool StartTimer(aout_stream_t *s, vlc_tick_t start_delay)
 {
     aout_stream_sys_t *sys = s->sys;
     bool timer_updated = false;
-    DWORD start_delay_ms = MS_FROM_VLC_TICK(start_delay);
-    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 (!atomic_load(&sys->has_timer))
+    {
+        if (vlc_timer_create( &sys->timer, StartDeferredCallback, s ) == 0)
+        {
+            msg_Warn(s, "start THREAD!");
+            atomic_store(&sys->has_timer, true);
+        }
+    }
+    if (atomic_load(&sys->has_timer))
+    {
+        vlc_timer_schedule( sys->timer, false, start_delay, 0);
+        timer_updated = true;
+    }
     return timer_updated;
 }
 
@@ -759,7 +756,7 @@ 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->has_timer, false);
     atomic_init(&sys->started_state, STARTED_STATE_INIT);
 
     /* Configure audio stream */
-- 
2.26.2



More information about the vlc-devel mailing list