]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: Merge lookup for data reference into tplg_copy_data()
authorMengdong Lin <mengdong.lin@linux.intel.com>
Fri, 15 Jul 2016 12:18:11 +0000 (20:18 +0800)
committerTakashi Iwai <tiwai@suse.de>
Sun, 17 Jul 2016 07:59:48 +0000 (09:59 +0200)
Code refactor to reduce function calls. Now tplg_copy_data() can look up
a referenced data element and merge its data.

Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com>
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/topology/ctl.c
src/topology/dapm.c
src/topology/data.c
src/topology/tplg_local.h

index 7ded0a42ec1d63bda5a990e905eadc1adac58cbd..592dded7aa6ae2a3a019f63c3e130a911918223b 100644 (file)
@@ -140,9 +140,9 @@ static int tplg_build_mixer_control(snd_tplg_t *tplg,
                                 err = copy_tlv(elem, ref->elem);
 
                } else if (ref->type == SND_TPLG_TYPE_DATA) {
-                       ref->elem = tplg_elem_lookup(&tplg->pdata_list,
-                                               ref->id, SND_TPLG_TYPE_DATA);
-                        err = tplg_copy_data(elem, ref->elem);
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
                }
 
                if (!ref->elem) {
@@ -188,9 +188,9 @@ static int tplg_build_enum_control(snd_tplg_t *tplg,
                                copy_enum_texts(elem, ref->elem);
 
                } else if (ref->type == SND_TPLG_TYPE_DATA) {
-                       ref->elem = tplg_elem_lookup(&tplg->pdata_list,
-                                               ref->id, SND_TPLG_TYPE_DATA);
-                       err = tplg_copy_data(elem, ref->elem);
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
                }
                if (!ref->elem) {
                        SNDERR("error: cannot find '%s' referenced by"
@@ -208,6 +208,7 @@ static int tplg_build_bytes_control(snd_tplg_t *tplg, struct tplg_elem *elem)
 {
        struct tplg_ref *ref;
        struct list_head *base, *pos;
+       int err;
 
        base = &elem->ref_list;
 
@@ -217,18 +218,11 @@ static int tplg_build_bytes_control(snd_tplg_t *tplg, struct tplg_elem *elem)
                if (ref->id == NULL || ref->elem)
                        continue;
 
-               /* bytes control only reference one private data section */
-               ref->elem = tplg_elem_lookup(&tplg->pdata_list,
-                       ref->id, SND_TPLG_TYPE_DATA);
-               if (!ref->elem) {
-                       SNDERR("error: cannot find data '%s'"
-                               " referenced by control '%s'\n",
-                               ref->id, elem->id);
-                       return -EINVAL;
+                if (ref->type == SND_TPLG_TYPE_DATA) {
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
                }
-
-               /* copy texts to enum elem */
-               return tplg_copy_data(elem, ref->elem);
        }
 
        return 0;
index d8eb10c1196cac3cee1f7667528666c2231cbc72..4d343b2fe2f4f43259729a7f2e8c4942a6844aa0 100644 (file)
@@ -191,12 +191,11 @@ static int tplg_build_widget(snd_tplg_t *tplg,
                        break;
 
                case SND_TPLG_TYPE_DATA:
-                       if (!ref->elem)
-                               ref->elem = tplg_elem_lookup(&tplg->pdata_list,
-                                               ref->id, SND_TPLG_TYPE_DATA);
-                       if (ref->elem)
-                               err = tplg_copy_data(elem, ref->elem);
+                       err = tplg_copy_data(tplg, elem, ref);
+                       if (err < 0)
+                               return err;
                        break;
+
                default:
                        break;
                }
index 0c5469a873183b76769a2e806564cb37b8ba6bb2..e60114e9a578f806add2b7eb8ed8e10d2917bc71 100644 (file)
@@ -889,22 +889,30 @@ int tplg_parse_data(snd_tplg_t *tplg, snd_config_t *cfg,
        return err;
 }
 
-/* Merge data from a referenced data element to the parent element's
- * private data buffer.
+/* Find a referenced data element and copy its data to the parent
+ * element's private data buffer.
  * An element can refer to multiple data sections. Data of these sections
  * will be merged in the their reference order.
  */
-int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
+int tplg_copy_data(snd_tplg_t *tplg, struct tplg_elem *elem,
+                  struct tplg_ref *ref)
 {
+       struct tplg_elem *ref_elem;
        struct snd_soc_tplg_private *priv, *old_priv;
        int priv_data_size, old_priv_data_size;
        void *obj;
 
-       if (!ref)
+       ref_elem = tplg_elem_lookup(&tplg->pdata_list,
+                                    ref->id, SND_TPLG_TYPE_DATA);
+       if (!ref_elem) {
+               SNDERR("error: cannot find data '%s' referenced by"
+               " element '%s'\n", ref->id, elem->id);
                return -EINVAL;
+       }
 
        tplg_dbg("Data '%s' used by '%s'\n", ref->id, elem->id);
-       if (!ref->data || !ref->data->size) /* overlook empty private data */
+       /* overlook empty private data */
+       if (!ref_elem->data || !ref_elem->data->size)
                return 0;
 
        old_priv = get_priv_data(elem);
@@ -912,7 +920,7 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
                return -EINVAL;
        old_priv_data_size = old_priv->size;
 
-       priv_data_size = ref->data->size;
+       priv_data_size = ref_elem->data->size;
        obj = realloc(elem->obj,
                        elem->size + priv_data_size);
        if (!obj)
@@ -926,9 +934,9 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
        /* merge the new data block */
        elem->size += priv_data_size;
        priv->size = priv_data_size + old_priv_data_size;
-       ref->compound_elem = 1;
+       ref_elem->compound_elem = 1;
        memcpy(priv->data + old_priv_data_size,
-              ref->data->data, priv_data_size);
+              ref_elem->data->data, priv_data_size);
        return 0;
 }
 
index 4daa540775201d5cd6f11e12df866457a9270107..518b81eded1f234f9ca83ca75854aca17e918c2a 100644 (file)
@@ -228,7 +228,9 @@ int tplg_build_widgets(snd_tplg_t *tplg);
 int tplg_build_routes(snd_tplg_t *tplg);
 int tplg_build_pcm_dai(snd_tplg_t *tplg, unsigned int type);
 
-int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref);
+int tplg_copy_data(snd_tplg_t *tplg, struct tplg_elem *elem,
+                  struct tplg_ref *ref);
+
 int tplg_parse_data_refs(snd_config_t *cfg, struct tplg_elem *elem);
 
 int tplg_ref_add(struct tplg_elem *elem, int type, const char* id);