diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index 886c735f9..073413f00 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -88,6 +88,8 @@ #define DEFAULT_REWIND_SAFEGUARD_BYTES (256U) /* 1.33ms @48kHz, we'll never rewind less than this */ #define DEFAULT_REWIND_SAFEGUARD_USEC (1330) /* 1.33ms, depending on channels/rate/sample we may rewind more than 256 above */ +#define DEFAULT_WRITE_ITERATION_THRESHOLD 0.03 /* don't iterate write if < 3% of the buffer is available */ + struct userdata { pa_core *core; pa_module *module; @@ -580,11 +582,18 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bo break; } - if (++j > 10) { + j++; + + if (j > 10) { #ifdef DEBUG_TIMING pa_log_debug("Not filling up, because already too many iterations."); #endif + break; + } else if (j >= 2 && (n_bytes < (DEFAULT_WRITE_ITERATION_THRESHOLD * (u->hwbuf_size - u->hwbuf_unused)))) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because <%g%% available.", DEFAULT_WRITE_ITERATION_THRESHOLD * 100); +#endif break; } @@ -754,11 +763,18 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bo break; } - if (++j > 10) { + j++; + + if (j > 10) { #ifdef DEBUG_TIMING pa_log_debug("Not filling up, because already too many iterations."); #endif + break; + } else if (j >= 2 && (n_bytes < (DEFAULT_WRITE_ITERATION_THRESHOLD * (u->hwbuf_size - u->hwbuf_unused)))) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because <%g%% available.", DEFAULT_WRITE_ITERATION_THRESHOLD * 100); +#endif break; }