Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8edbb198 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

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: default avatarTakashi Iwai <tiwai@suse.de>
parent e6c2e7eb
Loading
Loading
Loading
Loading
+13 −17
Original line number Diff line number Diff line
@@ -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]++;
		/* 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
				id[len - 1] = 'A';
		}
			spos = id + len;
		strcpy(spos, sfxstr);
	}
	/* fallback to the default id */
	if (!is_default) {