Commit 9624ea81 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] usb-audio: actually schedule playback URBs at frame boundaries

USB generic driver
Change prepare_playback_urb() not to stop preparing packets before a
frame boundary has been reached.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent 7efd8bc8
...@@ -164,6 +164,7 @@ struct snd_usb_substream { ...@@ -164,6 +164,7 @@ struct snd_usb_substream {
unsigned int curframesize; /* current packet size in frames (for capture) */ unsigned int curframesize; /* current packet size in frames (for capture) */
unsigned int fill_max: 1; /* fill max packet size always */ unsigned int fill_max: 1; /* fill max packet size always */
unsigned int fmt_type; /* USB audio format type (1-3) */ unsigned int fmt_type; /* USB audio format type (1-3) */
unsigned int packs_per_ms; /* packets per millisecond (for playback) */
unsigned int running: 1; /* running status */ unsigned int running: 1; /* running status */
...@@ -537,9 +538,13 @@ static int prepare_playback_urb(snd_usb_substream_t *subs, ...@@ -537,9 +538,13 @@ static int prepare_playback_urb(snd_usb_substream_t *subs,
urb->iso_frame_desc[i].length = 0; urb->iso_frame_desc[i].length = 0;
urb->number_of_packets++; urb->number_of_packets++;
} }
break;
} }
break;
} }
/* finish at the frame boundary at/after the period boundary */
if (period_elapsed &&
(i & (subs->packs_per_ms - 1)) == subs->packs_per_ms - 1)
break;
} }
if (subs->hwptr_done + offs > runtime->buffer_size) { if (subs->hwptr_done + offs > runtime->buffer_size) {
/* err, the transferred area goes over buffer boundary. */ /* err, the transferred area goes over buffer boundary. */
...@@ -907,6 +912,7 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by ...@@ -907,6 +912,7 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
packs_per_ms = 8 >> subs->datainterval; packs_per_ms = 8 >> subs->datainterval;
else else
packs_per_ms = 1; packs_per_ms = 1;
subs->packs_per_ms = packs_per_ms;
if (is_playback) { if (is_playback) {
urb_packs = nrpacks; urb_packs = nrpacks;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment