mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-10 00:35:42 +01:00
aplay: avoid any further PCM writing if in abort
Terminating stream with CTRL-C will set in_aborting flag which is used to leave any write/read loop on the ALSA device. After ending the read/write loop aplay tries to drain the stream which is not required and can also lead to malfunctions: -If user interrupts a blocked/non responsive PCM (e.g. usb uac2 gadget which does not consume data due to stream stopped by host) it will successfully terminate the write loop but will hang again in drain call. This would require to hit CTRL-C again to unblock which should be avoided. Aplay currently anyhow allows signal handler to get invoked only once. Signed-off-by: Andreas Pape <apape@de.adit-jv.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
00be486131
commit
c9e9a79c6c
1 changed files with 13 additions and 7 deletions
|
@ -2570,7 +2570,9 @@ static void voc_play(int fd, int ofs, char *name)
|
||||||
}
|
}
|
||||||
} /* while(1) */
|
} /* while(1) */
|
||||||
__end:
|
__end:
|
||||||
|
if (!in_aborting) {
|
||||||
voc_pcm_flush();
|
voc_pcm_flush();
|
||||||
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
/* that was a big one, perhaps somebody split it :-) */
|
/* that was a big one, perhaps somebody split it :-) */
|
||||||
|
@ -2885,10 +2887,12 @@ static void playback_go(int fd, size_t loaded, off64_t count, int rtype, char *n
|
||||||
written += r;
|
written += r;
|
||||||
l = 0;
|
l = 0;
|
||||||
}
|
}
|
||||||
|
if (!in_aborting) {
|
||||||
snd_pcm_nonblock(handle, 0);
|
snd_pcm_nonblock(handle, 0);
|
||||||
snd_pcm_drain(handle);
|
snd_pcm_drain(handle);
|
||||||
snd_pcm_nonblock(handle, nonblock);
|
snd_pcm_nonblock(handle, nonblock);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int read_header(int *loaded, int header_size)
|
static int read_header(int *loaded, int header_size)
|
||||||
{
|
{
|
||||||
|
@ -3363,10 +3367,12 @@ static void playbackv_go(int* fds, unsigned int channels, size_t loaded, off64_t
|
||||||
r = r * bits_per_frame / 8;
|
r = r * bits_per_frame / 8;
|
||||||
count -= r;
|
count -= r;
|
||||||
}
|
}
|
||||||
|
if (!in_aborting) {
|
||||||
snd_pcm_nonblock(handle, 0);
|
snd_pcm_nonblock(handle, 0);
|
||||||
snd_pcm_drain(handle);
|
snd_pcm_drain(handle);
|
||||||
snd_pcm_nonblock(handle, nonblock);
|
snd_pcm_nonblock(handle, nonblock);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void capturev_go(int* fds, unsigned int channels, off64_t count, int rtype, char **names)
|
static void capturev_go(int* fds, unsigned int channels, off64_t count, int rtype, char **names)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue