summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenedek Kupper <benedek.kupper@streamunlimited.com>2021-10-20 22:28:23 +0200
committerJaroslav Kysela <perex@perex.cz>2022-05-20 18:44:42 +0200
commitd85c0d8d46dc161ca3d7deea01549b7097c9f1c9 (patch)
treeeca4f0a674e6efd23e0fe23d605d1b8c08470791
parenta19ce72310ee6687ea3312528f3182e7cf516957 (diff)
downloadalsa-lib-d85c0d8d46dc161ca3d7deea01549b7097c9f1c9.tar.gz
pcm: hw: add "min_rate" and "max_rate" as alternatives to single "rate" parameter
Fixes: https://github.com/alsa-project/alsa-lib/pull/191 Signed-off-by: Benedek Kupper <benedek.kupper@streamunlimited.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--src/pcm/pcm_hw.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c
index bd93fa37..c8cede69 100644
--- a/src/pcm/pcm_hw.c
+++ b/src/pcm/pcm_hw.c
@@ -104,7 +104,10 @@ typedef struct {
int period_timer_need_poll;
/* restricted parameters */
snd_pcm_format_t format;
- int rate;
+ struct {
+ int min;
+ int max;
+ } rates;
int channels;
/* for chmap */
unsigned int chmap_caps;
@@ -350,9 +353,13 @@ static int snd_pcm_hw_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
if (err < 0)
return err;
}
- if (hw->rate > 0) {
+ if (hw->rates.min > 0) {
err = _snd_pcm_hw_param_set_minmax(params, SND_PCM_HW_PARAM_RATE,
- hw->rate, 0, hw->rate + 1, -1);
+#if 1 // TODO: find out which arguments are correct
+ hw->rates.min, 0, hw->rates.max + 1, -1);
+#else
+ hw->rates.min, 0, hw->rates.max, 0);
+#endif
if (err < 0)
return err;
}
@@ -1619,7 +1626,7 @@ int snd_pcm_hw_open_fd(snd_pcm_t **pcmp, const char *name, int fd,
hw->fd = fd;
/* no restriction */
hw->format = SND_PCM_FORMAT_UNKNOWN;
- hw->rate = 0;
+ hw->rates.min = hw->rates.max = 0;
hw->channels = 0;
ret = snd_pcm_new(&pcm, SND_PCM_TYPE_HW, name, info.stream, mode);
@@ -1799,7 +1806,7 @@ int _snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
long card = -1, device = 0, subdevice = -1;
const char *str;
int err, sync_ptr_ioctl = 0;
- int rate = 0, channels = 0;
+ int rate = 0, channels = 0, min_rate = 0, max_rate = 0;
snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
snd_config_t *n;
int nonblock = 1; /* non-block per default */
@@ -1866,6 +1873,26 @@ int _snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
rate = val;
continue;
}
+ if (strcmp(id, "min_rate") == 0) {
+ long val;
+ err = snd_config_get_integer(n, &val);
+ if (err < 0) {
+ SNDERR("Invalid type for %s", id);
+ goto fail;
+ }
+ min_rate = val;
+ continue;
+ }
+ if (strcmp(id, "max_rate") == 0) {
+ long val;
+ err = snd_config_get_integer(n, &val);
+ if (err < 0) {
+ SNDERR("Invalid type for %s", id);
+ goto fail;
+ }
+ max_rate = val;
+ continue;
+ }
if (strcmp(id, "format") == 0) {
err = snd_config_get_string(n, &str);
if (err < 0) {
@@ -1904,6 +1931,11 @@ int _snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
err = -EINVAL;
goto fail;
}
+ if ((min_rate < 0) || (max_rate < min_rate)) {
+ SNDERR("min_rate - max_rate configuration invalid");
+ err = -EINVAL;
+ goto fail;
+ }
err = snd_pcm_hw_open(pcmp, name, card, device, subdevice, stream,
mode | (nonblock ? SND_PCM_NONBLOCK : 0),
0, sync_ptr_ioctl);
@@ -1926,8 +1958,14 @@ int _snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
hw->format = format;
if (channels > 0)
hw->channels = channels;
- if (rate > 0)
- hw->rate = rate;
+ if ((min_rate == 0) && (max_rate == 0)) {
+ min_rate = rate;
+ max_rate = rate;
+ }
+ if (min_rate > 0) {
+ hw->rates.min = min_rate;
+ hw->rates.max = max_rate;
+ }
if (chmap)
hw->chmap_override = chmap;