[vlc-commits] PulseAudio: limit resampling to 1% variation at a time

Rémi Denis-Courmont git at videolan.org
Wed Jul 27 20:22:32 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Jul 27 21:19:41 2011 +0300| [a97f3aa7dab9f58b55dbf489677c9a1ab22875f1] | committer: Rémi Denis-Courmont

PulseAudio: limit resampling to 1% variation at a time

1kHz is way too much for human perception.

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

 modules/audio_output/pulse.c |   14 +++++++-------
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index 5624831..fe447a9 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -260,27 +260,27 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
 
     /* Compute playback sample rate */
     const unsigned inrate = aout->format.i_rate;
+    int limit = inrate / 100; /* max varation per iteration */
 
 #define ADJUST_FACTOR 4
-#define ADJUST_MAX    1000 /* Hz (max rate variation per call) */
     /* This is empirical. Feel free to define something smarter. */
     int adj = sys->rate * (delta + change) / (CLOCK_FREQ * ADJUST_FACTOR);
 
     /* This avoids too fast rate variation. They sound ugly as hell and they
      * make the algorithm unstable (e.g. oscillation around inrate). */
-    if (adj > +ADJUST_MAX)
-        adj = +ADJUST_MAX;
-    if (adj < -ADJUST_MAX)
-        adj = -ADJUST_MAX;
+    if (adj > +limit)
+        adj = +limit;
+    if (adj < -limit)
+        adj = -limit;
 
     unsigned outrate = sys->rate - adj;
     /* Favor native rate to avoid resampling (FIXME: really a good idea?) */
-    if (abs(outrate - inrate) < (inrate >> 10))
+    if (abs(outrate - inrate) < limit)
         outrate = inrate;
 
     /* This keeps the effective rate within specified range
      * (+/-AOUT_MAX_RESAMPLING% - see <vlc_aout.h>) of the nominal rate. */
-    const int limit = inrate * AOUT_MAX_RESAMPLING / 100;
+    limit *= AOUT_MAX_RESAMPLING;
     if (outrate > inrate + limit)
         outrate = inrate + limit;
     if (outrate < inrate - limit)



More information about the vlc-commits mailing list