ALSA: Fix the default suffix string with high card number
authorTakashi Iwai <tiwai@suse.de>
Fri, 24 May 2013 14:30:39 +0000 (16:30 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 24 May 2013 14:30:39 +0000 (16:30 +0200)
ALSA core tries to add a suffix as "_1" automatically when the given
id string conflicts.  The current code assumes implicitly that the max
card number is 16 so that the single hex "_X" suffix can be put.
However, with the dynamic device management, the card can be at most
32, so it can put even a non-hex character there.  Also, when the max
card number is increased in future, this would result in worse.

This patch rewrites the code to add the suffix string in a simpler
(thus cleaner) way.  It can support up to three digits, so it should
suffice for most requirements.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/init.c

index 6ef0640..ed4a481 100644 (file)
@@ -549,7 +549,6 @@ static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
                                    const char *nid)
 {
        int len, loops;
-       bool with_suffix;
        bool is_default = false;
        char *id;
        
@@ -565,26 +564,23 @@ static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
                is_default = true;
        }
 
-       with_suffix = false;
+       len = strlen(id);
        for (loops = 0; loops < SNDRV_CARDS; loops++) {
+               char *spos;
+               char sfxstr[5]; /* "_012" */
+               int sfxlen;
+
                if (card_id_ok(card, id))
                        return; /* OK */
 
-               len = strlen(id);
-               if (!with_suffix) {
-                       /* add the "_X" suffix */
-                       char *spos = id + len;
-                       if (len >  sizeof(card->id) - 3)
-                               spos = id + sizeof(card->id) - 3;
-                       strcpy(spos, "_1");
-                       with_suffix = true;
-               } else {
-                       /* modify the existing suffix */
-                       if (id[len - 1] != '9')
-                               id[len - 1]++;
-                       else
-                               id[len - 1] = 'A';
-               }
+               /* Add _XYZ suffix */
+               sprintf(sfxstr, "_%X", loops + 1);
+               sfxlen = strlen(sfxstr);
+               if (len + sfxlen >= sizeof(card->id))
+                       spos = id + sizeof(card->id) - sfxlen - 1;
+               else
+                       spos = id + len;
+               strcpy(spos, sfxstr);
        }
        /* fallback to the default id */
        if (!is_default) {