@@ -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,
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(-)