[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