aplay/arecord: option to treat any xrun as fatal

Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Ben Gardiner 2012-03-15 23:51:02 -04:00 committed by Takashi Iwai
parent a2b66855e6
commit 658c3cfd57
2 changed files with 19 additions and 2 deletions

View file

@ -191,6 +191,10 @@ lists capabilities of the selected device such as supported formats,
sampling rates, numbers of channels, period and buffer bytes/sizes/times. sampling rates, numbers of channels, period and buffer bytes/sizes/times.
For raw device hw:X this option basically lists hardware capabilities of For raw device hw:X this option basically lists hardware capabilities of
the soundcard. the soundcard.
.TP
\fI\-\-fatal\-errors\fP
Disables recovery attempts when errors (e.g. xrun) are encountered; the
aplay process instead aborts immediately.
.SH SIGNALS .SH SIGNALS
When recording, SIGINT, SIGTERM and SIGABRT will close the output When recording, SIGINT, SIGTERM and SIGABRT will close the output

View file

@ -115,6 +115,7 @@ static int stop_delay = 0;
static int monotonic = 0; static int monotonic = 0;
static int interactive = 0; static int interactive = 0;
static int can_pause = 0; static int can_pause = 0;
static int fatal_errors = 0;
static int verbose = 0; static int verbose = 0;
static int vumeter = VUMETER_NONE; static int vumeter = VUMETER_NONE;
static int buffer_pos = 0; static int buffer_pos = 0;
@ -225,7 +226,8 @@ _("Usage: %s [OPTION]... [FILE]...\n"
" for this many seconds\n" " for this many seconds\n"
" --process-id-file write the process ID here\n" " --process-id-file write the process ID here\n"
" --use-strftime apply the strftime facility to the output file name\n" " --use-strftime apply the strftime facility to the output file name\n"
" --dump-hw-params dump hw_params of the device\n") " --dump-hw-params dump hw_params of the device\n"
" --fatal-errors treat all errors as fatal\n")
, command); , command);
printf(_("Recognized sample formats are:")); printf(_("Recognized sample formats are:"));
for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) { for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) {
@ -419,7 +421,8 @@ enum {
OPT_MAX_FILE_TIME, OPT_MAX_FILE_TIME,
OPT_PROCESS_ID_FILE, OPT_PROCESS_ID_FILE,
OPT_USE_STRFTIME, OPT_USE_STRFTIME,
OPT_DUMP_HWPARAMS OPT_DUMP_HWPARAMS,
OPT_FATAL_ERRORS,
}; };
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -465,6 +468,7 @@ int main(int argc, char *argv[])
{"use-strftime", 0, 0, OPT_USE_STRFTIME}, {"use-strftime", 0, 0, OPT_USE_STRFTIME},
{"interactive", 0, 0, 'i'}, {"interactive", 0, 0, 'i'},
{"dump-hw-params", 0, 0, OPT_DUMP_HWPARAMS}, {"dump-hw-params", 0, 0, OPT_DUMP_HWPARAMS},
{"fatal-errors", 0, 0, OPT_FATAL_ERRORS},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
char *pcm_name = "default"; char *pcm_name = "default";
@ -669,6 +673,9 @@ int main(int argc, char *argv[])
case OPT_DUMP_HWPARAMS: case OPT_DUMP_HWPARAMS:
dump_hw_params = 1; dump_hw_params = 1;
break; break;
case OPT_FATAL_ERRORS:
fatal_errors = 1;
break;
default: default:
fprintf(stderr, _("Try `%s --help' for more information.\n"), command); fprintf(stderr, _("Try `%s --help' for more information.\n"), command);
return 1; return 1;
@ -1350,6 +1357,12 @@ static void xrun(void)
prg_exit(EXIT_FAILURE); prg_exit(EXIT_FAILURE);
} }
if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) { if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) {
if (fatal_errors) {
error(_("fatal %s: %s"),
stream == SND_PCM_STREAM_PLAYBACK ? _("underrun") : _("overrun"),
snd_strerror(res));
prg_exit(EXIT_FAILURE);
}
if (monotonic) { if (monotonic) {
#ifdef HAVE_CLOCK_GETTIME #ifdef HAVE_CLOCK_GETTIME
struct timespec now, diff, tstamp; struct timespec now, diff, tstamp;