]> git.alsa-project.org Git - alsa-lib.git/commitdiff
PCM: Fix the conversion from string to chmap position
authorTakashi Iwai <tiwai@suse.de>
Wed, 12 Sep 2012 16:44:42 +0000 (18:44 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 13 Sep 2012 06:24:59 +0000 (08:24 +0200)
Use strncasecmp() to allow lower cases, and also evaluate the inverted
phase suffix, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm.c

index d01fa90ddb9094817f4f78ce27b009fd0731ba25..7624c3b2d02d5a2d596bb9ff6921981d7804a69a 100644 (file)
@@ -7471,24 +7471,41 @@ int snd_pcm_chmap_print(const snd_pcm_chmap_t *map, size_t maxlen, char *buf)
 static int str_to_chmap(const char *str, int len)
 {
        int val;
+       unsigned long v;
+       char *p;
 
        if (isdigit(*str)) {
-               val = atoi(str);
-               if (val < 0)
+               v = strtoul(str, &p, 0);
+               if (v == ULONG_MAX)
                        return -1;
-               return val | SND_CHMAP_DRIVER_SPEC;
-       } else if (str[0] == 'C' && str[1] == 'h') {
-               val = atoi(str + 2);
-               if (val < 0)
+               val = v;
+               val |= SND_CHMAP_DRIVER_SPEC;
+               str = p;
+       } else if (!strncasecmp(str, "ch", 2)) {
+               v = strtoul(str + 2, &p, 0);
+               if (v == ULONG_MAX)
                        return -1;
-               return val;
+               val = v;
+               str = p;
        } else {
                for (val = 0; val <= SND_CHMAP_LAST; val++) {
-                       if (!strncmp(str, chmap_names[val], len))
-                               return val;
+                       int slen;
+                       assert(chmap_names[val]);
+                       slen = strlen(chmap_names[val]);
+                       if (slen > len)
+                               continue;
+                       if (!strncasecmp(str, chmap_names[val], slen) &&
+                           !isalpha(str[slen])) {
+                               str += slen;
+                               break;
+                       }
                }
-               return -1;
+               if (val > SND_CHMAP_LAST)
+                       return -1;
        }
+       if (str && !strncasecmp(str, "[INV]", 5))
+               val |= SND_CHMAP_PHASE_INVERSE;
+       return val;
 }
 
 unsigned int snd_pcm_chmap_from_string(const char *str)