From f8a34aa683b40a7a50931f786cd78d659db5f4ac Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 16 Jun 2009 14:28:57 +0200 Subject: [PATCH] Add the support of TLV_DB_MINMAX types Added the support of the new TLV_DB_MINMAX types. Signed-off-by: Takashi Iwai --- include/control.h | 4 ++++ src/control/tlv.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/control.h b/include/control.h index 2361dc3a..29ea397e 100644 --- a/include/control.h +++ b/include/control.h @@ -174,6 +174,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 diff --git a/src/control/tlv.c b/src/control/tlv.c index 0006a87c..7627f579 100644 --- a/src/control/tlv.c +++ b/src/control/tlv.c @@ -89,6 +89,8 @@ int snd_tlv_parse_dB_info(unsigned int *tlv, } break; case SND_CTL_TLVT_DB_SCALE: + case SND_CTL_TLVT_DB_MINMAX: + case SND_CTL_TLVT_DB_MINMAX_MUTE: #ifndef HAVE_SOFT_FLOAT case SND_CTL_TLVT_DB_LINEAR: #endif @@ -165,6 +167,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]; @@ -214,6 +218,23 @@ 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; + } #ifndef HAVE_SOFT_FLOAT case SND_CTL_TLVT_DB_LINEAR: { int mindb = tlv[2]; @@ -297,6 +318,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; + } #ifndef HAVE_SOFT_FLOAT case SND_CTL_TLVT_DB_LINEAR: { int min, max; -- 2.47.1