Unify simple_none: base_len() exception handling:
1. In the "Input Source" and "3D Control" cases the base-name is the same as the full-name and base_len() simply returns strlen(name). Instead of returning 0 when the type is unknown, set the type to CTL_SINGLE and return strlen(name). This allows removing the special case for base_len() returning 0 in simple_event_add().
2. Move the special handling for "Capture Volume" and "Capture Switch" from simple_event_add() to base_len(), so that we handle all exceptions inside base_len(). Instead of handling some special cases in base_len() and other special cases in simple_event_add().
Signed-off-by: Hans de Goede hdegoede@redhat.com --- src/mixer/simple_none.c | 43 ++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/mixer/simple_none.c b/src/mixer/simple_none.c index e9dc1730..7da7de1e 100644 --- a/src/mixer/simple_none.c +++ b/src/mixer/simple_none.c @@ -907,11 +907,22 @@ static const struct suf { }; #endif
-/* Return base length or 0 on failure */ +/* Return base length */ static int base_len(const char *name, selem_ctl_type_t *type) { const struct suf *p; size_t nlen = strlen(name); + + /* exception: "Capture Volume" and "Capture Switch" */ + if (!strcmp(name, "Capture Volume")) { + *type = CTL_CAPTURE_VOLUME; + return strlen("Capture"); + } + if (!strcmp(name, "Capture Switch")) { + *type = CTL_CAPTURE_SWITCH; + return strlen("Capture"); + } + p = suffixes; while (p->suffix) { size_t slen = strlen(p->suffix); @@ -944,7 +955,9 @@ static int base_len(const char *name, selem_ctl_type_t *type) return strlen(name); } } - return 0; + + *type = CTL_SINGLE; + return strlen(name); }
@@ -1605,8 +1618,10 @@ static int simple_add1(snd_mixer_class_t *class, const char *name, static int simple_event_add(snd_mixer_class_t *class, snd_hctl_elem_t *helem) { const char *name = snd_hctl_elem_get_name(helem); + selem_ctl_type_t type; + char ename[128]; size_t len; - selem_ctl_type_t type = CTL_SINGLE; /* to shut up warning */ + if (snd_hctl_elem_get_interface(helem) != SND_CTL_ELEM_IFACE_MIXER) return 0; if (strcmp(name, "Capture Source") == 0) { @@ -1633,22 +1648,14 @@ static int simple_event_add(snd_mixer_class_t *class, snd_hctl_elem_t *helem) } return 0; } + len = base_len(name, &type); - if (len == 0) { - return simple_add1(class, name, helem, CTL_SINGLE, 0); - } else { - char ename[128]; - if (len >= sizeof(ename)) - len = sizeof(ename) - 1; - memcpy(ename, name, len); - ename[len] = 0; - /* exception: Capture Volume and Capture Switch */ - if (type == CTL_GLOBAL_VOLUME && !strcmp(ename, "Capture")) - type = CTL_CAPTURE_VOLUME; - else if (type == CTL_GLOBAL_SWITCH && !strcmp(ename, "Capture")) - type = CTL_CAPTURE_SWITCH; - return simple_add1(class, ename, helem, type, 0); - } + if (len >= sizeof(ename)) + len = sizeof(ename) - 1; + memcpy(ename, name, len); + ename[len] = 0; + + return simple_add1(class, ename, helem, type, 0); }
static int simple_event_remove(snd_hctl_elem_t *helem,