From: Mengdong Lin mengdong.lin@linux.intel.com
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
diff --git a/include/topology.h b/include/topology.h index 3692da4..ad84c15 100644 --- a/include/topology.h +++ b/include/topology.h @@ -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 diff --git a/src/topology/pcm.c b/src/topology/pcm.c index a751851..1d70396 100644 --- a/src/topology/pcm.c +++ b/src/topology/pcm.c @@ -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; }