]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Add support for vendor tokens
authorMengdong Lin <mengdong.lin@linux.intel.com>
Thu, 7 Apr 2016 07:29:36 +0000 (15:29 +0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 7 Apr 2016 14:57:22 +0000 (16:57 +0200)
Vendor can define a token list in SectionVendorTokens. Each token element
is a pair of string ID and integer value. And both the ID and value are
vendor-specific.

Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/topology.h
src/topology/data.c
src/topology/elem.c
src/topology/parser.c
src/topology/tplg_local.h

index 51d282f6a1cfc123713174b0af2e2a58c306278f..0df112cc4a4d295866b6d185d3d3f75eaaa83f49 100644 (file)
@@ -578,6 +578,7 @@ enum snd_tplg_type {
        SND_TPLG_TYPE_BE,               /*!< BE DAI link */
        SND_TPLG_TYPE_CC,               /*!< Hostless codec <-> codec link */
        SND_TPLG_TYPE_MANIFEST,         /*!< Topology manifest */
+       SND_TPLG_TYPE_TOKEN,            /*!< Vendor tokens */
 };
 
 /**
index 370c0faead368aea9a1fed4bd662c49dc86195da..8455c15abf095fdf9bd5c69edada69e01a7a31d9 100644 (file)
@@ -253,6 +253,56 @@ static int tplg_parse_data_hex(snd_config_t *cfg, struct tplg_elem *elem,
        return ret;
 }
 
+/* Parse vendor tokens
+ */
+int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
+       void *private ATTRIBUTE_UNUSED)
+{
+       snd_config_iterator_t i, next;
+       snd_config_t *n;
+       const char *id, *value;
+       struct tplg_elem *elem;
+       struct tplg_vendor_tokens *tokens;
+       int num_tokens = 0;
+
+       elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_TOKEN);
+       if (!elem)
+               return -ENOMEM;
+
+       snd_config_for_each(i, next, cfg) {
+               num_tokens++;
+       }
+
+       if (!num_tokens)
+               return 0;
+
+       tplg_dbg(" Vendor tokens: %s, %d tokens\n", elem->id, num_tokens);
+
+       tokens = calloc(1, sizeof(*tokens)
+                       + num_tokens * sizeof(struct tplg_token));
+       if (!tokens)
+               return -ENOMEM;
+       elem->tokens = tokens;
+
+       snd_config_for_each(i, next, cfg) {
+
+               n = snd_config_iterator_entry(i);
+               if (snd_config_get_id(n, &id) < 0)
+                       continue;
+
+               if (snd_config_get_string(n, &value) < 0)
+                       continue;
+
+               elem_copy_text(tokens->token[tokens->num_tokens].id, id,
+                               SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
+               tokens->token[tokens->num_tokens].value = atoi(value);
+               tplg_dbg("\t\t %s : %d\n", tokens->token[tokens->num_tokens].id,
+                       tokens->token[tokens->num_tokens].value);
+               tokens->num_tokens++;
+       }
+
+       return 0;
+}
 
 /* Parse Private data.
  *
index f2afaafd4cebec7b2499d0e2e9b2e5c3262e6b87..95e3fd44baf79cad5608a3d227e50c9ce207dd18 100644 (file)
@@ -193,6 +193,9 @@ struct tplg_elem* tplg_elem_new_common(snd_tplg_t *tplg,
                list_add_tail(&elem->list, &tplg->cc_list);
                obj_size = sizeof(struct snd_soc_tplg_link_config);
                break;
+       case SND_TPLG_TYPE_TOKEN:
+               list_add_tail(&elem->list, &tplg->token_list);
+               break;
        default:
                free(elem);
                return NULL;
index 45462577e71c02f6ea12e30bc40343c3b9f610db..264abc81a792d0168a10fe845b1dd2c8b20bc945 100644 (file)
@@ -173,6 +173,14 @@ static int tplg_parse_config(snd_tplg_t *tplg, snd_config_t *cfg)
                        continue;
                }
 
+               if (strcmp(id, "SectionVendorTokens") == 0) {
+                       err = tplg_parse_compound(tplg, n, tplg_parse_tokens,
+                               NULL);
+                       if (err < 0)
+                               return err;
+                       continue;
+               }
+
                SNDERR("error: unknown section %s\n", id);
        }
        return 0;
@@ -407,6 +415,7 @@ snd_tplg_t *snd_tplg_new(void)
        INIT_LIST_HEAD(&tplg->mixer_list);
        INIT_LIST_HEAD(&tplg->enum_list);
        INIT_LIST_HEAD(&tplg->bytes_ext_list);
+       INIT_LIST_HEAD(&tplg->token_list);
 
        return tplg;
 }
@@ -426,6 +435,7 @@ void snd_tplg_free(snd_tplg_t *tplg)
        tplg_elem_free_list(&tplg->mixer_list);
        tplg_elem_free_list(&tplg->enum_list);
        tplg_elem_free_list(&tplg->bytes_ext_list);
+       tplg_elem_free_list(&tplg->token_list);
 
        free(tplg);
 }
index 7368a8673bfdba9fd2fb801cee096877fe27111f..679bfffdba780010fb58069e216b1246affd20dd 100644 (file)
@@ -69,6 +69,7 @@ struct snd_tplg {
        struct list_head route_list;
        struct list_head text_list;
        struct list_head pdata_list;
+       struct list_head token_list;
        struct list_head pcm_config_list;
        struct list_head pcm_caps_list;
 
@@ -86,6 +87,16 @@ struct tplg_ref {
        struct list_head list;
 };
 
+/* element for vendor tokens */
+struct tplg_token {
+       char id[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+       unsigned int value;
+};
+
+struct tplg_vendor_tokens {
+       unsigned int num_tokens;
+       struct tplg_token token[0];
+};
 /* topology element */
 struct tplg_elem {
 
@@ -118,6 +129,7 @@ struct tplg_elem {
                /* these do not map to UAPI structs but are internal only */
                struct snd_soc_tplg_ctl_tlv *tlv;
                struct snd_soc_tplg_private *data;
+               struct tplg_vendor_tokens *tokens;
        };
 
        /* an element may refer to other elements:
@@ -151,6 +163,9 @@ int tplg_parse_text(snd_tplg_t *tplg, snd_config_t *cfg,
 int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
        void *private ATTRIBUTE_UNUSED);
 
+int tplg_parse_tokens(snd_tplg_t *tplg, snd_config_t *cfg,
+       void *private ATTRIBUTE_UNUSED);
+
 int tplg_parse_control_bytes(snd_tplg_t *tplg,
        snd_config_t *cfg, void *private ATTRIBUTE_UNUSED);