mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-09 17:45:41 +01:00
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:
parent
986a1bd3d2
commit
c1b92db5ef
1 changed files with 15 additions and 2 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue