mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	control: use position offset macro of TLV data
A series of SNDRV_CTL_TLVO_XXX macro was introduced for position offset of TLV data. This commit applies a code optimization. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									5eb78219f6
								
							
						
					
					
						commit
						f61193c96c
					
				
					 4 changed files with 51 additions and 40 deletions
				
			
		| 
						 | 
				
			
			@ -938,10 +938,10 @@ int snd_ctl_elem_tlv_read(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
 | 
			
		|||
	 * and compare the returned value after ioctl for checking
 | 
			
		||||
	 * the validity of TLV.
 | 
			
		||||
	 */
 | 
			
		||||
	tlv[0] = -1;
 | 
			
		||||
	tlv[1] = 0;
 | 
			
		||||
	tlv[SNDRV_CTL_TLVO_TYPE] = -1;
 | 
			
		||||
	tlv[SNDRV_CTL_TLVO_LEN] = 0;
 | 
			
		||||
	err = snd_ctl_tlv_do(ctl, 0, id, tlv, tlv_size);
 | 
			
		||||
	if (err >= 0 && tlv[0] == (unsigned int)-1)
 | 
			
		||||
	if (err >= 0 && tlv[SNDRV_CTL_TLVO_TYPE] == (unsigned int)-1)
 | 
			
		||||
		err = -ENXIO;
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -967,7 +967,8 @@ int snd_ctl_elem_tlv_write(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
 | 
			
		|||
			   const unsigned int *tlv)
 | 
			
		||||
{
 | 
			
		||||
	assert(ctl && id && (id->name[0] || id->numid) && tlv);
 | 
			
		||||
	return snd_ctl_tlv_do(ctl, 1, id, (unsigned int *)tlv, tlv[1] + 2 * sizeof(unsigned int));
 | 
			
		||||
	return snd_ctl_tlv_do(ctl, 1, id, (unsigned int *)tlv,
 | 
			
		||||
			tlv[SNDRV_CTL_TLVO_LEN] + 2 * sizeof(unsigned int));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -991,7 +992,8 @@ int snd_ctl_elem_tlv_command(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
 | 
			
		|||
			     const unsigned int *tlv)
 | 
			
		||||
{
 | 
			
		||||
	assert(ctl && id && (id->name[0] || id->numid) && tlv);
 | 
			
		||||
	return snd_ctl_tlv_do(ctl, -1, id, (unsigned int *)tlv, tlv[1] + 2 * sizeof(unsigned int));
 | 
			
		||||
	return snd_ctl_tlv_do(ctl, -1, id, (unsigned int *)tlv,
 | 
			
		||||
			tlv[SNDRV_CTL_TLVO_LEN] + 2 * sizeof(unsigned int));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -240,11 +240,13 @@ static int snd_ctl_hw_elem_tlv(snd_ctl_t *handle, int op_flag,
 | 
			
		|||
		return -errno;
 | 
			
		||||
	}
 | 
			
		||||
	if (op_flag == 0) {
 | 
			
		||||
		if (xtlv->tlv[1] + 2 * sizeof(unsigned int) > tlv_size) {
 | 
			
		||||
		unsigned int size;
 | 
			
		||||
		size = xtlv->tlv[SNDRV_CTL_TLVO_LEN] + 2 * sizeof(unsigned int);
 | 
			
		||||
		if (size > tlv_size) {
 | 
			
		||||
			free(xtlv);
 | 
			
		||||
			return -EFAULT;
 | 
			
		||||
		}
 | 
			
		||||
		memcpy(tlv, xtlv->tlv, xtlv->tlv[1] + 2 * sizeof(unsigned int));
 | 
			
		||||
		memcpy(tlv, xtlv->tlv, size);
 | 
			
		||||
	}
 | 
			
		||||
	free(xtlv);
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
#include "local.h"
 | 
			
		||||
#include <sound/tlv.h>
 | 
			
		||||
 | 
			
		||||
typedef struct _snd_ctl_ops {
 | 
			
		||||
	int (*close)(snd_ctl_t *handle);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,8 +65,8 @@ int snd_tlv_parse_dB_info(unsigned int *tlv,
 | 
			
		|||
	int err;
 | 
			
		||||
 | 
			
		||||
	*db_tlvp = NULL;
 | 
			
		||||
	type = tlv[0];
 | 
			
		||||
	size = tlv[1];
 | 
			
		||||
	type = tlv[SNDRV_CTL_TLVO_TYPE];
 | 
			
		||||
	size = tlv[SNDRV_CTL_TLVO_LEN];
 | 
			
		||||
	tlv_size -= 2 * sizeof(int);
 | 
			
		||||
	if (size > tlv_size) {
 | 
			
		||||
		SNDERR("TLV size error");
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ int snd_tlv_parse_dB_info(unsigned int *tlv,
 | 
			
		|||
				return err; /* error */
 | 
			
		||||
			if (err > 0)
 | 
			
		||||
				return err; /* found */
 | 
			
		||||
			len = int_index(tlv[1]) + 2;
 | 
			
		||||
			len = int_index(tlv[SNDRV_CTL_TLVO_LEN]) + 2;
 | 
			
		||||
			size -= len * sizeof(int);
 | 
			
		||||
			tlv += len;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -131,10 +131,10 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
{
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	switch (tlv[0]) {
 | 
			
		||||
	switch (tlv[SNDRV_CTL_TLVO_TYPE]) {
 | 
			
		||||
	case SND_CTL_TLVT_DB_RANGE: {
 | 
			
		||||
		unsigned int pos, len;
 | 
			
		||||
		len = int_index(tlv[1]);
 | 
			
		||||
		len = int_index(tlv[SNDRV_CTL_TLVO_LEN]);
 | 
			
		||||
		if (len > MAX_TLV_RANGE_SIZE)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		pos = 2;
 | 
			
		||||
| 
						 | 
				
			
			@ -167,22 +167,23 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
	}
 | 
			
		||||
	case SND_CTL_TLVT_DB_SCALE: {
 | 
			
		||||
		int step;
 | 
			
		||||
		if (tlv[3] & 0x10000)
 | 
			
		||||
		if (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0x10000)
 | 
			
		||||
			*min = SND_CTL_TLV_DB_GAIN_MUTE;
 | 
			
		||||
		else
 | 
			
		||||
			*min = (int)tlv[2];
 | 
			
		||||
		step = (tlv[3] & 0xffff);
 | 
			
		||||
		*max = (int)tlv[2] + step * (rangemax - rangemin);
 | 
			
		||||
			*min = (int)tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
 | 
			
		||||
		step = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0xffff);
 | 
			
		||||
		*max = (int)tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] +
 | 
			
		||||
						step * (rangemax - rangemin);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	case SND_CTL_TLVT_DB_MINMAX:
 | 
			
		||||
	case SND_CTL_TLVT_DB_LINEAR:
 | 
			
		||||
		*min = (int)tlv[2];
 | 
			
		||||
		*max = (int)tlv[3];
 | 
			
		||||
		*min = (int)tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
 | 
			
		||||
		*max = (int)tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
 | 
			
		||||
		return 0;
 | 
			
		||||
	case SND_CTL_TLVT_DB_MINMAX_MUTE:
 | 
			
		||||
		*min = SND_CTL_TLV_DB_GAIN_MUTE;
 | 
			
		||||
		*max = (int)tlv[3];
 | 
			
		||||
		*max = (int)tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	return -EINVAL;
 | 
			
		||||
| 
						 | 
				
			
			@ -200,10 +201,12 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		||||
			  long volume, long *db_gain)
 | 
			
		||||
{
 | 
			
		||||
	switch (tlv[0]) {
 | 
			
		||||
	unsigned int type = tlv[SNDRV_CTL_TLVO_TYPE];
 | 
			
		||||
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case SND_CTL_TLVT_DB_RANGE: {
 | 
			
		||||
		unsigned int pos, len;
 | 
			
		||||
		len = int_index(tlv[1]);
 | 
			
		||||
		len = int_index(tlv[SNDRV_CTL_TLVO_LEN]);
 | 
			
		||||
		if (len > MAX_TLV_RANGE_SIZE)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		pos = 2;
 | 
			
		||||
| 
						 | 
				
			
			@ -220,9 +223,9 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
	}
 | 
			
		||||
	case SND_CTL_TLVT_DB_SCALE: {
 | 
			
		||||
		int min, step, mute;
 | 
			
		||||
		min = tlv[2];
 | 
			
		||||
		step = (tlv[3] & 0xffff);
 | 
			
		||||
		mute = (tlv[3] >> 16) & 1;
 | 
			
		||||
		min = tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
 | 
			
		||||
		step = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0xffff);
 | 
			
		||||
		mute = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] >> 16) & 1;
 | 
			
		||||
		if (mute && volume <= rangemin)
 | 
			
		||||
			*db_gain = SND_CTL_TLV_DB_GAIN_MUTE;
 | 
			
		||||
		else
 | 
			
		||||
| 
						 | 
				
			
			@ -232,10 +235,10 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
	case SND_CTL_TLVT_DB_MINMAX:
 | 
			
		||||
	case SND_CTL_TLVT_DB_MINMAX_MUTE: {
 | 
			
		||||
		int mindb, maxdb;
 | 
			
		||||
		mindb = tlv[2];
 | 
			
		||||
		maxdb = tlv[3];
 | 
			
		||||
		mindb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MIN];
 | 
			
		||||
		maxdb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
 | 
			
		||||
		if (volume <= rangemin || rangemax <= rangemin) {
 | 
			
		||||
			if (tlv[0] == SND_CTL_TLVT_DB_MINMAX_MUTE)
 | 
			
		||||
			if (type == SND_CTL_TLVT_DB_MINMAX_MUTE)
 | 
			
		||||
				*db_gain = SND_CTL_TLV_DB_GAIN_MUTE;
 | 
			
		||||
			else
 | 
			
		||||
				*db_gain = mindb;
 | 
			
		||||
| 
						 | 
				
			
			@ -248,8 +251,8 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
	}
 | 
			
		||||
#ifndef HAVE_SOFT_FLOAT
 | 
			
		||||
	case SND_CTL_TLVT_DB_LINEAR: {
 | 
			
		||||
		int mindb = tlv[2];
 | 
			
		||||
		int maxdb = tlv[3];
 | 
			
		||||
		int mindb = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
 | 
			
		||||
		int maxdb = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
 | 
			
		||||
		if (volume <= rangemin || rangemax <= rangemin)
 | 
			
		||||
			*db_gain = mindb;
 | 
			
		||||
		else if (volume >= rangemax)
 | 
			
		||||
| 
						 | 
				
			
			@ -289,11 +292,13 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		||||
			    long db_gain, long *value, int xdir)
 | 
			
		||||
{
 | 
			
		||||
	switch (tlv[0]) {
 | 
			
		||||
	unsigned int type = tlv[SNDRV_CTL_TLVO_TYPE];
 | 
			
		||||
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case SND_CTL_TLVT_DB_RANGE: {
 | 
			
		||||
		long dbmin, dbmax, prev_submax;
 | 
			
		||||
		unsigned int pos, len;
 | 
			
		||||
		len = int_index(tlv[1]);
 | 
			
		||||
		len = int_index(tlv[SNDRV_CTL_TLVO_LEN]);
 | 
			
		||||
		if (len < 6 || len > MAX_TLV_RANGE_SIZE)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		pos = 2;
 | 
			
		||||
| 
						 | 
				
			
			@ -324,13 +329,14 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	case SND_CTL_TLVT_DB_SCALE: {
 | 
			
		||||
		int min, step, max;
 | 
			
		||||
		min = tlv[2];
 | 
			
		||||
		step = (tlv[3] & 0xffff);
 | 
			
		||||
		int min, step, max, mute;
 | 
			
		||||
		min = tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
 | 
			
		||||
		step = tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0xffff;
 | 
			
		||||
		mute = tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0x10000;
 | 
			
		||||
		max = min + (int)(step * (rangemax - rangemin));
 | 
			
		||||
		if (db_gain <= min)
 | 
			
		||||
			if (db_gain > SND_CTL_TLV_DB_GAIN_MUTE && xdir > 0 &&
 | 
			
		||||
			    (tlv[3] & 0x10000))
 | 
			
		||||
			    mute)
 | 
			
		||||
				*value = rangemin + 1;
 | 
			
		||||
			else
 | 
			
		||||
				*value = rangemin;
 | 
			
		||||
| 
						 | 
				
			
			@ -348,11 +354,11 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
	case SND_CTL_TLVT_DB_MINMAX:
 | 
			
		||||
	case SND_CTL_TLVT_DB_MINMAX_MUTE: {
 | 
			
		||||
		int min, max;
 | 
			
		||||
		min = tlv[2];
 | 
			
		||||
		max = tlv[3];
 | 
			
		||||
		min = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MIN];
 | 
			
		||||
		max = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
 | 
			
		||||
		if (db_gain <= min)
 | 
			
		||||
			if (db_gain > SND_CTL_TLV_DB_GAIN_MUTE && xdir > 0 &&
 | 
			
		||||
			    tlv[0] == SND_CTL_TLVT_DB_MINMAX_MUTE)
 | 
			
		||||
			    type == SND_CTL_TLVT_DB_MINMAX_MUTE)
 | 
			
		||||
				*value = rangemin + 1;
 | 
			
		||||
			else
 | 
			
		||||
				*value = rangemin;
 | 
			
		||||
| 
						 | 
				
			
			@ -370,8 +376,8 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
 | 
			
		|||
#ifndef HAVE_SOFT_FLOAT
 | 
			
		||||
	case SND_CTL_TLVT_DB_LINEAR: {
 | 
			
		||||
		int min, max;
 | 
			
		||||
		min = tlv[2];
 | 
			
		||||
		max = tlv[3];
 | 
			
		||||
		min = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
 | 
			
		||||
		max = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
 | 
			
		||||
		if (db_gain <= min)
 | 
			
		||||
			*value = rangemin;
 | 
			
		||||
		else if (db_gain >= max)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue