aplay: fix the CPU busy loop in the pause handler

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>
This commit is contained in:
Jaroslav Kysela 2020-11-08 19:11:12 +01:00
parent 986a1bd3d2
commit c1b92db5ef

View file

@ -1553,6 +1553,19 @@ static void done_stdin(void)
tcsetattr(fileno(stdin), TCSANOW, &term); 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) static void do_pause(void)
{ {
int err; int err;
@ -1571,7 +1584,7 @@ static void do_pause(void)
return; return;
} }
while (1) { while (1) {
while (read(fileno(stdin), &b, 1) != 1); b = wait_for_input();
if (b == ' ' || b == '\r') { if (b == ' ' || b == '\r') {
while (read(fileno(stdin), &b, 1) == 1); while (read(fileno(stdin), &b, 1) == 1);
if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED) 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); while (read(fileno(stdin), &b, 1) == 1);
fprintf(stderr, _("\r=== PAUSE === ")); fprintf(stderr, _("\r=== PAUSE === "));
fflush(stderr); fflush(stderr);
do_pause(); do_pause();
fprintf(stderr, " \r"); fprintf(stderr, " \r");
fflush(stderr); fflush(stderr);
} }