At Tue, 2 Jun 2009 11:31:04 +0200, Daniel Mack wrote:
On Tue, Jun 02, 2009 at 09:49:39AM +0200, Takashi Iwai wrote:
So what's your suggestion to fix the behaviour I was describing? Maybe a combination of Jaroslav's collision detection together with a logic that does not touch the id in case it was passed as module option?
Sounds reasonable. We may need just a number suffix if any collision occurs.
What about that patch below? Works well in my tests here.
Looks almost good, but we need to check snd_info_check_reserved_words() too.
I guess the routine in choose_default_id() can be reused for this function, though.
Jaroslav seems working on this now, so maybe he could better cope with you...
Takashi
Daniel
From 7f7544af491f6073da3aea72c64f5725c50246c8 Mon Sep 17 00:00:00 2001
From: Daniel Mack daniel@caiaq.de Date: Tue, 2 Jun 2009 11:23:41 +0200 Subject: [PATCH] ALSA: introduce snd_card_make_id_unique()
Sound card drivers may choose their own way to provide a nice sound card ID, especially when the default behaviour taken by choose_default_name() is not appropriate. ALSA's IDs must be unique, so there is need for some core logic to ensure that.
This patch adds the function snd_card_make_id_unique() to the ALSA core which lowlevel drivers can call to make sure the computed string isn't already taken.
Signed-off-by: Daniel Mack daniel@caiaq.de Cc: Takashi Iwai tiwai@suse.de Cc: Jaroslav Kysela perex@perex.cz
include/sound/core.h | 1 + sound/core/init.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/include/sound/core.h b/include/sound/core.h index 3dea798..01ea816 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -319,6 +319,7 @@ int snd_card_info_done(void); int snd_component_add(struct snd_card *card, const char *component); int snd_card_file_add(struct snd_card *card, struct file *file); int snd_card_file_remove(struct snd_card *card, struct file *file); +void snd_card_make_id_unique(struct snd_card *card);
#ifndef snd_card_set_dev #define snd_card_set_dev(card, devptr) ((card)->dev = (devptr)) diff --git a/sound/core/init.c b/sound/core/init.c index fd56afe..8503a01 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -547,6 +547,51 @@ static void choose_default_id(struct snd_card *card) } }
+static int +card_id_is_ambiguous(struct snd_card *card, const char *id) +{
- int i;
- for (i = 0; i < snd_ecards_limit; i++) {
/* only run for exisiting cards but not for the
* one in question */
if (i == card->number || !snd_cards[i])
continue;
if (strcmp(snd_cards[i]->id, id) == 0)
return 1;
- }
- return 0;
+}
+void +snd_card_make_id_unique(struct snd_card *card) +{
- int count = 1;
- char id[sizeof(card->id)];
- if (*card->id == '\0')
return;
- strlcpy(id, card->id, sizeof(id));
- while (card_id_is_ambiguous(card, id)) {
/* As we need to add some characters to the id, make
* sure there's enough room for it */
int maxlen = sizeof(card->id) - (2 + (count / 10));
if (strlen(card->id) > maxlen)
card->id[maxlen] = '\0';
snprintf(id, sizeof(id), "%s_%d", card->id, count);
count++;
- }
- strlcpy(card->id, id, sizeof(id));
+} +EXPORT_SYMBOL_GPL(snd_card_make_id_unique);
#ifndef CONFIG_SYSFS_DEPRECATED static ssize_t card_id_show_attr(struct device *dev, -- 1.6.3.1