[PATCH v2] alsaloop: added option prateshift for PLAYSHIFT ctl elem used in PLAYSHIFT

Jaroslav Kysela perex at perex.cz
Wed Oct 13 09:01:10 CEST 2021


On 05. 10. 21 21:49, Pavel Hofman wrote:

> -static void openctl_elem(struct loopback_handle *lhandle,
> -			 int device, int subdevice,
> -			 const char *name,
> -			 snd_ctl_elem_value_t **elem)
> +static int openctl_elem_id(struct loopback_handle *lhandle, snd_ctl_elem_id_t *id,
> +		snd_ctl_elem_value_t **elem)
>   {
>   	int err;
>   
>   	if (snd_ctl_elem_value_malloc(elem) < 0) {
>   		*elem = NULL;
> +		snd_ctl_elem_id_free(id);
> + 		return -ENOMEM;
> + 	}
> +	snd_ctl_elem_value_set_id(*elem, id);
> +	snd_ctl_elem_value_set_interface(*elem, SND_CTL_ELEM_IFACE_PCM);
> +	err = snd_ctl_elem_read(lhandle->ctl, *elem);
> +	if (err < 0) {
> +		snd_ctl_elem_id_free(id);

Move the id allocation management to the caller.

> +		snd_ctl_elem_value_free(*elem);
> +		*elem = NULL;
> +		return err;
>   	} else {
> -		snd_ctl_elem_value_set_interface(*elem,
> -						 SND_CTL_ELEM_IFACE_PCM);
> -		snd_ctl_elem_value_set_device(*elem, device);
> -		snd_ctl_elem_value_set_subdevice(*elem, subdevice);
> -		snd_ctl_elem_value_set_name(*elem, name);
> -		err = snd_ctl_elem_read(lhandle->ctl, *elem);
> -		if (err < 0) {
> -			snd_ctl_elem_value_free(*elem);
> -			*elem = NULL;
> -		} else {
> -			if (verbose)
> -				snd_output_printf(lhandle->loopback->output,
> -						"Opened PCM element %s of %s, device %d, subdevice %d\n",
> -						name, snd_ctl_name(lhandle->ctl), device, subdevice);
> -		}
> +		snd_output_printf(lhandle->loopback->output,
> +				"Opened PCM element %s of %s, device %d, subdevice %d\n",
> +				snd_ctl_elem_id_get_name(id), snd_ctl_name(lhandle->ctl),
> +				snd_ctl_elem_id_get_device(id),
> +				snd_ctl_elem_id_get_subdevice(id));
> +		return 0;
>   	}
>   }
>   
> +static int openctl_elem(struct loopback_handle *lhandle,
> +			 int device, int subdevice,
> +			 const char *name,
> +			 snd_ctl_elem_value_t **elem)
> +{
> +	snd_ctl_elem_id_t *id;
> +
> +	if (snd_ctl_elem_id_malloc(&id))
> +		return -ENOMEM;
> +	snd_ctl_elem_id_set_device(id, device);
> +	snd_ctl_elem_id_set_subdevice(id, subdevice);
> +	snd_ctl_elem_id_set_name(id, name);
> +	return openctl_elem_id(lhandle, id, elem);

Missing snd_ctl_elem_id_free(id). Eventually, the id may be allocated using 
snd_ctl_elem_id_alloca().

> +}
> +
> +static int openctl_elem_ascii(struct loopback_handle *lhandle, char *ascii_name,
> +		snd_ctl_elem_value_t **elem)
> +{
> +	snd_ctl_elem_id_t *id;
> +
> +	if (snd_ctl_elem_id_malloc(&id)) {
> +		return -ENOMEM;
> +	}
> +	if (snd_ctl_ascii_elem_id_parse(id, ascii_name)) {
> +		snd_ctl_elem_id_free(id);
> +		fprintf(stderr, "Wrong control identifier: %s\n", ascii_name);
> +		return -EINVAL;
> +	}
> +	return openctl_elem_id(lhandle, id, elem);

Missing snd_ctl_elem_id_free(id). Eventually, the id may be allocated using 
snd_ctl_elem_id_alloca().

						Jaroslav

-- 
Jaroslav Kysela <perex at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list