summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2013-05-24 16:30:39 +0200
committerTakashi Iwai <tiwai@suse.de>2013-05-24 16:30:39 +0200
commit8edbb198a62e2c3d0bea06ce50a4d45a009849b6 (patch)
tree529fa1b953ae0c688e9ab5fc6c7584286cf18278
parentALSA: Constify the snd_pcm_substream struct ops field (diff)
downloadlinux-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.c30
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) {