ALSA: snd-usb: use ep->stride from urb callbacks
authorDaniel Mack <zonque@gmail.com>
Tue, 16 Apr 2013 16:01:37 +0000 (00:01 +0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 18 Apr 2013 08:03:23 +0000 (10:03 +0200)
For normal PCM transfer, this change has no effect, as the endpoint's
stride is always frame_bits/8. For DSD DOP streams, however, which is
added later, the hardware stride differs from the software stride, and
the endpoint has the correct information in these cases.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/pcm.c

index 9916c85..099c0fe 100644 (file)
@@ -1236,8 +1236,8 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
                        counts = snd_usb_endpoint_next_packet_size(ep);
 
                /* set up descriptor */
-               urb->iso_frame_desc[i].offset = frames * stride;
-               urb->iso_frame_desc[i].length = counts * stride;
+               urb->iso_frame_desc[i].offset = frames * ep->stride;
+               urb->iso_frame_desc[i].length = counts * ep->stride;
                frames += counts;
                urb->number_of_packets++;
                subs->transfer_done += counts;
@@ -1251,14 +1251,14 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
                                        frames -= subs->transfer_done;
                                        counts -= subs->transfer_done;
                                        urb->iso_frame_desc[i].length =
-                                               counts * stride;
+                                               counts * ep->stride;
                                        subs->transfer_done = 0;
                                }
                                i++;
                                if (i < ctx->packets) {
                                        /* add a transfer delimiter */
                                        urb->iso_frame_desc[i].offset =
-                                               frames * stride;
+                                               frames * ep->stride;
                                        urb->iso_frame_desc[i].length = 0;
                                        urb->number_of_packets++;
                                }
@@ -1269,7 +1269,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
                    !snd_usb_endpoint_implicit_feedback_sink(subs->data_endpoint)) /* finish at the period boundary */
                        break;
        }
-       bytes = frames * stride;
+       bytes = frames * ep->stride;
        if (subs->hwptr_done + bytes > runtime->buffer_size * stride) {
                /* err, the transferred area goes over buffer boundary. */
                unsigned int bytes1 =
@@ -1310,8 +1310,8 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
 {
        unsigned long flags;
        struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
-       int stride = runtime->frame_bits >> 3;
-       int processed = urb->transfer_buffer_length / stride;
+       struct snd_usb_endpoint *ep = subs->data_endpoint;
+       int processed = urb->transfer_buffer_length / ep->stride;
        int est_delay;
 
        /* ignore the delay accounting when procssed=0 is given, i.e.