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@xxxxxxxx> > 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@xxxxxxxx> > Cc: Takashi Iwai <tiwai@xxxxxxx> > Cc: Jaroslav Kysela <perex@xxxxxxxx> > --- > 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 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel