diff options
author | Jaroslav Kysela <perex@perex.cz> | 2006-11-30 13:41:53 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2006-11-30 13:41:53 +0100 |
commit | 1ba513f96f69243e628608d4d7a2ca3072e3d448 (patch) | |
tree | 3cf3e5e49339b8722b78266b67fcec03bea9838a | |
parent | 70c20571e12692ef2fc1c376982af762f0da6562 (diff) | |
download | alsa-lib-1ba513f96f69243e628608d4d7a2ca3072e3d448.tar.gz |
add snd_device_name_get_hint() function, make hints private to alsa-lib (void)
We can define more string groups for one hint now. It is quite easy
flexible for future.
-rw-r--r-- | src/Versions | 1 | ||||
-rw-r--r-- | src/control/namehint.c | 77 |
2 files changed, 63 insertions, 15 deletions
diff --git a/src/Versions b/src/Versions index 1060b7cd..08363045 100644 --- a/src/Versions +++ b/src/Versions @@ -294,4 +294,5 @@ ALSA_1.0.14 { snd_device_name_hint; snd_device_name_free_hint; + snd_device_name_get_hint; } ALSA_1.0.12; diff --git a/src/control/namehint.c b/src/control/namehint.c index ae2d8c7b..8c879f7e 100644 --- a/src/control/namehint.c +++ b/src/control/namehint.c @@ -62,12 +62,13 @@ static int hint_list_add(struct hint_list *list, if (name == NULL) { x = NULL; } else { - x = malloc(strlen(name) + (description != NULL ? (strlen(description) + 1) : 0) + 1); + x = malloc(4 + strlen(name) + (description != NULL ? (4 + strlen(description) + 1) : 0) + 1); if (x == NULL) return -ENOMEM; - strcpy(x, name); + memcpy(x, "NAME", 4); + strcpy(x + 4, name); if (description != NULL) { - strcat(x, "|"); + strcat(x, "|DESC"); strcat(x, description); } } @@ -172,10 +173,10 @@ static char *get_dev_name(struct hint_list *list) return res; } else { if (str1 != NULL) { - str2 = list->iface == SND_CTL_ELEM_IFACE_PCM ? "Capture" : "Input"; + str2 = "Input"; } else { str1 = str2; - str2 = list->iface == SND_CTL_ELEM_IFACE_PCM ? "Playback" : "Output"; + str2 = "Output"; } res = malloc(strlen(list->cardname) + strlen(str1) + 19); if (res == NULL) { @@ -185,9 +186,8 @@ static char *get_dev_name(struct hint_list *list) strcpy(res, list->cardname); strcat(res, ", "); strcat(res, str1); - strcat(res, " {"); + strcat(res, "|IOID"); strcat(res, str2); - strcat(res, "}"); free(str1); return res; } @@ -349,11 +349,18 @@ static int try_config(struct hint_list *list, list->device = dev; str = list->card >= 0 ? get_dev_name(list) : NULL; if (str != NULL) { - buf2 = realloc((char *)str, (buf1 == NULL ? 0 : strlen(buf1)) + 1 + strlen(str) + 1); + level = (buf1 == NULL ? 0 : strlen(buf1)) + 1 + strlen(str); + buf2 = realloc((char *)str, level + 1); if (buf2 != NULL) { if (buf1 != NULL) { - strcat(buf2, "\n"); - strcat(buf2, buf1); + str = strchr(buf2, '|'); + if (str != NULL) + memmove(buf2 + (level - strlen(str)), str, strlen(str)); + else + str = buf2 + strlen(buf2); + *(char *)str++ = '\n'; + memcpy((char *)str, buf1, strlen(buf1)); + buf2[level] = '\0'; free(buf1); } buf1 = buf2; @@ -489,7 +496,7 @@ static int get_card_name(struct hint_list *list, int card) * Special variables: defaults.namehint.showall specifies if all device * definitions are accepted (boolean type). */ -int snd_device_name_hint(int card, const char *iface, char ***hints) +int snd_device_name_hint(int card, const char *iface, void ***hints) { struct hint_list list; char ehints[24]; @@ -557,7 +564,7 @@ int snd_device_name_hint(int card, const char *iface, char ***hints) err = 0; __error: if (err < 0) { - snd_device_name_free_hint(list.list); + snd_device_name_free_hint((void **)list.list); if (list.cardname) free(list.cardname); return err; @@ -565,7 +572,7 @@ int snd_device_name_hint(int card, const char *iface, char ***hints) err = hint_list_add(&list, NULL, NULL); if (err < 0) goto __error; - *hints = list.list; + *hints = (void **)list.list; if (list.cardname) free(list.cardname); } @@ -577,13 +584,13 @@ int snd_device_name_hint(int card, const char *iface, char ***hints) * \param hints A string list to free * \result zero if success, otherwise a negative error code */ -int snd_device_name_free_hint(char **hints) +int snd_device_name_free_hint(void **hints) { char **h; if (hints == NULL) return 0; - h = hints; + h = (char **)hints; while (*h) { free(*h); h++; @@ -591,3 +598,43 @@ int snd_device_name_free_hint(char **hints) free(hints); return 0; } + +/** + * \brief Get a hint Free a string list with device name hints. + * \param hints A string list to free + * \result an allocated ASCII string if success, otherwise NULL + * + * List of valid IDs: + * NAME - name of device + * DESC - description of device + * IOID - input / output identification (Input or Output strings), + * not present (NULL) means both + */ +char *snd_device_name_get_hint(const void *hint, const char *id) +{ + const char *hint1 = (const char *)hint, *delim; + char *res; + unsigned size; + + if (strlen(id) != 4) + return NULL; + while (*hint1 != '\0') { + delim = strchr(hint1, '|'); + if (memcmp(id, hint1, 4) != 0) { + if (delim == NULL) + return NULL; + hint1 = delim + 1; + continue; + } + if (delim == NULL) + return strdup(hint1 + 4); + size = delim - hint1 - 4; + res = malloc(size + 1); + if (res != NULL) { + memcpy(res, hint1 + 4, size); + res[size] = '\0'; + } + return res; + } + return NULL; +} |