summary refs log tree commit diff
path: root/sound/usb/usbaudio.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2005-05-13 07:50:28 +0200
committerJaroslav Kysela <perex@suse.cz>2005-05-29 10:08:53 +0200
commit29b16931f936fdbcd78995e66d0f5626f3afbda8 (patch)
tree938e0d682b0977d093690481a842132fb5a22718 /sound/usb/usbaudio.c
parent50cdbf1519a891bec4ce306c7bae397a0d8e7246 (diff)
downloadlinux-29b16931f936fdbcd78995e66d0f5626f3afbda8.tar.gz
[ALSA] usb-audio - avoid unnecessary double buffering
USB generic driver
When a USB packet boundary falls exactly on a buffer boundary, hwptr
remains at the end of the buffer which causes an overflow in the next
iteration and triggers double buffering although the next packet would
actually be contiguous.

This patch ensures that hwptr is always smaller than buffer_size.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/usb/usbaudio.c')
-rw-r--r--sound/usb/usbaudio.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index a6ed0d08337e..076da19a9e28 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -565,6 +565,8 @@ static int prepare_playback_urb(snd_usb_substream_t *subs,
 		/* set the buffer pointer */
 		urb->transfer_buffer = runtime->dma_area + subs->hwptr * stride;
 		subs->hwptr += offs;
+		if (subs->hwptr == runtime->buffer_size)
+			subs->hwptr = 0;
 	}
 	spin_unlock_irqrestore(&subs->lock, flags);
 	urb->transfer_buffer_length = offs * stride;