aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-06-01 16:50:29 +0200
committerTakashi Iwai <tiwai@suse.de>2015-06-01 16:50:29 +0200
commit2974286d61a355557923e3f91129e4a12206d521 (patch)
tree40129e52797b6ef4902e40ea9676990441e72352
parent1d0b0177421b42da1e6bfc6e36fb2a788b144f81 (diff)
downloadsalsa-lib-2974286d61a355557923e3f91129e4a12206d521.tar.gz
Add missing snd_ctl_convert_{from|to}_dB() and snd_ctl_get_dB_range()
The definitions were missing. Oops. Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--src/control.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/control.c b/src/control.c
index 1f19431..17398ba 100644
--- a/src/control.c
+++ b/src/control.c
@@ -763,6 +763,67 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
return -EINVAL;
}
+#define TEMP_TLV_SIZE 4096
+struct tlv_info {
+ long minval, maxval;
+ unsigned int *tlv;
+ unsigned int buf[TEMP_TLV_SIZE];
+};
+
+static int get_tlv_info(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
+ struct tlv_info *rec)
+{
+ snd_ctl_elem_info_t info;
+ int err;
+
+ memzero_valgrind(&info, sizeof(info));
+ info.id = *id;
+ err = snd_ctl_elem_info(ctl, &info);
+ if (err < 0)
+ return err;
+ rec->minval = info.value.integer.min;
+ rec->maxval = info.value.integer.max;
+ return snd_tlv_parse_dB_info(rec->buf, sizeof(rec->buf), &rec->tlv);
+}
+
+int snd_ctl_get_dB_range(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
+ long *min, long *max)
+{
+ struct tlv_info info;
+ int err;
+
+ err = get_tlv_info(ctl, id, &info);
+ if (err < 0)
+ return err;
+ return snd_tlv_get_dB_range(info.tlv, info.minval, info.maxval,
+ min, max);
+}
+
+int snd_ctl_convert_to_dB(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
+ long volume, long *db_gain)
+{
+ struct tlv_info info;
+ int err;
+
+ err = get_tlv_info(ctl, id, &info);
+ if (err < 0)
+ return err;
+ return snd_tlv_convert_to_dB(info.tlv, info.minval, info.maxval,
+ volume, db_gain);
+}
+
+int snd_ctl_convert_from_dB(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
+ long db_gain, long *value, int xdir)
+{
+ struct tlv_info info;
+ int err;
+
+ err = get_tlv_info(ctl, id, &info);
+ if (err < 0)
+ return err;
+ return snd_tlv_convert_from_dB(info.tlv, info.minval, info.maxval,
+ db_gain, value, xdir);
+}
#endif /* TLV */
#if SALSA_CTL_ASCII_PARSER