45 lines
1.8 KiB
Diff
45 lines
1.8 KiB
Diff
|
From 529706fc323813cfad7c48d3738ea0bfa5b8305e Mon Sep 17 00:00:00 2001
|
||
|
From: Stephen Warren <swarren@nvidia.com>
|
||
|
Date: Mon, 30 Sep 2013 15:25:49 -0600
|
||
|
Subject: [PATCH] snd_tlv_convert_from_dB: fix decreasing gain across entries
|
||
|
|
||
|
Currently, for a TLV consisting of TLV_DB_SCALE_ITEMs, if e.g. alsamixer
|
||
|
calls snd_mixer_selem_set_playback_dB() with a value that is in-between
|
||
|
two TLV_DB_SCALE_ITEMs, and xdir is negative, the selected raw hardware
|
||
|
value is the minimum in the first range above that value, rather than the
|
||
|
maximum in the last range below that value.
|
||
|
|
||
|
The user-visible symptom is that in alsamixer, pressing the down key to
|
||
|
reduce the value sticks at certain points, and cannot be incrementally
|
||
|
reduced any further, although directly selecting a much lower value (e.g.
|
||
|
by pressing 0..9) works as expected. This is triggered e.g. by
|
||
|
sound/soc/codec/max98090.c's max98090_hp_tlv[].
|
||
|
|
||
|
Fix this by checking whether xdir is positive or not, rather than
|
||
|
checking whether it has a non-zero value. The code to select the previous
|
||
|
range's max value is already present. This matches how xdir is used in
|
||
|
other parts of the code.
|
||
|
|
||
|
Signed-off-by: Stephen Warren <swarren@nvidia.com>
|
||
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||
|
---
|
||
|
src/control/tlv.c | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/src/control/tlv.c b/src/control/tlv.c
|
||
|
index 6b0b9f4..b08d887 100644
|
||
|
--- a/src/control/tlv.c
|
||
|
+++ b/src/control/tlv.c
|
||
|
@@ -312,7 +312,7 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax,
|
||
|
submin, submax,
|
||
|
db_gain, value, xdir);
|
||
|
else if (db_gain < dbmin) {
|
||
|
- *value = xdir || pos == 2 ? submin : prev_submax;
|
||
|
+ *value = xdir > 0 || pos == 2 ? submin : prev_submax;
|
||
|
return 0;
|
||
|
}
|
||
|
prev_submax = submax;
|
||
|
--
|
||
|
1.8.4
|
||
|
|