ALSA: line6: Fix volume calculation for big-endian
authorTakashi Iwai <tiwai@suse.de>
Wed, 28 Jan 2015 11:29:05 +0000 (12:29 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 28 Jan 2015 19:50:54 +0000 (20:50 +0100)
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/line6/playback.c

index 1708c05f14dbeff506bef82d463782dce375955c..ae41124c351e21bab04965279fd5797ab9787549 100644 (file)
@@ -31,14 +31,16 @@ static void change_volume(struct urb *urb_out, int volume[],
                return;         /* maximum volume - no change */
 
        if (bytes_per_frame == 4) {
-               short *p, *buf_end;
+               __le16 *p, *buf_end;
 
-               p = (short *)urb_out->transfer_buffer;
+               p = (__le16 *)urb_out->transfer_buffer;
                buf_end = p + urb_out->transfer_buffer_length / sizeof(*p);
 
                for (; p < buf_end; ++p) {
-                       int val = (*p * volume[chn & 1]) >> 8;
-                       *p = clamp(val, 0x7fff, -0x8000);
+                       short pv = le16_to_cpu(*p);
+                       int val = (pv * volume[chn & 1]) >> 8;
+                       pv = clamp(val, 0x7fff, -0x8000);
+                       *p = cpu_to_le16(pv);
                        ++chn;
                }
        } else if (bytes_per_frame == 6) {
@@ -114,15 +116,18 @@ static void add_monitor_signal(struct urb *urb_out, unsigned char *signal,
                return;         /* zero volume - no change */
 
        if (bytes_per_frame == 4) {
-               short *pi, *po, *buf_end;
+               __le16 *pi, *po, *buf_end;
 
-               pi = (short *)signal;
-               po = (short *)urb_out->transfer_buffer;
+               pi = (__le16 *)signal;
+               po = (__le16 *)urb_out->transfer_buffer;
                buf_end = po + urb_out->transfer_buffer_length / sizeof(*po);
 
                for (; po < buf_end; ++pi, ++po) {
-                       int val = *po + ((*pi * volume) >> 8);
-                       *po = clamp(val, 0x7fff, -0x8000);
+                       short pov = le16_to_cpu(*po);
+                       short piv = le16_to_cpu(*pi);
+                       int val = pov + ((piv * volume) >> 8);
+                       pov = clamp(val, 0x7fff, -0x8000);
+                       *po = cpu_to_le16(pov);
                }
        }