[alsa-devel] ALSA: line6: Fix volume calculation for big-endian
Takashi Iwai
tiwai at suse.de
Thu Mar 5 13:01:39 CET 2015
At Thu, 5 Mar 2015 13:21:49 +0300,
Dan Carpenter wrote:
>
> Hello Takashi Iwai,
>
> The patch 0416980d0a2b: "ALSA: line6: Fix volume calculation for
> big-endian" from Jan 28, 2015, leads to the following static checker
> warning:
>
> sound/usb/line6/playback.c:42 change_volume()
> warn: always clamps to s16min
> sound/usb/line6/playback.c:57 change_volume()
> warn: always clamps to (-8388608)
> sound/usb/line6/playback.c:129 add_monitor_signal()
> warn: always clamps to s16min
>
> sound/usb/line6/playback.c
> 25 static void change_volume(struct urb *urb_out, int volume[],
> 26 int bytes_per_frame)
> 27 {
> 28 int chn = 0;
> 29
> 30 if (volume[0] == 256 && volume[1] == 256)
> 31 return; /* maximum volume - no change */
> 32
> 33 if (bytes_per_frame == 4) {
> 34 __le16 *p, *buf_end;
> 35
> 36 p = (__le16 *)urb_out->transfer_buffer;
> 37 buf_end = p + urb_out->transfer_buffer_length / sizeof(*p);
> 38
> 39 for (; p < buf_end; ++p) {
> 40 short pv = le16_to_cpu(*p);
> 41 int val = (pv * volume[chn & 1]) >> 8;
> 42 pv = clamp(val, 0x7fff, -0x8000);
> ^^^^^^^^^^^^^^^^
> You didn't really add this, but you might know what was intended here.
> It is a complete mystery to me. :)
No mystery, just left/right swapped. It's a common mistake, and
you'll feel the same when you go from Paris to London and look at a
street. I'll fix them (the code, not the street).
thanks,
Takashi
More information about the Alsa-devel
mailing list