Allow max 10 rewinds in 200 ms in order to try to counteract the eternal rewind issues still seen on low-end CPUs (e g Atom) BugLink: http://bugs.launchpad.net/bugs/825709 Signed-off-by: David Henningsson <david.henningsson at canonical.com> --- src/pulsecore/sink.c | 8 ++++++++ src/pulsecore/sink.h | 2 ++ 2 files changed, 10 insertions(+), 0 deletions(-) diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index d97fb7e..2d006a5 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -332,6 +332,7 @@ pa_sink* pa_sink_new( s->thread_info.state = s->state; s->thread_info.rewind_nbytes = 0; s->thread_info.rewind_requested = FALSE; + PA_INIT_RATELIMIT(s->thread_info.rewind_limit, PA_USEC_PER_MSEC * 200, 10); /* max 10 rewinds in 200 ms */ s->thread_info.max_rewind = 0; s->thread_info.max_request = 0; s->thread_info.requested_latency_valid = FALSE; @@ -932,6 +933,13 @@ void pa_sink_process_rewind(pa_sink *s, size_t nbytes) { if (s->monitor_source && PA_SOURCE_IS_LINKED(s->monitor_source->thread_info.state)) pa_source_process_rewind(s->monitor_source, nbytes); } + + if (!pa_ratelimit_test(&s->thread_info.rewind_limit, PA_LOG_DEBUG)) { + pa_log_warn("Okay, I'm sick and tired of all this rewinding. I'm going to sleep for %lu ms!", + s->thread_info.rewind_limit.interval / PA_USEC_PER_MSEC); + usleep(s->thread_info.rewind_limit.interval); + pa_log_debug("Waking up."); + } } /* Called from IO thread context */ diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 0642dda..8c998e8 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -47,6 +47,7 @@ typedef struct pa_sink_volume_change pa_sink_volume_change; #include <pulsecore/queue.h> #include <pulsecore/thread-mq.h> #include <pulsecore/sink-input.h> +#include <pulsecore/ratelimit.h> #define PA_MAX_INPUTS_PER_SINK 32 @@ -261,6 +262,7 @@ struct pa_sink { /* Maximum of what clients requested to rewind in this cycle */ size_t rewind_nbytes; pa_bool_t rewind_requested; + pa_ratelimit rewind_limit; /* Both dynamic and fixed latencies will be clamped to this * range. */ -- 1.7.5.4 --------------020001070507010201070107--