aplay: Add samples argument for playing/recording a given number of samples

-s --samples allows aplay to be used for playback/capture a given
number of samples per channel

Signed-off-by: Ion-Horia Petrisor <ion-horia.petrisor@nxp.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Ion-Horia Petrisor 2017-08-09 01:05:58 +03:00 committed by Takashi Iwai
parent 16557c2c7f
commit 3d44e2bc15

View file

@ -100,6 +100,7 @@ static struct {
unsigned int rate; unsigned int rate;
} hwparams, rhwparams; } hwparams, rhwparams;
static int timelimit = 0; static int timelimit = 0;
static int sampleslimit = 0;
static int quiet_mode = 0; static int quiet_mode = 0;
static int file_type = FORMAT_DEFAULT; static int file_type = FORMAT_DEFAULT;
static int open_mode = 0; static int open_mode = 0;
@ -212,6 +213,7 @@ _("Usage: %s [OPTION]... [FILE]...\n"
"-f, --format=FORMAT sample format (case insensitive)\n" "-f, --format=FORMAT sample format (case insensitive)\n"
"-r, --rate=# sample rate\n" "-r, --rate=# sample rate\n"
"-d, --duration=# interrupt after # seconds\n" "-d, --duration=# interrupt after # seconds\n"
"-s, --samples=# interrupt after # samples per channel\n"
"-M, --mmap mmap stream\n" "-M, --mmap mmap stream\n"
"-N, --nonblock nonblocking mode\n" "-N, --nonblock nonblocking mode\n"
"-F, --period-time=# distance between interrupts is # microseconds\n" "-F, --period-time=# distance between interrupts is # microseconds\n"
@ -466,8 +468,9 @@ static long parse_long(const char *str, int *err)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int duration_or_sample = 0;
int option_index; int option_index;
static const char short_options[] = "hnlLD:qt:c:f:r:d:MNF:A:R:T:B:vV:IPCi" static const char short_options[] = "hnlLD:qt:c:f:r:d:s:MNF:A:R:T:B:vV:IPCi"
#ifdef CONFIG_SUPPORT_CHMAP #ifdef CONFIG_SUPPORT_CHMAP
"m:" "m:"
#endif #endif
@ -485,6 +488,7 @@ int main(int argc, char *argv[])
{"format", 1, 0, 'f'}, {"format", 1, 0, 'f'},
{"rate", 1, 0, 'r'}, {"rate", 1, 0, 'r'},
{"duration", 1, 0 ,'d'}, {"duration", 1, 0 ,'d'},
{"samples", 1, 0, 's'},
{"mmap", 0, 0, 'M'}, {"mmap", 0, 0, 'M'},
{"nonblock", 0, 0, 'N'}, {"nonblock", 0, 0, 'N'},
{"period-time", 1, 0, 'F'}, {"period-time", 1, 0, 'F'},
@ -640,11 +644,28 @@ int main(int argc, char *argv[])
} }
break; break;
case 'd': case 'd':
if (duration_or_sample) {
error(_("duration and samples arguments cannot be used together"));
return 1;
}
timelimit = parse_long(optarg, &err); timelimit = parse_long(optarg, &err);
if (err < 0) { if (err < 0) {
error(_("invalid duration argument '%s'"), optarg); error(_("invalid duration argument '%s'"), optarg);
return 1; return 1;
} }
duration_or_sample = 1;
break;
case 's':
if (duration_or_sample) {
error(_("samples and duration arguments cannot be used together"));
return 1;
}
sampleslimit = parse_long(optarg, &err);
if (err < 0) {
error(_("invalid samples argument '%s'"), optarg);
return 1;
}
duration_or_sample = 1;
break; break;
case 'N': case 'N':
nonblock = 1; nonblock = 1;
@ -2477,9 +2498,12 @@ static off64_t calc_count(void)
{ {
off64_t count; off64_t count;
if (timelimit == 0) { if (timelimit == 0)
if (sampleslimit == 0)
count = pbrec_count; count = pbrec_count;
} else { else
count = snd_pcm_format_size(hwparams.format, sampleslimit * hwparams.channels);
else {
count = snd_pcm_format_size(hwparams.format, hwparams.rate * hwparams.channels); count = snd_pcm_format_size(hwparams.format, hwparams.rate * hwparams.channels);
count *= (off64_t)timelimit; count *= (off64_t)timelimit;
} }
@ -3125,7 +3149,7 @@ static void capture(char *orig_name)
/* repeat the loop when format is raw without timelimit or /* repeat the loop when format is raw without timelimit or
* requested counts of data are recorded * requested counts of data are recorded
*/ */
} while ((file_type == FORMAT_RAW && !timelimit) || count > 0); } while ((file_type == FORMAT_RAW && !timelimit && !sampleslimit) || count > 0);
} }
static void playbackv_go(int* fds, unsigned int channels, size_t loaded, off64_t count, int rtype, char **names) static void playbackv_go(int* fds, unsigned int channels, size_t loaded, off64_t count, int rtype, char **names)