Commit 429558a9 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

PulseAudio: limit resampling to 1% variation at a time

1kHz is way too much for human perception.
(cherry picked from commit a97f3aa7dab9f58b55dbf489677c9a1ab22875f1)

Conflicts:

	modules/audio_output/pulse.c
parent 65ca2b78
...@@ -207,27 +207,27 @@ static void stream_latency_cb(pa_stream *s, void *userdata) ...@@ -207,27 +207,27 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
/* Compute playback sample rate */ /* Compute playback sample rate */
const unsigned inrate = aout->output.output.i_rate; const unsigned inrate = aout->output.output.i_rate;
int limit = inrate / 100; /* max varation per iteration */
#define ADJUST_FACTOR 4 #define ADJUST_FACTOR 4
#define ADJUST_MAX 1000 /* Hz (max rate variation per call) */
/* This is empirical. Feel free to define something smarter. */ /* This is empirical. Feel free to define something smarter. */
int adj = sys->rate * (delta + change) / (CLOCK_FREQ * ADJUST_FACTOR); int adj = sys->rate * (delta + change) / (CLOCK_FREQ * ADJUST_FACTOR);
/* This avoids too fast rate variation. They sound ugly as hell and they /* This avoids too fast rate variation. They sound ugly as hell and they
* make the algorithm unstable (e.g. oscillation around inrate). */ * make the algorithm unstable (e.g. oscillation around inrate). */
if (adj > +ADJUST_MAX) if (adj > +limit)
adj = +ADJUST_MAX; adj = +limit;
if (adj < -ADJUST_MAX) if (adj < -limit)
adj = -ADJUST_MAX; adj = -limit;
unsigned outrate = sys->rate - adj; unsigned outrate = sys->rate - adj;
/* Favor native rate to avoid resampling (FIXME: really a good idea?) */ /* Favor native rate to avoid resampling (FIXME: really a good idea?) */
if (abs(outrate - inrate) < (inrate >> 10)) if (abs(outrate - inrate) < limit)
outrate = inrate; outrate = inrate;
/* This keeps the effective rate within specified range /* This keeps the effective rate within specified range
* (+/-AOUT_MAX_RESAMPLING% - see <vlc_aout.h>) of the nominal rate. */ * (+/-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) if (outrate > inrate + limit)
outrate = inrate + limit; outrate = inrate + limit;
if (outrate < inrate - limit) if (outrate < inrate - limit)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment