]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Handle "Input Source" as a capture element
authorTakashi Iwai <tiwai@suse.de>
Wed, 29 Aug 2007 12:48:31 +0000 (14:48 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 29 Aug 2007 12:48:31 +0000 (14:48 +0200)
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.

src/mixer/simple_none.c

index 9ab2cf06027725205c5352a26e726a3525cc8572..90736cc17bc6ac2d300976720442689defe6d95e 100644 (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)