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 <cezary.rojewski@intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Cezary Rojewski 2023-08-04 10:26:50 +02:00 committed by Jaroslav Kysela
parent edff9652c0
commit d55cd9fcd9

View file

@ -101,6 +101,7 @@ static char *command;
static snd_pcm_t *handle; static snd_pcm_t *handle;
static struct { static struct {
snd_pcm_format_t format; snd_pcm_format_t format;
snd_pcm_subformat_t subformat;
unsigned int channels; unsigned int channels;
unsigned int rate; unsigned int rate;
} hwparams, rhwparams; } hwparams, rhwparams;
@ -216,6 +217,7 @@ _("Usage: %s [OPTION]... [FILE]...\n"
"-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-t, --file-type TYPE file type (voc, wav, raw or au)\n"
"-c, --channels=# channels\n" "-c, --channels=# channels\n"
"-f, --format=FORMAT sample format (case insensitive)\n" "-f, --format=FORMAT sample format (case insensitive)\n"
" --subformat=SUBFORMAT sample subformat (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" "-s, --samples=# interrupt after # samples per channel\n"
@ -434,6 +436,7 @@ enum {
OPT_USE_STRFTIME, OPT_USE_STRFTIME,
OPT_DUMP_HWPARAMS, OPT_DUMP_HWPARAMS,
OPT_FATAL_ERRORS, OPT_FATAL_ERRORS,
OPT_SUBFORMAT,
}; };
/* /*
@ -491,6 +494,7 @@ int main(int argc, char *argv[])
{"file-type", 1, 0, 't'}, {"file-type", 1, 0, 't'},
{"channels", 1, 0, 'c'}, {"channels", 1, 0, 'c'},
{"format", 1, 0, 'f'}, {"format", 1, 0, 'f'},
{"subformat", 1, 0, OPT_SUBFORMAT},
{"rate", 1, 0, 'r'}, {"rate", 1, 0, 'r'},
{"duration", 1, 0 ,'d'}, {"duration", 1, 0 ,'d'},
{"samples", 1, 0, 's'}, {"samples", 1, 0, 's'},
@ -566,6 +570,7 @@ int main(int argc, char *argv[])
chunk_size = -1; chunk_size = -1;
rhwparams.format = DEFAULT_FORMAT; rhwparams.format = DEFAULT_FORMAT;
rhwparams.subformat = SND_PCM_SUBFORMAT_STD;
rhwparams.rate = DEFAULT_SPEED; rhwparams.rate = DEFAULT_SPEED;
rhwparams.channels = 1; rhwparams.channels = 1;
@ -635,6 +640,13 @@ int main(int argc, char *argv[])
} }
} }
break; 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': case 'r':
tmp = parse_long(optarg, &err); tmp = parse_long(optarg, &err);
if (err < 0) { if (err < 0) {
@ -1372,6 +1384,11 @@ static void set_params(void)
show_available_sample_formats(params); show_available_sample_formats(params);
prg_exit(EXIT_FAILURE); 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); err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels);
if (err < 0) { if (err < 0) {
error(_("Channels count non available")); error(_("Channels count non available"));
@ -2404,6 +2421,7 @@ static void voc_play(int fd, int ofs, char *name)
} }
} }
hwparams.format = DEFAULT_FORMAT; hwparams.format = DEFAULT_FORMAT;
hwparams.subformat = SND_PCM_SUBFORMAT_STD;
hwparams.channels = 1; hwparams.channels = 1;
hwparams.rate = DEFAULT_SPEED; hwparams.rate = DEFAULT_SPEED;
set_params(); set_params();