From 177b4980f77dceeb347ec22ede323533c45145da Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 13 Oct 2008 03:08:53 +0200 Subject: [PATCH] --- yaml --- r: 148479 b: refs/heads/master c: ae1ec5e1e97f67d41e641a73380129e5905e41cc h: refs/heads/master i: 148477: a7cd3f0e0d0366f8125976633b1b801db39ccce2 148475: 62a3fcc7c722159ed9e672c9ebd1202f866837e4 148471: 47af932d167c82a93fbc58fe2f4b00e936b02924 148463: a7100c0b92f367a3322a70a711aef76b29951c01 148447: 0a2c6d12663a02c152b13a933dff97420b73ac6c 148415: b1353258603bff115f24b64fee5a98fa936b646c 148351: b8d7b38ede0a9fcaefa9a248382c6cc9b1fbc2b3 148223: 0afa282b980d08c72954f9d0ba9a66c9a455b697 147967: eb257d895f6e48dac60543e061461ea644810153 147455: cada1d8d5107b95ef6be094bd663490652adfd4e v: v3 --- [refs] | 2 +- trunk/sound/usb/usbaudio.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index fddedae550b7..c207b0e87020 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4bbe1ddf89a5ba3ec30fe5980912d8bda3a3cbb2 +refs/heads/master: ae1ec5e1e97f67d41e641a73380129e5905e41cc diff --git a/trunk/sound/usb/usbaudio.c b/trunk/sound/usb/usbaudio.c index 823296d7d578..6c25fa23f702 100644 --- a/trunk/sound/usb/usbaudio.c +++ b/trunk/sound/usb/usbaudio.c @@ -627,6 +627,7 @@ static int prepare_playback_urb(struct snd_usb_substream *subs, subs->hwptr_done += offs; if (subs->hwptr_done >= runtime->buffer_size) subs->hwptr_done -= runtime->buffer_size; + runtime->delay += offs; spin_unlock_irqrestore(&subs->lock, flags); urb->transfer_buffer_length = offs * stride; if (period_elapsed) @@ -636,12 +637,22 @@ static int prepare_playback_urb(struct snd_usb_substream *subs, /* * process after playback data complete - * - nothing to do + * - decrease the delay count again */ static int retire_playback_urb(struct snd_usb_substream *subs, struct snd_pcm_runtime *runtime, struct urb *urb) { + unsigned long flags; + int stride = runtime->frame_bits >> 3; + int processed = urb->transfer_buffer_length / stride; + + spin_lock_irqsave(&subs->lock, flags); + if (processed > runtime->delay) + runtime->delay = 0; + else + runtime->delay -= processed; + spin_unlock_irqrestore(&subs->lock, flags); return 0; } @@ -1520,6 +1531,7 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) subs->hwptr_done = 0; subs->transfer_done = 0; subs->phase = 0; + runtime->delay = 0; /* clear urbs (to be sure) */ deactivate_urbs(subs, 0, 1);