alsa/0009-snd_tlv_convert_from_dB-fix-decreasing-gain-across-e.patch
Cristian Rodríguez 6550dc5de3 Accepting request 201580 from home:tiwai:branches:multimedia:libs
- Backport upstream fixes: namehints double-free fix, expansion of
  more HDMI devices, and a fix for dB conversion
  0007-Fix-access-of-freed-memory-in-namehints.patch
  0008-HDA-Intel-present-up-to-8-HDMI-DP-outputs-via-hdmi-d.patch
  0009-snd_tlv_convert_from_dB-fix-decreasing-gain-across-e.patch

OBS-URL: https://build.opensuse.org/request/show/201580
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=141
2013-10-02 21:43:37 +00:00

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