[alsa-devel] [RFCv3][PATCH 29/39] axfer: add options for plugins in alsa-lib
Takashi Sakamoto
o-takashi at sakamocchi.jp
Mon Oct 2 02:19:30 CEST 2017
As of 2017, two userspace library implementations are known; alsa-lib and
tinyalsa. The latter is simple I/O library to use ALSA PCM interface. On
the other hand, alsa-lib is more complicated than it. This is because it's
designed to add features to transmission of data frames; e.g. sample
resampling. To achieve this, alsa-lib has its configuration space and
plugin system.
In aplay, some options are implemented as a flag for the plugins in
alsa-lib. The flag is given to snd_pcm_open(). This commit adds support
for the flags.
Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
---
axfer/options.c | 17 +++++++++++++++++
axfer/options.h | 6 ++++++
axfer/xfer-libasound.c | 8 ++++++++
3 files changed, 31 insertions(+)
diff --git a/axfer/options.c b/axfer/options.c
index a22223a0..bca87d14 100644
--- a/axfer/options.c
+++ b/axfer/options.c
@@ -19,6 +19,10 @@ enum no_short_opts {
OPT_TEST_NOWAIT,
OPT_PERIOD_SIZE,
OPT_BUFFER_SIZE,
+ OPT_DISABLE_RESAMPLE,
+ OPT_DISABLE_CHANNELS,
+ OPT_DISABLE_FORMAT,
+ OPT_DISABLE_SOFTVOL,
/* Obsoleted. */
OPT_MAX_FILE_TIME,
};
@@ -348,6 +352,11 @@ int context_options_init(struct context_options *opts, int argc,
{"avail-min", 1, 0, 'A'},
{"start-delay", 1, 0, 'R'},
{"stop-delay", 1, 0, 'T'},
+ /* For plugins in alsa-lib. */
+ {"disable-resample", 0, 0, OPT_DISABLE_RESAMPLE},
+ {"disable-channels", 0, 0, OPT_DISABLE_CHANNELS},
+ {"disable-format", 0, 0, OPT_DISABLE_FORMAT},
+ {"disable-softvol", 0, 0, OPT_DISABLE_SOFTVOL},
/* For debugging. */
{"dump-hw-params", 0, 0, OPT_DUMP_HW_PARAMS},
{"fatal-errors", 0, 0, OPT_FATAL_ERRORS},
@@ -409,6 +418,14 @@ int context_options_init(struct context_options *opts, int argc,
opts->msec_for_start_threshold = parse_l(optarg, &err);
else if (c == 'T')
opts->msec_for_stop_threshold = parse_l(optarg, &err);
+ else if (c == OPT_DISABLE_RESAMPLE)
+ opts->no_auto_resample = true;
+ else if (c == OPT_DISABLE_CHANNELS)
+ opts->no_auto_channels = true;
+ else if (c == OPT_DISABLE_FORMAT)
+ opts->no_auto_format = true;
+ else if (c == OPT_DISABLE_SOFTVOL)
+ opts->no_softvol = true;
else if (c == OPT_DUMP_HW_PARAMS)
opts->dump_hw_params = true;
else if (c == OPT_FATAL_ERRORS)
diff --git a/axfer/options.h b/axfer/options.h
index 63b36364..95012ad3 100644
--- a/axfer/options.h
+++ b/axfer/options.h
@@ -45,6 +45,12 @@ struct context_options {
unsigned int msec_for_start_threshold;
unsigned int msec_for_stop_threshold;
+ /* For plugins in alsa-lib. */
+ bool no_auto_resample;
+ bool no_auto_channels;
+ bool no_auto_format;
+ bool no_softvol;
+
/* For debugging. */
bool dump_hw_params;
bool finish_at_xrun;
diff --git a/axfer/xfer-libasound.c b/axfer/xfer-libasound.c
index 533c9492..e01327e2 100644
--- a/axfer/xfer-libasound.c
+++ b/axfer/xfer-libasound.c
@@ -15,6 +15,14 @@ static int get_mode(struct context_options *options)
if (options->nonblock)
mode |= SND_PCM_NONBLOCK;
+ if (options->no_auto_resample)
+ mode |= SND_PCM_NO_AUTO_RESAMPLE;
+ if (options->no_auto_channels)
+ mode |= SND_PCM_NO_AUTO_CHANNELS;
+ if (options->no_auto_format)
+ mode |= SND_PCM_NO_AUTO_FORMAT;
+ if (options->no_softvol)
+ mode |= SND_PCM_NO_SOFTVOL;
return mode;
}
--
2.11.0
More information about the Alsa-devel
mailing list