mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-10 03:35:42 +01:00
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:
parent
16557c2c7f
commit
3d44e2bc15
1 changed files with 29 additions and 5 deletions
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue