OSDN Git Service

topology: Use generic pointer to realloc buffer for private data
authorMengdong Lin <mengdong.lin@linux.intel.com>
Fri, 29 Apr 2016 03:03:22 +0000 (11:03 +0800)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 May 2016 08:30:39 +0000 (10:30 +0200)
Many element types have private data. So use the generic obj pointer
instead of the type-specific pointer when reallocating the object to
accommodate the private data.

Empty private data will be overlooked.

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

index 19c31bf..9f8d5d0 100644 (file)
@@ -822,44 +822,36 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
 {
        struct snd_soc_tplg_private *priv;
        int priv_data_size;
+       void *obj;
 
        if (!ref)
                return -EINVAL;
 
        tplg_dbg("Data '%s' used by '%s'\n", ref->id, elem->id);
+       if (!ref->data || !ref->data->size) /* overlook empty private data */
+               return 0;
+
        priv_data_size = ref->data->size;
+       obj = realloc(elem->obj,
+                       elem->size + priv_data_size);
+       if (!obj)
+               return -ENOMEM;
+       elem->obj = obj;
 
        switch (elem->type) {
        case SND_TPLG_TYPE_MIXER:
-               elem->mixer_ctrl = realloc(elem->mixer_ctrl,
-                       elem->size + priv_data_size);
-               if (!elem->mixer_ctrl)
-                       return -ENOMEM;
                priv = &elem->mixer_ctrl->priv;
                break;
 
        case SND_TPLG_TYPE_ENUM:
-               elem->enum_ctrl = realloc(elem->enum_ctrl,
-                       elem->size + priv_data_size);
-               if (!elem->enum_ctrl)
-                       return -ENOMEM;
                priv = &elem->enum_ctrl->priv;
                break;
 
        case SND_TPLG_TYPE_BYTES:
-               elem->bytes_ext = realloc(elem->bytes_ext,
-                       elem->size + priv_data_size);
-               if (!elem->bytes_ext)
-                       return -ENOMEM;
                priv = &elem->bytes_ext->priv;
                break;
 
-
        case SND_TPLG_TYPE_DAPM_WIDGET:
-               elem->widget = realloc(elem->widget,
-                       elem->size + priv_data_size);
-               if (!elem->widget)
-                       return -ENOMEM;
                priv = &elem->widget->priv;
                break;