[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