]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Add the support of TLV_DB_MINMAX types
authorTakashi Iwai <tiwai@suse.de>
Tue, 16 Jun 2009 12:28:57 +0000 (14:28 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 16 Jun 2009 12:28:57 +0000 (14:28 +0200)
Added the support of the new TLV_DB_MINMAX types.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/control.h
src/control/tlv.c

index 2361dc3a01399b646e15f33cd8e971ca6fdf5ea7..29ea397e0c5fcf196e5ace08722a36ce9cba625d 100644 (file)
@@ -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
index 0006a87c37b09f04ef50042608344fd7a043f054..7627f57957136a12343e917879b3dbdd3f53fa56 100644 (file)
@@ -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;