[alsa-devel] multi-channel playback regression

Takashi Iwai tiwai at suse.de
Thu Jul 23 10:15:59 CEST 2009


At Thu, 23 Jul 2009 15:56:20 +0800,
Wu Fengguang wrote:
> 
> On Thu, Jul 23, 2009 at 03:30:54PM +0800, Takashi Iwai wrote:
> > At Thu, 23 Jul 2009 15:22:53 +0800,
> > Wu Fengguang wrote:
> > > 
> > > On Thu, Jul 23, 2009 at 03:01:21PM +0800, Takashi Iwai wrote:
> > > > At Thu, 23 Jul 2009 14:53:45 +0800,
> > > > Wu Fengguang wrote:
> > > > > 
> > > > > Hi Takashi,
> > > > > 
> > > > > When doing multi-channel playback tests on IbexPeak, I found that the
> > > > > following patch makes the playback enter an infinite loop, repeatedly
> > > > > playing a range of ~0.5s audio content. (Seems that some buffer
> > > > > pointer can never advance.)
> > > > 
> > > > Could you set 1 to /proc/asound/card0/pcm0p/xrun_debug and give the
> > > > messages?  Also, please show /proc/.../pcm0p/sub0/hw_params, too.
> > > > 
> > > > The change affects only the code path for the problematic hardware
> > > > that reports wrong DMA position.  So, if this change regresses, it
> > > > means that the device has been already problematic from the
> > > > beginning...
> > > 
> > > I caught some messages:
> > 
> > Is this with the patched (as is on sound git tree) kernel?
> 
> Yes, it's unmodified latest git tree.
> 
> > What if changing from #if 1 to #if 0?
> 
> This makes 8-channel playback work again.

OK, then could you apply the patch below, and do
"echo 9 > /proc/../xrun_debug", then gather the messages with both
#if 1 and #if 0?  This will record the each snd_pcm_period_elpased()
so beware that you may get flood of messages.


thanks,

Takashi

---
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 3b673e2..065eaf0 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -233,6 +233,18 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
 		xrun(substream);
 		return -EPIPE;
 	}
+	if (xrun_debug(substream, 8)) {
+		char name[16];
+		pcm_debug_name(substream, name, sizeof(name));
+		snd_printd("period_update: %s: pos=0x%x/0x%x/0x%x, "
+			   "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
+			   name, pos,
+			   (int)runtime->period_size,
+			   (int)runtime->buffer_size,
+			   (long)old_hw_ptr,
+			   (long)runtime->hw_ptr_base,
+			   (long)runtime->hw_ptr_interrupt);
+	}
 	hw_base = runtime->hw_ptr_base;
 	new_hw_ptr = hw_base + pos;
 	hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size;
@@ -353,6 +365,19 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
 		xrun(substream);
 		return -EPIPE;
 	}
+	if (xrun_debug(substream, 16)) {
+		char name[16];
+		pcm_debug_name(substream, name, sizeof(name));
+		snd_printd("hw_update: %s: pos=0x%x/0x%x/0x%x, "
+			   "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
+			   name, pos,
+			   (int)runtime->period_size,
+			   (int)runtime->buffer_size,
+			   (long)old_hw_ptr,
+			   (long)runtime->hw_ptr_base,
+			   (long)runtime->hw_ptr_interrupt);
+	}
+
 	hw_base = runtime->hw_ptr_base;
 	new_hw_ptr = hw_base + pos;
 


More information about the Alsa-devel mailing list