]> git.alsa-project.org Git - alsa-lib.git/commitdiff
namehint: Don't enumerate as duplex if only a single direction is defined
authorTakashi Iwai <tiwai@suse.de>
Thu, 12 May 2016 14:30:44 +0000 (16:30 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 12 May 2016 14:30:44 +0000 (16:30 +0200)
When a hint description has only either device_input or device_output,
we shouldn't handle it as a full duplex but rather a single
direction.  In that way, we can avoid to list up a playback stream
like dmix or surround51 as a capture stream in the namehint.

Reported-by: Trent Reed <treed0803@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/control/namehint.c

index 856957c76d74cfd504861aef80e7ed8de6d8f36b..ad8dda37a6370ceab8199b9944bee812d671bc40 100644 (file)
@@ -28,6 +28,7 @@
 #include "local.h"
 
 #ifndef DOC_HIDDEN
+#define DEV_SKIP       9999 /* some non-existing device number */
 struct hint_list {
        char **list;
        unsigned int count;
@@ -90,7 +91,7 @@ static int get_dev_name1(struct hint_list *list, char **res, int device,
                         int stream)
 {
        *res = NULL;
-       if (device < 0)
+       if (device < 0 || device == DEV_SKIP)
                return 0;
        switch (list->iface) {
 #ifdef BUILD_HWDEP
@@ -317,7 +318,9 @@ static int try_config(snd_config_t *config,
                                err = -EINVAL;
                                goto __cleanup;
                        }
-                       list->device_output = -1;
+                       /* skip the counterpart if only a single direction is defined */
+                       if (list->device_output < 0)
+                               list->device_output = DEV_SKIP;
                }
                if (snd_config_search(cfg, "device_output", &n) >= 0) {
                        if (snd_config_get_integer(n, &list->device_output) < 0) {
@@ -325,6 +328,9 @@ static int try_config(snd_config_t *config,
                                err = -EINVAL;
                                goto __cleanup;
                        }
+                       /* skip the counterpart if only a single direction is defined */
+                       if (list->device_input < 0)
+                               list->device_input = DEV_SKIP;
                }
        } else if (level == 1 && !list->show_all)
                goto __skip_add;