From: Takashi Iwai Date: Wed, 29 Aug 2007 12:48:31 +0000 (+0200) Subject: Handle "Input Source" as a capture element X-Git-Tag: v1.0.15rc1~2 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=dac0e3b17c03864005f7424d774c55d6cf0b0494;p=alsa-lib.git Handle "Input Source" as a capture element Some drivers use "Input Source" as the capture source mixer element because mixer abstraction layer can't handle multiple "Capture Source" elements. This patch adds a hack to handle Input Source as a capture route, and let mixer apps know that it's a capture stuff, at least. --- diff --git a/src/mixer/simple_none.c b/src/mixer/simple_none.c index 9ab2cf06..90736cc1 100644 --- a/src/mixer/simple_none.c +++ b/src/mixer/simple_none.c @@ -918,6 +918,19 @@ static int base_len(const char *name, selem_ctl_type_t *type) } p++; } + + /* Special case - handle "Input Source" as a capture route. + * Note that it's *NO* capture source. A capture source is split over + * sub-elements, and multiple capture-sources will result in an error. + * That's why some drivers use "Input Source" as a workaround. + * Hence, this is a workaround for a workaround to get the things + * straight back again. Sigh. + */ + if (!strcmp(name, "Input Source")) { + *type = CTL_CAPTURE_ROUTE; + return strlen(name); + } + return 0; } @@ -1629,7 +1642,12 @@ static int simple_add1(snd_mixer_class_t *class, const char *name, { unsigned int n; if (ctype == SND_CTL_ELEM_TYPE_ENUMERATED) { - type = CTL_GLOBAL_ENUM; + if (type == CTL_PLAYBACK_ROUTE) + type = CTL_PLAYBACK_ENUM; + else if (type == CTL_CAPTURE_ROUTE) + type = CTL_CAPTURE_ENUM; + else + type = CTL_GLOBAL_ENUM; break; } if (ctype != SND_CTL_ELEM_TYPE_BOOLEAN) @@ -1644,7 +1662,12 @@ static int simple_add1(snd_mixer_class_t *class, const char *name, case CTL_PLAYBACK_SWITCH: case CTL_CAPTURE_SWITCH: if (ctype == SND_CTL_ELEM_TYPE_ENUMERATED) { - type = CTL_GLOBAL_ENUM; + if (type == CTL_PLAYBACK_SWITCH) + type = CTL_PLAYBACK_ENUM; + else if (type == CTL_CAPTURE_SWITCH) + type = CTL_CAPTURE_ENUM; + else + type = CTL_GLOBAL_ENUM; break; } if (ctype != SND_CTL_ELEM_TYPE_BOOLEAN) @@ -1654,7 +1677,12 @@ static int simple_add1(snd_mixer_class_t *class, const char *name, case CTL_PLAYBACK_VOLUME: case CTL_CAPTURE_VOLUME: if (ctype == SND_CTL_ELEM_TYPE_ENUMERATED) { - type = CTL_GLOBAL_ENUM; + if (type == CTL_PLAYBACK_VOLUME) + type = CTL_PLAYBACK_ENUM; + else if (type == CTL_CAPTURE_VOLUME) + type = CTL_CAPTURE_ENUM; + else + type = CTL_GLOBAL_ENUM; break; } if (ctype != SND_CTL_ELEM_TYPE_INTEGER)