mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-04 13:30:08 -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
|
* and compare the returned value after ioctl for checking
|
||||||
* the validity of TLV.
|
* the validity of TLV.
|
||||||
*/
|
*/
|
||||||
tlv[0] = -1;
|
tlv[SNDRV_CTL_TLVO_TYPE] = -1;
|
||||||
tlv[1] = 0;
|
tlv[SNDRV_CTL_TLVO_LEN] = 0;
|
||||||
err = snd_ctl_tlv_do(ctl, 0, id, tlv, tlv_size);
|
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;
|
err = -ENXIO;
|
||||||
return err;
|
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)
|
const unsigned int *tlv)
|
||||||
{
|
{
|
||||||
assert(ctl && id && (id->name[0] || id->numid) && 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)
|
const unsigned int *tlv)
|
||||||
{
|
{
|
||||||
assert(ctl && id && (id->name[0] || id->numid) && 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;
|
return -errno;
|
||||||
}
|
}
|
||||||
if (op_flag == 0) {
|
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);
|
free(xtlv);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
memcpy(tlv, xtlv->tlv, xtlv->tlv[1] + 2 * sizeof(unsigned int));
|
memcpy(tlv, xtlv->tlv, size);
|
||||||
}
|
}
|
||||||
free(xtlv);
|
free(xtlv);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "local.h"
|
#include "local.h"
|
||||||
|
#include <sound/tlv.h>
|
||||||
|
|
||||||
typedef struct _snd_ctl_ops {
|
typedef struct _snd_ctl_ops {
|
||||||
int (*close)(snd_ctl_t *handle);
|
int (*close)(snd_ctl_t *handle);
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,8 @@ int snd_tlv_parse_dB_info(unsigned int *tlv,
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
*db_tlvp = NULL;
|
*db_tlvp = NULL;
|
||||||
type = tlv[0];
|
type = tlv[SNDRV_CTL_TLVO_TYPE];
|
||||||
size = tlv[1];
|
size = tlv[SNDRV_CTL_TLVO_LEN];
|
||||||
tlv_size -= 2 * sizeof(int);
|
tlv_size -= 2 * sizeof(int);
|
||||||
if (size > tlv_size) {
|
if (size > tlv_size) {
|
||||||
SNDERR("TLV size error");
|
SNDERR("TLV size error");
|
||||||
|
|
@ -83,7 +83,7 @@ int snd_tlv_parse_dB_info(unsigned int *tlv,
|
||||||
return err; /* error */
|
return err; /* error */
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
return err; /* found */
|
return err; /* found */
|
||||||
len = int_index(tlv[1]) + 2;
|
len = int_index(tlv[SNDRV_CTL_TLVO_LEN]) + 2;
|
||||||
size -= len * sizeof(int);
|
size -= len * sizeof(int);
|
||||||
tlv += len;
|
tlv += len;
|
||||||
}
|
}
|
||||||
|
|
@ -131,10 +131,10 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
switch (tlv[0]) {
|
switch (tlv[SNDRV_CTL_TLVO_TYPE]) {
|
||||||
case SND_CTL_TLVT_DB_RANGE: {
|
case SND_CTL_TLVT_DB_RANGE: {
|
||||||
unsigned int pos, len;
|
unsigned int pos, len;
|
||||||
len = int_index(tlv[1]);
|
len = int_index(tlv[SNDRV_CTL_TLVO_LEN]);
|
||||||
if (len > MAX_TLV_RANGE_SIZE)
|
if (len > MAX_TLV_RANGE_SIZE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
pos = 2;
|
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: {
|
case SND_CTL_TLVT_DB_SCALE: {
|
||||||
int step;
|
int step;
|
||||||
if (tlv[3] & 0x10000)
|
if (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0x10000)
|
||||||
*min = SND_CTL_TLV_DB_GAIN_MUTE;
|
*min = SND_CTL_TLV_DB_GAIN_MUTE;
|
||||||
else
|
else
|
||||||
*min = (int)tlv[2];
|
*min = (int)tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
|
||||||
step = (tlv[3] & 0xffff);
|
step = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0xffff);
|
||||||
*max = (int)tlv[2] + step * (rangemax - rangemin);
|
*max = (int)tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] +
|
||||||
|
step * (rangemax - rangemin);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case SND_CTL_TLVT_DB_MINMAX:
|
case SND_CTL_TLVT_DB_MINMAX:
|
||||||
case SND_CTL_TLVT_DB_LINEAR:
|
case SND_CTL_TLVT_DB_LINEAR:
|
||||||
*min = (int)tlv[2];
|
*min = (int)tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
|
||||||
*max = (int)tlv[3];
|
*max = (int)tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
|
||||||
return 0;
|
return 0;
|
||||||
case SND_CTL_TLVT_DB_MINMAX_MUTE:
|
case SND_CTL_TLVT_DB_MINMAX_MUTE:
|
||||||
*min = SND_CTL_TLV_DB_GAIN_MUTE;
|
*min = SND_CTL_TLV_DB_GAIN_MUTE;
|
||||||
*max = (int)tlv[3];
|
*max = (int)tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
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,
|
int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
long volume, long *db_gain)
|
long volume, long *db_gain)
|
||||||
{
|
{
|
||||||
switch (tlv[0]) {
|
unsigned int type = tlv[SNDRV_CTL_TLVO_TYPE];
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
case SND_CTL_TLVT_DB_RANGE: {
|
case SND_CTL_TLVT_DB_RANGE: {
|
||||||
unsigned int pos, len;
|
unsigned int pos, len;
|
||||||
len = int_index(tlv[1]);
|
len = int_index(tlv[SNDRV_CTL_TLVO_LEN]);
|
||||||
if (len > MAX_TLV_RANGE_SIZE)
|
if (len > MAX_TLV_RANGE_SIZE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
pos = 2;
|
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: {
|
case SND_CTL_TLVT_DB_SCALE: {
|
||||||
int min, step, mute;
|
int min, step, mute;
|
||||||
min = tlv[2];
|
min = tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
|
||||||
step = (tlv[3] & 0xffff);
|
step = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] & 0xffff);
|
||||||
mute = (tlv[3] >> 16) & 1;
|
mute = (tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] >> 16) & 1;
|
||||||
if (mute && volume <= rangemin)
|
if (mute && volume <= rangemin)
|
||||||
*db_gain = SND_CTL_TLV_DB_GAIN_MUTE;
|
*db_gain = SND_CTL_TLV_DB_GAIN_MUTE;
|
||||||
else
|
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:
|
||||||
case SND_CTL_TLVT_DB_MINMAX_MUTE: {
|
case SND_CTL_TLVT_DB_MINMAX_MUTE: {
|
||||||
int mindb, maxdb;
|
int mindb, maxdb;
|
||||||
mindb = tlv[2];
|
mindb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MIN];
|
||||||
maxdb = tlv[3];
|
maxdb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
|
||||||
if (volume <= rangemin || rangemax <= rangemin) {
|
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;
|
*db_gain = SND_CTL_TLV_DB_GAIN_MUTE;
|
||||||
else
|
else
|
||||||
*db_gain = mindb;
|
*db_gain = mindb;
|
||||||
|
|
@ -248,8 +251,8 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
}
|
}
|
||||||
#ifndef HAVE_SOFT_FLOAT
|
#ifndef HAVE_SOFT_FLOAT
|
||||||
case SND_CTL_TLVT_DB_LINEAR: {
|
case SND_CTL_TLVT_DB_LINEAR: {
|
||||||
int mindb = tlv[2];
|
int mindb = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
|
||||||
int maxdb = tlv[3];
|
int maxdb = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
|
||||||
if (volume <= rangemin || rangemax <= rangemin)
|
if (volume <= rangemin || rangemax <= rangemin)
|
||||||
*db_gain = mindb;
|
*db_gain = mindb;
|
||||||
else if (volume >= rangemax)
|
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,
|
int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
long db_gain, long *value, int xdir)
|
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: {
|
case SND_CTL_TLVT_DB_RANGE: {
|
||||||
long dbmin, dbmax, prev_submax;
|
long dbmin, dbmax, prev_submax;
|
||||||
unsigned int pos, len;
|
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)
|
if (len < 6 || len > MAX_TLV_RANGE_SIZE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
pos = 2;
|
pos = 2;
|
||||||
|
|
@ -324,13 +329,14 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case SND_CTL_TLVT_DB_SCALE: {
|
case SND_CTL_TLVT_DB_SCALE: {
|
||||||
int min, step, max;
|
int min, step, max, mute;
|
||||||
min = tlv[2];
|
min = tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN];
|
||||||
step = (tlv[3] & 0xffff);
|
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));
|
max = min + (int)(step * (rangemax - rangemin));
|
||||||
if (db_gain <= min)
|
if (db_gain <= min)
|
||||||
if (db_gain > SND_CTL_TLV_DB_GAIN_MUTE && xdir > 0 &&
|
if (db_gain > SND_CTL_TLV_DB_GAIN_MUTE && xdir > 0 &&
|
||||||
(tlv[3] & 0x10000))
|
mute)
|
||||||
*value = rangemin + 1;
|
*value = rangemin + 1;
|
||||||
else
|
else
|
||||||
*value = rangemin;
|
*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:
|
||||||
case SND_CTL_TLVT_DB_MINMAX_MUTE: {
|
case SND_CTL_TLVT_DB_MINMAX_MUTE: {
|
||||||
int min, max;
|
int min, max;
|
||||||
min = tlv[2];
|
min = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MIN];
|
||||||
max = tlv[3];
|
max = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX];
|
||||||
if (db_gain <= min)
|
if (db_gain <= min)
|
||||||
if (db_gain > SND_CTL_TLV_DB_GAIN_MUTE && xdir > 0 &&
|
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;
|
*value = rangemin + 1;
|
||||||
else
|
else
|
||||||
*value = rangemin;
|
*value = rangemin;
|
||||||
|
|
@ -370,8 +376,8 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||||||
#ifndef HAVE_SOFT_FLOAT
|
#ifndef HAVE_SOFT_FLOAT
|
||||||
case SND_CTL_TLVT_DB_LINEAR: {
|
case SND_CTL_TLVT_DB_LINEAR: {
|
||||||
int min, max;
|
int min, max;
|
||||||
min = tlv[2];
|
min = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MIN];
|
||||||
max = tlv[3];
|
max = tlv[SNDRV_CTL_TLVO_DB_LINEAR_MAX];
|
||||||
if (db_gain <= min)
|
if (db_gain <= min)
|
||||||
*value = rangemin;
|
*value = rangemin;
|
||||||
else if (db_gain >= max)
|
else if (db_gain >= max)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue