when an underrun happens, increase watermark by 10ms instead of doubling it

This commit is contained in:
Lennart Poettering 2009-02-27 01:15:06 +01:00
parent 0d8f67b826
commit 1c86267e1f
2 changed files with 39 additions and 10 deletions

View file

@ -64,6 +64,7 @@
#define DEFAULT_DEVICE "default"
#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */
#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */
#define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */
@ -88,7 +89,16 @@ struct userdata {
pa_cvolume hardware_volume;
size_t frame_size, fragment_size, hwbuf_size, tsched_watermark, hwbuf_unused, min_sleep, min_wakeup;
size_t
frame_size,
fragment_size,
hwbuf_size,
tsched_watermark,
hwbuf_unused,
min_sleep,
min_wakeup,
watermark_step;
unsigned nfragments;
char *device_name;
@ -202,10 +212,12 @@ static void adjust_after_overrun(struct userdata *u) {
pa_usec_t old_min_latency, new_min_latency;
pa_assert(u);
pa_assert(u->use_tsched);
/* First, just try to increase the watermark */
old_watermark = u->tsched_watermark;
u->tsched_watermark *= 2;
u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_step);
fix_tsched_watermark(u);
if (old_watermark != u->tsched_watermark) {
@ -216,7 +228,8 @@ static void adjust_after_overrun(struct userdata *u) {
/* Hmm, we cannot increase the watermark any further, hence let's raise the latency */
old_min_latency = u->source->thread_info.min_latency;
new_min_latency = PA_MIN(old_min_latency * 2, u->source->thread_info.max_latency);
new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_STEP_USEC);
new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency);
if (old_min_latency != new_min_latency) {
pa_log_notice("Increasing minimal latency to %0.2f ms",
@ -1521,6 +1534,8 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
if (use_tsched) {
fix_min_sleep_wakeup(u);
fix_tsched_watermark(u);
u->watermark_step = pa_usec_to_bytes(TSCHED_WATERMARK_STEP_USEC, &u->source->sample_spec);
}
pa_source_set_latency_range(u->source,