Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 342621
b: refs/heads/master
c: 48779a0
h: refs/heads/master
i:
  342619: 58e4dfb
v: v3
  • Loading branch information
Takashi Iwai committed Nov 23, 2012
1 parent 49ae3ac commit 1cc01ed
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3f94fad09538ec988919ec3f371841182df71d04
refs/heads/master: 48779a0b8ffc45f7f2b519ef462a72b1c5208d09
18 changes: 17 additions & 1 deletion trunk/sound/usb/pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
int frame_diff;
int est_delay;

if (!subs->last_delay)
return 0; /* short path */

current_frame_number = usb_get_current_frame_number(subs->dev);
/*
* HCD implementations use different widths, use lower 8 bits.
Expand Down Expand Up @@ -1195,6 +1198,9 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
return;

spin_lock_irqsave(&subs->lock, flags);
if (!subs->last_delay)
goto out; /* short path */

est_delay = snd_usb_pcm_delay(subs, runtime->rate);
/* update delay with exact number of samples played */
if (processed > subs->last_delay)
Expand All @@ -1212,6 +1218,15 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
snd_printk(KERN_DEBUG "delay: estimated %d, actual %d\n",
est_delay, subs->last_delay);

if (!subs->running) {
/* update last_frame_number for delay counting here since
* prepare_playback_urb won't be called during pause
*/
subs->last_frame_number =
usb_get_current_frame_number(subs->dev) & 0xff;
}

out:
spin_unlock_irqrestore(&subs->lock, flags);
}

Expand Down Expand Up @@ -1253,7 +1268,8 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea
return 0;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
subs->data_endpoint->prepare_data_urb = NULL;
subs->data_endpoint->retire_data_urb = NULL;
/* keep retire_data_urb for delay calculation */
subs->data_endpoint->retire_data_urb = retire_playback_urb;
subs->running = 0;
return 0;
}
Expand Down

0 comments on commit 1cc01ed

Please sign in to comment.