diff options
author | Takashi Iwai <tiwai@suse.de> | 2012-09-12 18:44:42 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2012-09-13 08:24:59 +0200 |
commit | c6db60e32758e8f4bb6f066a5c6fc7758a0f4c49 (patch) | |
tree | c7cdb74cc043581358872df16687769dc729cc50 | |
parent | f7300682dc0fe9faec94461af6fdcf098047a0d1 (diff) | |
download | alsa-lib-c6db60e32758e8f4bb6f066a5c6fc7758a0f4c49.tar.gz |
PCM: Fix the conversion from string to chmap position
Use strncasecmp() to allow lower cases, and also evaluate the inverted
phase suffix, too.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | src/pcm/pcm.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index d01fa90d..7624c3b2 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -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) |