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.
This commit is contained in:
Takashi Iwai 2007-08-29 14:48:31 +02:00
parent 686a32c61f
commit dac0e3b17c

View file

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