[alsa-devel] PCM delay compensation

Takashi Iwai tiwai at suse.de
Mon Feb 23 17:33:35 CET 2009


At Mon, 23 Feb 2009 17:28:04 +0100,
I wrote:
> 
> At Mon, 23 Feb 2009 17:24:32 +0100,
> Lennart Poettering wrote:
> > 
> > On Mon, 23.02.09 08:45, Takashi Iwai (tiwai at suse.de) wrote:
> > 
> > > 
> > > At Sun, 22 Feb 2009 00:45:04 +0100,
> > > Lennart Poettering wrote:
> > > > 
> > > > On Tue, 07.10.08 17:32, Takashi Iwai (tiwai at suse.de) wrote:
> > > > 
> > > > > Hi,
> > > > 
> > > > Sorry for the overly long delay.
> > > > > 
> > > > > the patch below (to the latest sound git tree) adds the extra delay
> > > > > count for USB-audio driver.  This change will appear as the return
> > > > > value of snd_pcm_delay().
> > > > > 
> > > > > Could you check whether it's appropriate behavior you've wanted?
> > > > 
> > > > I have now tested this patch on the current 2.6.29-rc5 kernel. The
> > > > effect is that snd_pcm_delay() returns always increasing values, as if
> > > > the playback never proceeds. Most movie players which need that call
> > > > to synchronize video frames hence stall completely.
> > > 
> > > OK, that's bad.  However, the increased value of snd_pcm_delay() is
> > > exactly the effect.  The usb-audio always prefetch the buffer in
> > > advance.
> > > 
> > > That means, changing (or "fixing") snd_pcm_delay() would cause many
> > > regressions with many apps -- thus basically we are not allowed to
> > > change the semantics any more at this too late point.
> > > 
> > > I feel it's better to introduce another kernel-side API to give a
> > > better sync/timing information, and mark snd_pcm_delay as obsolete for
> > > future (although we can never deprecate such a basic API).
> > 
> > No, snd_pcm_delay() with this patch is clearly broken: it apparently
> > increases at the same speed as the hw ptr, ignoring the app
> > ptr. i.e. after 5 min of playback the delay will be reported a 5 mins!
> > After 10 min of playback the delay will be reported as 10 mins!
> 
> Ah, then it must be a buggy patch indeed.  It didn't appear in my
> some test cases at that time, so didn't check after that.
> 
> Maybe some delay account in complete callback wasn't correct.

Maybe a stupid typo below (or removed lines accidentally at
merge/rebase)...


Takashi

---
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 03384db..7b362d1 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -651,6 +651,8 @@ static int retire_playback_urb(struct snd_usb_substream *subs,
 
 	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;


More information about the Alsa-devel mailing list