Commit 7726dce1 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Simplify hw_params rules

Several hw_params functions narrows the interval via min/max rule in
the very similar way, so factor out those into a helper function and
use commonly.

No functional changes, just minor code refactoring.
Tested-by: default avatarKeith Milner <kamilner@superlative.org>
Tested-by: default avatarDylan Robinson <dylan_robinson@motu.com>
Link: https://lore.kernel.org/r/20201123085347.19667-12-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 5a6c3e11
...@@ -1121,6 +1121,36 @@ static int hw_check_valid_format(struct snd_usb_substream *subs, ...@@ -1121,6 +1121,36 @@ static int hw_check_valid_format(struct snd_usb_substream *subs,
return 1; return 1;
} }
static int apply_hw_params_minmax(struct snd_interval *it, unsigned int rmin,
unsigned int rmax)
{
int changed;
if (rmin > rmax) {
hwc_debug(" --> get empty\n");
it->empty = 1;
return -EINVAL;
}
changed = 0;
if (it->min < rmin) {
it->min = rmin;
it->openmin = 0;
changed = 1;
}
if (it->max > rmax) {
it->max = rmax;
it->openmax = 0;
changed = 1;
}
if (snd_interval_checkempty(it)) {
it->empty = 1;
return -EINVAL;
}
hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
return changed;
}
static int hw_rule_rate(struct snd_pcm_hw_params *params, static int hw_rule_rate(struct snd_pcm_hw_params *params,
struct snd_pcm_hw_rule *rule) struct snd_pcm_hw_rule *rule)
{ {
...@@ -1128,7 +1158,6 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params, ...@@ -1128,7 +1158,6 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
struct audioformat *fp; struct audioformat *fp;
struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
unsigned int rmin, rmax, r; unsigned int rmin, rmax, r;
int changed;
int i; int i;
hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max); hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max);
...@@ -1151,29 +1180,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params, ...@@ -1151,29 +1180,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
} }
} }
if (rmin > rmax) { return apply_hw_params_minmax(it, rmin, rmax);
hwc_debug(" --> get empty\n");
it->empty = 1;
return -EINVAL;
}
changed = 0;
if (it->min < rmin) {
it->min = rmin;
it->openmin = 0;
changed = 1;
}
if (it->max > rmax) {
it->max = rmax;
it->openmax = 0;
changed = 1;
}
if (snd_interval_checkempty(it)) {
it->empty = 1;
return -EINVAL;
}
hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
return changed;
} }
...@@ -1184,48 +1191,18 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params, ...@@ -1184,48 +1191,18 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params,
struct audioformat *fp; struct audioformat *fp;
struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
unsigned int rmin, rmax; unsigned int rmin, rmax;
int changed;
hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max); hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max);
changed = 0; rmin = UINT_MAX;
rmin = rmax = 0; rmax = 0;
list_for_each_entry(fp, &subs->fmt_list, list) { list_for_each_entry(fp, &subs->fmt_list, list) {
if (!hw_check_valid_format(subs, params, fp)) if (!hw_check_valid_format(subs, params, fp))
continue; continue;
if (changed++) { rmin = min(rmin, fp->channels);
if (rmin > fp->channels) rmax = max(rmax, fp->channels);
rmin = fp->channels;
if (rmax < fp->channels)
rmax = fp->channels;
} else {
rmin = fp->channels;
rmax = fp->channels;
}
} }
if (!changed) { return apply_hw_params_minmax(it, rmin, rmax);
hwc_debug(" --> get empty\n");
it->empty = 1;
return -EINVAL;
}
changed = 0;
if (it->min < rmin) {
it->min = rmin;
it->openmin = 0;
changed = 1;
}
if (it->max > rmax) {
it->max = rmax;
it->openmax = 0;
changed = 1;
}
if (snd_interval_checkempty(it)) {
it->empty = 1;
return -EINVAL;
}
hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
return changed;
} }
static int hw_rule_format(struct snd_pcm_hw_params *params, static int hw_rule_format(struct snd_pcm_hw_params *params,
...@@ -1267,7 +1244,6 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params, ...@@ -1267,7 +1244,6 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params,
struct snd_interval *it; struct snd_interval *it;
unsigned char min_datainterval; unsigned char min_datainterval;
unsigned int pmin; unsigned int pmin;
int changed;
it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME); it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max); hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max);
...@@ -1283,18 +1259,8 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params, ...@@ -1283,18 +1259,8 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params,
return -EINVAL; return -EINVAL;
} }
pmin = 125 * (1 << min_datainterval); pmin = 125 * (1 << min_datainterval);
changed = 0;
if (it->min < pmin) { return apply_hw_params_minmax(it, pmin, UINT_MAX);
it->min = pmin;
it->openmin = 0;
changed = 1;
}
if (snd_interval_checkempty(it)) {
it->empty = 1;
return -EINVAL;
}
hwc_debug(" --> (%u,%u) (changed = %d)\n", it->min, it->max, changed);
return changed;
} }
/* apply PCM hw constraints from the concurrent sync EP */ /* apply PCM hw constraints from the concurrent sync EP */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment