[alsa-devel] [PATCH] snd_tlv_convert_from_dB: fix decreasing gain across entries
Takashi Iwai
tiwai at suse.de
Tue Oct 1 12:25:18 CEST 2013
At Mon, 30 Sep 2013 15:25:49 -0600,
Stephen Warren wrote:
>
> From: Stephen Warren <swarren at nvidia.com>
>
> 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 at nvidia.com>
Thanks, applied.
Takashi
> ---
> 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.1.5
>
More information about the Alsa-devel
mailing list