From 9e4599820ae52719ba1bd4584297a2130369992a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 21 Dec 2008 17:55:29 +0100 Subject: make sure we don't hit an assert when we issue two rewind requests in a single iteration Closes rhbz 472757. --- src/pulsecore/sink-input.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index bed3d322..850042b3 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -1147,7 +1147,8 @@ void pa_sink_input_request_rewind(pa_sink_input *i, size_t nbytes /* in our sam * implementor. This implies 'flush' is TRUE. */ pa_sink_input_assert_ref(i); - pa_assert(i->thread_info.rewrite_nbytes == 0); + + nbytes = PA_MAX(i->thread_info.rewrite_nbytes, nbytes); /* pa_log_debug("request rewrite %lu", (unsigned long) nbytes); */ @@ -1175,26 +1176,33 @@ void pa_sink_input_request_rewind(pa_sink_input *i, size_t nbytes /* in our sam nbytes = pa_resampler_request(i->thread_info.resampler, nbytes); } - if (rewrite) { - /* Make sure to not overwrite over underruns */ - if (nbytes > i->thread_info.playing_for) - nbytes = (size_t) i->thread_info.playing_for; + if (i->thread_info.rewrite_nbytes != (size_t) -1) { + if (rewrite) { + /* Make sure to not overwrite over underruns */ + if (nbytes > i->thread_info.playing_for) + nbytes = (size_t) i->thread_info.playing_for; - i->thread_info.rewrite_nbytes = nbytes; - } else - i->thread_info.rewrite_nbytes = (size_t) -1; + i->thread_info.rewrite_nbytes = nbytes; + } else + i->thread_info.rewrite_nbytes = (size_t) -1; + } - i->thread_info.rewrite_flush = flush && i->thread_info.rewrite_nbytes != 0; + i->thread_info.rewrite_flush = + i->thread_info.rewrite_flush || + (flush && i->thread_info.rewrite_nbytes != 0); - /* Transform to sink domain */ - if (i->thread_info.resampler) - nbytes = pa_resampler_result(i->thread_info.resampler, nbytes); + if (nbytes != (size_t) -1) { - if (nbytes > lbq) - pa_sink_request_rewind(i->sink, nbytes - lbq); - else - /* This call will make sure process_rewind() is called later */ - pa_sink_request_rewind(i->sink, 0); + /* Transform to sink domain */ + if (i->thread_info.resampler) + nbytes = pa_resampler_result(i->thread_info.resampler, nbytes); + + if (nbytes > lbq) + pa_sink_request_rewind(i->sink, nbytes - lbq); + else + /* This call will make sure process_rewind() is called later */ + pa_sink_request_rewind(i->sink, 0); + } } /* Called from main context */ -- cgit