aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai2020-11-23 09:53:30 +0100
committerTakashi Iwai2020-11-23 15:15:06 +0100
commit61cc2d775e0941ca61b9666760a656919d80077a (patch)
tree921a68050a0905801a37b90d5d391d9f2cbbcb7e
parent75c16b5147ee42270b18b5f32bc3f17f8b74b5eb (diff)
ALSA: usb-audio: Fix EP matching for continuous rates
The function to evaluate the match of the parameters with an EP assumes only the discrete rate tables and doesn't handle the continuous rates properly. This patch fixes match_endpoint_audioformats() to handle the continuous rates. Also the almost useless debug prints there are dropped. Tested-by: Keith Milner <kamilner@superlative.org> Tested-by: Dylan Robinson <dylan_robinson@motu.com> Link: https://lore.kernel.org/r/20201123085347.19667-25-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/usb/pcm.c37
1 files changed, 13 insertions, 24 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index ac6385a4eb70..45a692512d27 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -695,41 +695,30 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs,
struct audioformat *match, int rate,
snd_pcm_format_t pcm_format)
{
- int i;
- int score = 0;
+ int i, score;
- if (fp->channels < 1) {
- dev_dbg(&subs->dev->dev,
- "%s: (fmt @%p) no channels\n", __func__, fp);
+ if (fp->channels < 1)
return 0;
- }
- if (!(fp->formats & pcm_format_to_bits(pcm_format))) {
- dev_dbg(&subs->dev->dev,
- "%s: (fmt @%p) no match for format %d\n", __func__,
- fp, pcm_format);
+ if (!(fp->formats & pcm_format_to_bits(pcm_format)))
return 0;
- }
- for (i = 0; i < fp->nr_rates; i++) {
- if (fp->rate_table[i] == rate) {
- score++;
- break;
+ if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) {
+ if (rate < fp->rate_min || rate > fp->rate_max)
+ return 0;
+ } else {
+ for (i = 0; i < fp->nr_rates; i++) {
+ if (fp->rate_table[i] == rate)
+ break;
}
- }
- if (!score) {
- dev_dbg(&subs->dev->dev,
- "%s: (fmt @%p) no match for rate %d\n", __func__,
- fp, rate);
- return 0;
+ if (i >= fp->nr_rates)
+ return 0;
}
+ score = 1;
if (fp->channels == match->channels)
score++;
- dev_dbg(&subs->dev->dev,
- "%s: (fmt @%p) score %d\n", __func__, fp, score);
-
return score;
}