mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	topology: Use generic pointer to realloc buffer for private data
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>
This commit is contained in:
		
							parent
							
								
									86ec8b4900
								
							
						
					
					
						commit
						0935e32d40
					
				
					 1 changed files with 9 additions and 17 deletions
				
			
		| 
						 | 
					@ -822,44 +822,36 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct snd_soc_tplg_private *priv;
 | 
						struct snd_soc_tplg_private *priv;
 | 
				
			||||||
	int priv_data_size;
 | 
						int priv_data_size;
 | 
				
			||||||
 | 
						void *obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ref)
 | 
						if (!ref)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tplg_dbg("Data '%s' used by '%s'\n", ref->id, elem->id);
 | 
						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;
 | 
						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) {
 | 
						switch (elem->type) {
 | 
				
			||||||
	case SND_TPLG_TYPE_MIXER:
 | 
						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;
 | 
							priv = &elem->mixer_ctrl->priv;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case SND_TPLG_TYPE_ENUM:
 | 
						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;
 | 
							priv = &elem->enum_ctrl->priv;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case SND_TPLG_TYPE_BYTES:
 | 
						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;
 | 
							priv = &elem->bytes_ext->priv;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	case SND_TPLG_TYPE_DAPM_WIDGET:
 | 
						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;
 | 
							priv = &elem->widget->priv;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue