]> git.alsa-project.org Git - alsa-utils.git/commitdiff
aplay: fix the CPU busy loop in the pause handler
authorJaroslav Kysela <perex@perex.cz>
Sun, 8 Nov 2020 18:11:12 +0000 (19:11 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 8 Nov 2020 18:11:22 +0000 (19:11 +0100)
Use the standard poll mechanism to ensure that there's
something in the input to avoid busy loop on the file
descriptor with the non-block mode set.

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

index ae609880bfd7fc6c4c4589ef1166eaccc60ac1cf..d385da25fea15f0e592cb45cb39f26c28258522d 100644 (file)
@@ -1553,6 +1553,19 @@ static void done_stdin(void)
        tcsetattr(fileno(stdin), TCSANOW, &term);
 }
 
+static char wait_for_input(void)
+{
+       struct pollfd pfd;
+       unsigned char b;
+
+       do {
+               pfd.fd = fileno(stdin);
+               pfd.events = POLLIN;
+               poll(&pfd, 1, -1);
+       } while (read(fileno(stdin), &b, 1) != 1);
+       return b;
+}
+
 static void do_pause(void)
 {
        int err;
@@ -1571,7 +1584,7 @@ static void do_pause(void)
                return;
        }
        while (1) {
-               while (read(fileno(stdin), &b, 1) != 1);
+               b = wait_for_input();
                if (b == ' ' || b == '\r') {
                        while (read(fileno(stdin), &b, 1) == 1);
                        if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED)
@@ -1596,7 +1609,7 @@ static void check_stdin(void)
                                while (read(fileno(stdin), &b, 1) == 1);
                                fprintf(stderr, _("\r=== PAUSE ===                                                            "));
                                fflush(stderr);
-                       do_pause();
+                               do_pause();
                                fprintf(stderr, "                                                                          \r");
                                fflush(stderr);
                        }