From d55cd9fcd9e96e96b27bea778c70dd4459e6d2a3 Mon Sep 17 00:00:00 2001 From: Cezary Rojewski Date: Fri, 4 Aug 2023 10:26:50 +0200 Subject: [PATCH] aplay: Add option for specifying subformat Make subformat first-class citizen by allowing users to specify it just like it is the case for the format. Default to SND_PCM_SUBFORMAT_STD so they are no surprises. Closes: https://github.com/alsa-project/alsa-utils/pull/228 Signed-off-by: Cezary Rojewski Signed-off-by: Jaroslav Kysela --- aplay/aplay.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/aplay/aplay.c b/aplay/aplay.c index f1c27b6..03443df 100644 --- a/aplay/aplay.c +++ b/aplay/aplay.c @@ -101,6 +101,7 @@ static char *command; static snd_pcm_t *handle; static struct { snd_pcm_format_t format; + snd_pcm_subformat_t subformat; unsigned int channels; unsigned int rate; } hwparams, rhwparams; @@ -216,6 +217,7 @@ _("Usage: %s [OPTION]... [FILE]...\n" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -434,6 +436,7 @@ enum { OPT_USE_STRFTIME, OPT_DUMP_HWPARAMS, OPT_FATAL_ERRORS, + OPT_SUBFORMAT, }; /* @@ -491,6 +494,7 @@ int main(int argc, char *argv[]) {"file-type", 1, 0, 't'}, {"channels", 1, 0, 'c'}, {"format", 1, 0, 'f'}, + {"subformat", 1, 0, OPT_SUBFORMAT}, {"rate", 1, 0, 'r'}, {"duration", 1, 0 ,'d'}, {"samples", 1, 0, 's'}, @@ -566,6 +570,7 @@ int main(int argc, char *argv[]) chunk_size = -1; rhwparams.format = DEFAULT_FORMAT; + rhwparams.subformat = SND_PCM_SUBFORMAT_STD; rhwparams.rate = DEFAULT_SPEED; rhwparams.channels = 1; @@ -635,6 +640,13 @@ int main(int argc, char *argv[]) } } break; + case OPT_SUBFORMAT: + rhwparams.subformat = snd_pcm_subformat_value(optarg); + if (rhwparams.subformat == SND_PCM_SUBFORMAT_UNKNOWN) { + error(_("wrong extended subformat '%s'"), optarg); + prg_exit(EXIT_FAILURE); + } + break; case 'r': tmp = parse_long(optarg, &err); if (err < 0) { @@ -1372,6 +1384,11 @@ static void set_params(void) show_available_sample_formats(params); prg_exit(EXIT_FAILURE); } + err = snd_pcm_hw_params_set_subformat(handle, params, hwparams.subformat); + if (err < 0) { + error(_("Sample subformat not available")); + prg_exit(EXIT_FAILURE); + } err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels); if (err < 0) { error(_("Channels count non available")); @@ -2404,6 +2421,7 @@ static void voc_play(int fd, int ofs, char *name) } } hwparams.format = DEFAULT_FORMAT; + hwparams.subformat = SND_PCM_SUBFORMAT_STD; hwparams.channels = 1; hwparams.rate = DEFAULT_SPEED; set_params();