diff options
author | Jie Yang <yang.jie@intel.com> | 2015-04-27 16:20:57 +0300 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-04-27 22:37:41 +0300 |
commit | b8dd086674cfbfc246a5b9d7d7ff37f62350a878 (patch) | |
tree | 035c115047a4c0fbbf99a352f7f66331e6a53815 /sound/core/ctljack.c | |
parent | 9058cbe1eed29381f84dec9f96980f5a4ea1025f (diff) | |
download | linux-b8dd086674cfbfc246a5b9d7d7ff37f62350a878.tar.xz |
ALSA: Jack: handle jack embedded kcontrol creating within ctljack
This patch adds a static method get_available_index() to
allocate the index of new jack kcontrols and also adds
jack_kctl_name_gen() which is used to ensure compatibility
with jack naming by removing " Jack" from some incorrectly
passed names.
Signed-off-by: Jie Yang <yang.jie@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/ctljack.c')
-rw-r--r-- | sound/core/ctljack.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/sound/core/ctljack.c b/sound/core/ctljack.c index e4b38fbe51da..df7c6cd63c4a 100644 --- a/sound/core/ctljack.c +++ b/sound/core/ctljack.c @@ -31,15 +31,46 @@ static struct snd_kcontrol_new jack_detect_kctl = { .get = jack_detect_kctl_get, }; +static int get_available_index(struct snd_card *card, const char *name) +{ + struct snd_ctl_elem_id sid; + + memset(&sid, 0, sizeof(sid)); + + sid.index = 0; + sid.iface = SNDRV_CTL_ELEM_IFACE_CARD; + strlcpy(sid.name, name, sizeof(sid.name)); + + while (snd_ctl_find_id(card, &sid)) + sid.index++; + + return sid.index; +} + +static void jack_kctl_name_gen(char *name, const char *src_name, int size) +{ + size_t count = strlen(src_name); + bool need_cat = true; + + /* remove redundant " Jack" from src_name */ + if (count >= 5) + need_cat = strncmp(&src_name[count - 5], " Jack", 5) ? true : false; + + snprintf(name, size, need_cat ? "%s Jack" : "%s", src_name); + +} + struct snd_kcontrol * -snd_kctl_jack_new(const char *name, int idx, void *private_data) +snd_kctl_jack_new(const char *name, void *private_data, struct snd_card *card) { struct snd_kcontrol *kctl; + kctl = snd_ctl_new1(&jack_detect_kctl, private_data); if (!kctl) return NULL; - snprintf(kctl->id.name, sizeof(kctl->id.name), "%s Jack", name); - kctl->id.index = idx; + + jack_kctl_name_gen(kctl->id.name, name, sizeof(kctl->id.name)); + kctl->id.index = get_available_index(card, name); kctl->private_value = 0; return kctl; } |