]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ALSA: usb-audio: Fix EP matching for continuous rates
authorTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 08:53:30 +0000 (09:53 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 14:15:06 +0000 (15:15 +0100)
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>
sound/usb/pcm.c

index ac6385a4eb70ed63b6beef032f350c578957a688..45a692512d273ef89dc39ba2257b135044f613ab 100644 (file)
@@ -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;
 }