diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pulsecore/sink-input.c | 42 |
1 files changed, 25 insertions, 17 deletions
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 */ |