[vlc-commits] PulseAudio: remove custom synchronization and resampling code

Rémi Denis-Courmont git at videolan.org
Wed Nov 21 21:27:18 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Nov 21 20:40:41 2012 +0200| [44a7ebee6c9d77a06ecf82be2fe3245ed68a3c36] | committer: Rémi Denis-Courmont

PulseAudio: remove custom synchronization and resampling code

The VLC core resampling _should_ work now.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=44a7ebee6c9d77a06ecf82be2fe3245ed68a3c36
---

 modules/audio_output/pulse.c |  112 ++++--------------------------------------
 1 file changed, 10 insertions(+), 102 deletions(-)

diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index 2debbcd..3cf70cd 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -65,11 +65,7 @@ struct aout_sys_t
     pa_volume_t base_volume; /**< 0dB reference volume */
     pa_cvolume cvolume; /**< actual sink input volume */
     mtime_t first_pts; /**< Play time of buffer start */
-    mtime_t last_pts; /**< Play time of buffer write offset */
     mtime_t paused; /**< Time when (last) paused */
-    mtime_t desync; /**< Measured desynchronization */
-    unsigned nominal_rate; /**< Nominal stream sample rate */
-    unsigned actual_rate; /**< Current stream sample rate */
 };
 
 static void sink_list_cb(pa_context *, const pa_sink_info *, int, void *);
@@ -182,21 +178,6 @@ static void sink_info_cb(pa_context *c, const pa_sink_info *i, int eol,
 
 
 /*** Latency management and lip synchronization ***/
-static void stream_reset_sync(pa_stream *s, audio_output_t *aout)
-{
-    aout_sys_t *sys = aout->sys;
-    const unsigned rate = sys->nominal_rate;
-
-    sys->first_pts = VLC_TS_INVALID;
-    sys->last_pts = VLC_TS_INVALID;
-    sys->desync = 0;
-    pa_operation *op = pa_stream_update_sample_rate(s, rate, NULL, NULL);
-    if (unlikely(op == NULL))
-        return;
-    pa_operation_unref(op);
-    sys->actual_rate = rate;
-}
-
 static void stream_start_now(pa_stream *s, audio_output_t *aout)
 {
     aout_sys_t *sys = aout->sys;
@@ -282,81 +263,13 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
 {
     audio_output_t *aout = userdata;
     aout_sys_t *sys = aout->sys;
-    mtime_t delta, change;
 
     if (sys->paused != VLC_TS_INVALID)
         return; /* nothing to do while paused */
-    if (sys->last_pts == VLC_TS_INVALID) {
-        msg_Dbg(aout, "nothing to play");
-        assert (sys->first_pts == VLC_TS_INVALID);
-        return;
-    }
-    if (pa_stream_is_corked(s) > 0) {
+    if (sys->first_pts == VLC_TS_INVALID)
+        return; /* nothing to do if buffers are (still) empty */
+    if (pa_stream_is_corked(s) > 0)
         stream_start(s, aout);
-        return;
-    }
-
-    /* Compute lip desynchronization */
-    delta = vlc_pa_get_latency(aout, sys->context, s);
-    if (delta == VLC_TS_INVALID)
-        return;
-
-    delta = (sys->last_pts - mdate()) - delta;
-    change = delta - sys->desync;
-    sys->desync = delta;
-    //msg_Dbg(aout, "desync: %+"PRId64" us (variation: %+"PRId64" us)",
-    //        delta, change);
-
-    const unsigned inrate = sys->nominal_rate;
-    unsigned outrate = sys->actual_rate;
-    bool sync = false;
-
-    if (delta < -AOUT_MAX_PTS_DELAY)
-        msg_Warn(aout, "too late by %"PRId64" us", -delta);
-    else if (delta > +AOUT_MAX_PTS_ADVANCE)
-        msg_Warn(aout, "too early by %"PRId64" us", delta);
-    else if (outrate  == inrate)
-        return; /* In sync, do not add unnecessary disturbance! */
-    else
-        sync = true;
-
-    /* Compute playback sample rate */
-    /* This is empirical (especially the shift values).
-     * Feel free to define something smarter. */
-    int adj = sync ? (outrate - inrate)
-                   : outrate * ((delta >> 4) + change) / (CLOCK_FREQ << 2);
-    /* This avoids too quick rate variation. It sounds really bad and
-     * causes unstability (e.g. oscillation around the correct rate). */
-    int limit = inrate >> 10;
-    /* However, to improve stability and try to converge, closing to the
-     * nominal rate is favored over drifting from it. */
-    if ((adj > 0) == (sys->actual_rate > inrate))
-        limit *= 2;
-    if (adj > +limit)
-        adj = +limit;
-    if (adj < -limit)
-        adj = -limit;
-    outrate -= adj;
-
-    /* This keeps the effective rate within specified range
-     * (+/-AOUT_MAX_RESAMPLING% - see <vlc_aout.h>) of the nominal rate. */
-    limit = inrate * AOUT_MAX_RESAMPLING / 100;
-    if (outrate > inrate + limit)
-        outrate = inrate + limit;
-    if (outrate < inrate - limit)
-        outrate = inrate - limit;
-
-    /* Apply adjusted sample rate */
-    if (outrate == sys->actual_rate)
-        return;
-    pa_operation *op = pa_stream_update_sample_rate(s, outrate, NULL, NULL);
-    if (unlikely(op == NULL)) {
-        vlc_pa_error(aout, "cannot change sample rate", sys->context);
-        return;
-    }
-    pa_operation_unref(op);
-    msg_Dbg(aout, "changed sample rate to %u Hz",outrate);
-    sys->actual_rate = outrate;
 }
 
 
@@ -443,13 +356,15 @@ static void stream_moved_cb(pa_stream *s, void *userdata)
 static void stream_overflow_cb(pa_stream *s, void *userdata)
 {
     audio_output_t *aout = userdata;
+    aout_sys_t *sys = aout->sys;
     pa_operation *op;
 
     msg_Err(aout, "overflow, flushing");
     op = pa_stream_flush(s, NULL, NULL);
-    if (likely(op != NULL))
-        pa_operation_unref(op);
-    stream_reset_sync(s, aout);
+    if (unlikely(op == NULL))
+        return;
+    pa_operation_unref(op);
+    sys->first_pts = VLC_TS_INVALID;
 }
 
 static void stream_started_cb(pa_stream *s, void *userdata)
@@ -550,7 +465,6 @@ static void Play(audio_output_t *aout, block_t *block)
         return;
 
     size_t len = block->i_buffer;
-    mtime_t pts = block->i_pts + block->i_length;
 
     /* Note: The core already holds the output FIFO lock at this point.
      * Therefore we must not under any circumstances (try to) acquire the
@@ -561,7 +475,6 @@ static void Play(audio_output_t *aout, block_t *block)
 
     if (sys->first_pts == VLC_TS_INVALID)
         sys->first_pts = block->i_pts;
-    sys->last_pts = pts;
 
     if (pa_stream_is_corked(s) > 0)
         stream_start(s, aout);
@@ -601,9 +514,8 @@ static void Pause(audio_output_t *aout, bool paused, mtime_t date)
         msg_Dbg(aout, "resuming after %"PRId64" us", date);
         sys->paused = VLC_TS_INVALID;
 
-        if (sys->last_pts != VLC_TS_INVALID) {
+        if (sys->first_pts != VLC_TS_INVALID) {
             sys->first_pts += date;
-            sys->last_pts += date;
             stream_start(s, aout);
         }
     }
@@ -851,7 +763,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
                                   //| PA_STREAM_INTERPOLATE_TIMING
                                     | PA_STREAM_NOT_MONOTONIC
                                   | PA_STREAM_AUTO_TIMING_UPDATE
-                                  | PA_STREAM_VARIABLE_RATE;
+                                  /*| PA_STREAM_FIX_RATE*/;
 
     struct pa_buffer_attr attr;
     attr.maxlength = -1;
@@ -869,11 +781,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
     sys->stream = NULL;
     sys->trigger = NULL;
     sys->first_pts = VLC_TS_INVALID;
-    sys->last_pts = VLC_TS_INVALID;
     sys->paused = VLC_TS_INVALID;
-    sys->desync = 0;
-    sys->nominal_rate = ss.rate;
-    sys->actual_rate = ss.rate;
 
     /* Channel volume */
     sys->base_volume = PA_VOLUME_NORM;



More information about the vlc-commits mailing list