diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-10-04 10:54:18 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-10-04 10:54:18 +0200 |
commit | 4f439c9122da4d73d08f1c67c0b3dd7a065dc1da (patch) | |
tree | fac11b07f6c3a69f73e43a43d45bf85b434fee4c | |
parent | 227a8a8fc79f312a12974b8be4e51fcd76e7a943 (diff) | |
download | salsa-lib-4f439c9122da4d73d08f1c67c0b3dd7a065dc1da.tar.gz |
Add support of TLV_MINMAX*
-rw-r--r-- | src/control.c | 36 | ||||
-rw-r--r-- | src/ctl_types.h | 4 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/control.c b/src/control.c index 8275b70..5664618 100644 --- a/src/control.c +++ b/src/control.c @@ -386,6 +386,22 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax, *db_gain = (volume - rangemin) * step + min; return 0; } + case SND_CTL_TLVT_DB_MINMAX: + case SND_CTL_TLVT_DB_MINMAX_MUTE: { + int mindb, maxdb; + mindb = tlv[2]; + maxdb = tlv[3]; + if (volume <= rangemin || rangemax <= rangemin) { + if (tlv[0] == SND_CTL_TLVT_DB_MINMAX_MUTE) + *db_gain = SND_CTL_TLV_DB_GAIN_MUTE; + else + *db_gain = mindb; + } else if (volume >= rangemax) + *db_gain = maxdb; + else + *db_gain = (maxdb - mindb) * (volume - rangemin) / + (rangemax - rangemin) + mindb; + return 0; } return -EINVAL; } @@ -428,6 +444,8 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax, *max = *min + (long)(step * (rangemax - rangemin)); return 0; } + case SND_CTL_TLVT_DB_MINMAX: + case SND_CTL_TLVT_DB_MINMAX_MUTE: case SND_CTL_TLVT_DB_LINEAR: *min = (int)tlv[2]; *max = (int)tlv[3]; @@ -482,6 +500,24 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax, } return 0; } + case SND_CTL_TLVT_DB_MINMAX: + case SND_CTL_TLVT_DB_MINMAX_MUTE: { + int min, max; + min = tlv[2]; + max = tlv[3]; + if (db_gain <= min) + *value = rangemin; + else if (db_gain >= max) + *value = rangemax; + else { + long v = (db_gain - min) * (rangemax - rangemin); + if (xdir > 0) + v += (max - min) - 1; + v = v / (max - min) + rangemin; + *value = v; + } + return 0; + } default: break; } diff --git a/src/ctl_types.h b/src/ctl_types.h index ee2ad76..d232b91 100644 --- a/src/ctl_types.h +++ b/src/ctl_types.h @@ -136,6 +136,10 @@ typedef enum _snd_ctl_event_type { #define SND_CTL_TLVT_DB_LINEAR 0x0002 /** TLV type - dB range container */ #define SND_CTL_TLVT_DB_RANGE 0x0003 +/** TLV type - dB scale specified by min/max values */ +#define SND_CTL_TLVT_DB_MINMAX 0x0004 +/** TLV type - dB scale specified by min/max values (with mute) */ +#define SND_CTL_TLVT_DB_MINMAX_MUTE 0x0005 /** Mute state */ #define SND_CTL_TLV_DB_GAIN_MUTE -9999999 |