]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsaloop: more avail_min cleanups
authorJaroslav Kysela <perex@perex.cz>
Wed, 24 Oct 2018 13:20:22 +0000 (15:20 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 24 Oct 2018 14:01:06 +0000 (16:01 +0200)
1) do not increase avail_min forever

It seems that there are broken plugins like pulse which returns from poll()
immediately regardless avail_min settings.

2) remove ommited debug printf()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsaloop/pcmjob.c

index 9cf3a5b7d5c2365ddb6903b9535399852ecb382b..4c9517b2093249755893a35c40f9ca438c4fdc38 100644 (file)
@@ -286,8 +286,16 @@ static int increase_playback_avail_min(struct loopback_handle *lhandle)
 {
        snd_pcm_t *handle = lhandle->handle;
        snd_pcm_sw_params_t *swparams;
+       struct timespec ts;
        int err;
 
+       if (lhandle->avail_min + (lhandle->period_size / 2) > lhandle->buffer_size) {
+               /* avoid 100% CPU usage for broken plugins */
+               ts.tv_sec = 0;
+               ts.tv_nsec = 10000;
+               err = nanosleep(&ts, NULL);
+               return 0;
+       }
        snd_pcm_sw_params_alloca(&swparams);
        err = snd_pcm_sw_params_current(handle, swparams);
        if (err < 0) {
@@ -302,7 +310,6 @@ static int increase_playback_avail_min(struct loopback_handle *lhandle)
        snd_pcm_sw_params_get_avail_min(swparams, &lhandle->avail_min);
        if (verbose > 6)
                snd_output_printf(lhandle->loopback->output, "%s: change avail_min=%li\n", lhandle->id, lhandle->avail_min);
-       printf("%s: change avail_min=%li\n", lhandle->id, lhandle->avail_min);
        err = snd_pcm_sw_params(handle, swparams);
        if (err < 0) {
                logit(LOG_CRIT, "Unable to set sw params for %s: %s\n", lhandle->id, snd_strerror(err));