]> git.alsa-project.org Git - alsa-lib.git/commitdiff
add snd_device_name_get_hint() function, make hints private to alsa-lib (void)
authorJaroslav Kysela <perex@perex.cz>
Thu, 30 Nov 2006 12:41:53 +0000 (13:41 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 30 Nov 2006 12:41:53 +0000 (13:41 +0100)
We can define more string groups for one hint now. It is quite easy
flexible for future.

src/Versions
src/control/namehint.c

index 1060b7cdbdea9759e9e6286a49f7f5c2807a1e4d..0836304512c76ce2c578161eb03381f3ca60ff2e 100644 (file)
@@ -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;
index ae2d8c7b4f7b1b83474ff5c721974d2da2cbd371..8c879f7eec008d69a4d5cff326ff0cb0bca421e5 100644 (file)
@@ -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;
+}