]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Parse and build private data of physical links
authorMengdong Lin <mengdong.lin@linux.intel.com>
Sun, 6 Nov 2016 05:14:25 +0000 (13:14 +0800)
committerTakashi Iwai <tiwai@suse.de>
Tue, 8 Nov 2016 15:33:21 +0000 (16:33 +0100)
Users can define private data for physical links by C API or text conf
file. Private data pointer is added to C API template for physical links.

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

index 3692da4b56032aa8cebad94f49e9e2344191e920..ad84c155fe81146332a95c16c2fb9e49c8927f85 100644 (file)
@@ -996,6 +996,7 @@ struct snd_tplg_link_template {
 
        unsigned int flag_mask;         /* bitmask of flags to configure */
        unsigned int flags;             /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
+       struct snd_soc_tplg_private *priv; /*!< private data */
 };
 
 /** \struct snd_tplg_obj_template
index a751851d28e3d24d5ce64da22d60f144eec7d6aa..1d70396fedf3a98029899de7da687b3932f26de4 100644 (file)
@@ -162,7 +162,7 @@ static int build_link(snd_tplg_t *tplg, struct tplg_elem *elem)
        if (err < 0)
                return err;
 
-       /* hw configs */
+       /* hw configs & private data */
        base = &elem->ref_list;
        list_for_each(pos, base) {
 
@@ -185,6 +185,12 @@ static int build_link(snd_tplg_t *tplg, struct tplg_elem *elem)
                        num_hw_configs++;
                        break;
 
+               case SND_TPLG_TYPE_DATA: /* merge private data */
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
+                       break;
+
                default:
                        break;
                }
@@ -1043,5 +1049,24 @@ int tplg_add_link_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
        /* flags */
        link->flag_mask = link_tpl->flag_mask;
        link->flags = link_tpl->flags;
+
+       /* private data */
+       if (link_tpl->priv != NULL && link_tpl->priv->size) {
+               _link = realloc(link,
+                       elem->size + link_tpl->priv->size);
+               if (!_link) {
+                       tplg_elem_free(elem);
+                       return -ENOMEM;
+               }
+
+               link = _link;
+               elem->link = link;
+               elem->size += link_tpl->priv->size;
+
+               memcpy(link->priv.data, link_tpl->priv->data,
+                       link_tpl->priv->size);
+               link->priv.size = link_tpl->priv->size;
+       }
+
        return 0;
 }