diff options
author | Takashi Iwai <tiwai@suse.de> | 2013-05-24 16:30:39 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2013-05-24 16:30:39 +0200 |
commit | 8edbb198a62e2c3d0bea06ce50a4d45a009849b6 (patch) | |
tree | 529fa1b953ae0c688e9ab5fc6c7584286cf18278 | |
parent | ALSA: Constify the snd_pcm_substream struct ops field (diff) | |
download | linux-8edbb198a62e2c3d0bea06ce50a4d45a009849b6.tar.xz linux-8edbb198a62e2c3d0bea06ce50a4d45a009849b6.zip |
ALSA: Fix the default suffix string with high card number
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>
-rw-r--r-- | sound/core/init.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/sound/core/init.c b/sound/core/init.c index 6ef06400dfc8..ed4a4811b6a1 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -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) { |