aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-10-04 10:54:18 +0200
committerTakashi Iwai <tiwai@suse.de>2009-10-04 10:54:18 +0200
commit4f439c9122da4d73d08f1c67c0b3dd7a065dc1da (patch)
treefac11b07f6c3a69f73e43a43d45bf85b434fee4c
parent227a8a8fc79f312a12974b8be4e51fcd76e7a943 (diff)
downloadsalsa-lib-4f439c9122da4d73d08f1c67c0b3dd7a065dc1da.tar.gz
Add support of TLV_MINMAX*
-rw-r--r--src/control.c36
-rw-r--r--src/ctl_types.h4
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