78c3cb05aa
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=46b9aabbb1258be113505f7e4f6cbbe4
53 lines
1.7 KiB
Diff
53 lines
1.7 KiB
Diff
From 30ad5ed04017f7e77b25cf40f18c26396903cd23 Mon Sep 17 00:00:00 2001
|
|
From: Peter Ujfalusi <peter.ujfalusi@nokia.com>
|
|
Date: Wed, 19 May 2010 08:19:26 +0200
|
|
Subject: [PATCH 04/21] control: tlv: Check dB range only within the control's volume range
|
|
|
|
The DB_RANGE need to be used on some HW, since the gain on
|
|
volume control is not continuous, and has to be divided into
|
|
several sub DB_SCALE ranges.
|
|
ASoC has a feature to override the HW default volume range,
|
|
and in this case when the volume range is less than the
|
|
HW maximum we do not need to go through the whole DB_RANGE,
|
|
but we need to stop where the kcontrol's maximum tell us.
|
|
|
|
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
src/control/tlv.c | 11 ++++++++---
|
|
1 files changed, 8 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/control/tlv.c b/src/control/tlv.c
|
|
index cfd9b97..0ff052e 100644
|
|
--- a/src/control/tlv.c
|
|
+++ b/src/control/tlv.c
|
|
@@ -140,10 +140,13 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
|
|
pos = 2;
|
|
while (pos + 4 <= len) {
|
|
long rmin, rmax;
|
|
- rangemin = (int)tlv[pos];
|
|
- rangemax = (int)tlv[pos + 1];
|
|
+ long submin, submax;
|
|
+ submin = (int)tlv[pos];
|
|
+ submax = (int)tlv[pos + 1];
|
|
+ if (rangemax < submax)
|
|
+ submax = rangemax;
|
|
err = snd_tlv_get_dB_range(tlv + pos + 2,
|
|
- rangemin, rangemax,
|
|
+ submin, submax,
|
|
&rmin, &rmax);
|
|
if (err < 0)
|
|
return err;
|
|
@@ -156,6 +159,8 @@ int snd_tlv_get_dB_range(unsigned int *tlv, long rangemin, long rangemax,
|
|
*min = rmin;
|
|
*max = rmax;
|
|
}
|
|
+ if (rangemax == submax)
|
|
+ return 0;
|
|
pos += int_index(tlv[pos + 3]) + 4;
|
|
}
|
|
return 0;
|
|
--
|
|
1.7.2.1
|
|
|