All of lore.kernel.org
 help / color / mirror / Atom feed
* quit snd_pcm_readi, retrieve pending frames
@ 2006-05-13 11:06 Gerald Grabner
  2006-05-14 13:07 ` Clemens Ladisch
  2006-05-15 10:06 ` Takashi Iwai
  0 siblings, 2 replies; 10+ messages in thread
From: Gerald Grabner @ 2006-05-13 11:06 UTC (permalink / raw)
  To: alsa-devel

Hi,

I'm experimenting with the ALSA PCM API and was wondering whether
there is a simple way to exit a record loop by stopping the pcm, but
without loosing pending frames.

Initially, I was thinking of something like this, where I would call
snd_pcm_drop(pcm) from some other thread:

   while ( true )
     {
       r = snd_pcm_readi (pcm, data, frames);
       fwrite (data, 2, 2*r, file);
       if ( r != frames )
         break;
     }

However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
r=-EBADFD.

Is there an easy way to stop snd_pcm_readi in a way that I can
retrieve the residual frames? Do I need to set any parameters for
that purpose?

Many thanks,
Gerald

BTW: I'm using alsa 1.0.11 on gentoo.


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-13 11:06 quit snd_pcm_readi, retrieve pending frames Gerald Grabner
@ 2006-05-14 13:07 ` Clemens Ladisch
  2006-05-15 10:06 ` Takashi Iwai
  1 sibling, 0 replies; 10+ messages in thread
From: Clemens Ladisch @ 2006-05-14 13:07 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

Gerald Grabner wrote:
> Is there an easy way to stop snd_pcm_readi in a way that I can
> retrieve the residual frames?

snd_pcm_readi uses only the readiness state of the PCM device to
determine when to unblock.

If you want to wait for another event, use non-blocking mode and add
another handle to poll().  Typically, a pipe is used for this.


HTH
Clemens


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-13 11:06 quit snd_pcm_readi, retrieve pending frames Gerald Grabner
  2006-05-14 13:07 ` Clemens Ladisch
@ 2006-05-15 10:06 ` Takashi Iwai
  2006-05-17 15:08   ` Takashi Iwai
  1 sibling, 1 reply; 10+ messages in thread
From: Takashi Iwai @ 2006-05-15 10:06 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

At Sat, 13 May 2006 13:06:51 +0200,
Gerald Grabner wrote:
> 
> Hi,
> 
> I'm experimenting with the ALSA PCM API and was wondering whether
> there is a simple way to exit a record loop by stopping the pcm, but
> without loosing pending frames.
> 
> Initially, I was thinking of something like this, where I would call
> snd_pcm_drop(pcm) from some other thread:
> 
>    while ( true )
>      {
>        r = snd_pcm_readi (pcm, data, frames);
>        fwrite (data, 2, 2*r, file);
>        if ( r != frames )
>          break;
>      }
> 
> However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> r=-EBADFD.
> 
> Is there an easy way to stop snd_pcm_readi in a way that I can
> retrieve the residual frames? Do I need to set any parameters for
> that purpose?

If you're using hw or plughw, it's likely a bug in alsa-driver.
Try the patch below.

dsnoop plugin should work as it is, though, and dsnoop is used for
many drivers as default.  Check your configuration at first.


Takashi


diff -r d1f5192b7abb core/pcm_native.c
--- a/core/pcm_native.c	Thu May 11 18:12:23 2006 +0200
+++ b/core/pcm_native.c	Mon May 15 12:00:27 2006 +0200
@@ -1406,6 +1406,18 @@ struct drain_rec {
 
 static int snd_pcm_drop(struct snd_pcm_substream *substream);
 
+static int pcms_still_draining(struct snd_pcm_substream *substream)
+{
+	struct list_head *pos;
+	snd_pcm_group_for_each(pos, substream) {
+		struct snd_pcm_substream *s;
+		s = snd_pcm_group_substream_entry(pos);
+		if (s->runtime->status->state == SNDRV_PCM_STATE_DRAINING)
+			return 1;
+	}
+	return 0; /* yes, all drained */
+}
+
 /*
  * Drain the stream(s).
  * When the substream is linked, sync until the draining of all playback streams
@@ -1469,8 +1481,6 @@ static int snd_pcm_drain(struct snd_pcm_
 		}
 	}
 	up_read(&snd_pcm_link_rwsem);
-	if (! num_drecs)
-		goto _error;
 
 	snd_pcm_stream_lock_irq(substream);
 	/* resume pause */
@@ -1484,21 +1494,12 @@ static int snd_pcm_drain(struct snd_pcm_
 		goto _error;
 	}
 
-	for (;;) {
+	while (pcms_still_draining(substream)) {
 		long tout;
 		if (signal_pending(current)) {
 			result = -ERESTARTSYS;
 			break;
 		}
-		/* all finished? */
-		for (i = 0; i < num_drecs; i++) {
-			runtime = drec[i].substream->runtime;
-			if (runtime->status->state == SNDRV_PCM_STATE_DRAINING)
-				break;
-		}
-		if (i == num_drecs)
-			break; /* yes, all drained */
-
 		set_current_state(TASK_INTERRUPTIBLE);
 		snd_pcm_stream_unlock_irq(substream);
 		snd_power_unlock(card);


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-15 10:06 ` Takashi Iwai
@ 2006-05-17 15:08   ` Takashi Iwai
  2006-05-19 21:17     ` Gerald Grabner
  0 siblings, 1 reply; 10+ messages in thread
From: Takashi Iwai @ 2006-05-17 15:08 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

At Mon, 15 May 2006 12:06:47 +0200,
I wrote:
> 
> At Sat, 13 May 2006 13:06:51 +0200,
> Gerald Grabner wrote:
> > 
> > Hi,
> > 
> > I'm experimenting with the ALSA PCM API and was wondering whether
> > there is a simple way to exit a record loop by stopping the pcm, but
> > without loosing pending frames.
> > 
> > Initially, I was thinking of something like this, where I would call
> > snd_pcm_drop(pcm) from some other thread:
> > 
> >    while ( true )
> >      {
> >        r = snd_pcm_readi (pcm, data, frames);
> >        fwrite (data, 2, 2*r, file);
> >        if ( r != frames )
> >          break;
> >      }
> > 
> > However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> > snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> > r=-EBADFD.
> > 
> > Is there an easy way to stop snd_pcm_readi in a way that I can
> > retrieve the residual frames? Do I need to set any parameters for
> > that purpose?
> 
> If you're using hw or plughw, it's likely a bug in alsa-driver.
> Try the patch below.

Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
the capture streams.  So, the patch becomes pretty simple like below.
I'll commit it to HG repo.


Takashi


diff -r 44d28ed5d3d5 core/pcm_native.c
--- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
+++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
@@ -1469,8 +1469,6 @@ static int snd_pcm_drain(struct snd_pcm_
 		}
 	}
 	up_read(&snd_pcm_link_rwsem);
-	if (! num_drecs)
-		goto _error;
 
 	snd_pcm_stream_lock_irq(substream);
 	/* resume pause */


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-17 15:08   ` Takashi Iwai
@ 2006-05-19 21:17     ` Gerald Grabner
  2006-05-20 13:07       ` Takashi Iwai
  0 siblings, 1 reply; 10+ messages in thread
From: Gerald Grabner @ 2006-05-19 21:17 UTC (permalink / raw)
  To: alsa-devel

Takashi Iwai <tiwai <at> suse.de> writes:
> 
> At Mon, 15 May 2006 12:06:47 +0200,
> I wrote:
> > 
> > At Sat, 13 May 2006 13:06:51 +0200,
> > Gerald Grabner wrote:
> > > 
> > > Hi,
> > > 
> > > I'm experimenting with the ALSA PCM API and was wondering whether
> > > there is a simple way to exit a record loop by stopping the pcm, but
> > > without loosing pending frames.
> > > 
> > > Initially, I was thinking of something like this, where I would call
> > > snd_pcm_drop(pcm) from some other thread:
> > > 
> > >    while ( true )
> > >      {
> > >        r = snd_pcm_readi (pcm, data, frames);
> > >        fwrite (data, 2, 2*r, file);
> > >        if ( r != frames )
> > >          break;
> > >      }
> > > 
> > > However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> > > snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> > > r=-EBADFD.
> > > 
> > > Is there an easy way to stop snd_pcm_readi in a way that I can
> > > retrieve the residual frames? Do I need to set any parameters for
> > > that purpose?
> > 
> > If you're using hw or plughw, it's likely a bug in alsa-driver.
> > Try the patch below.
> 
> Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
> the capture streams.  So, the patch becomes pretty simple like below.
> I'll commit it to HG repo.
> 
> Takashi
> 
> diff -r 44d28ed5d3d5 core/pcm_native.c
> --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
> +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
>  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
struct snd_pcm_
>  		}
>  	}
>  	up_read(&snd_pcm_link_rwsem);
> -	if (! num_drecs)
> -		goto _error;
> 
>  	snd_pcm_stream_lock_irq(substream);
>  	/* resume pause */


Hi Takashi,

there seems to be some problem with this patch (the short one). After
recompiling the kernel (and my application), my application doesn't
exit and I can't kill it anymore. The pcm device is kind of lost. See
below for the /var/log/messages entry.

Gerald


May 19 22:49:58 tux Unable to handle kernel NULL pointer dereference
at virtual address 00000001
May 19 22:49:58 tux printing eip:
May 19 22:49:58 tux 00000001
May 19 22:49:58 tux *pde = 00000000
May 19 22:49:58 tux Oops: 0000 [#1]
May 19 22:49:58 tux PREEMPT 
May 19 22:49:58 tux Modules linked in: ipt_REJECT xt_tcpudp
iptable_filter ipt_MASQUERADE iptable_nat ip_nat ip_conntrack
ip_tables x_tables nvidia
May 19 22:49:58 tux CPU:    0
May 19 22:49:58 tux EIP:    0060:[<00000001>]    Tainted: P      VLI
May 19 22:49:58 tux EFLAGS: 00210087   (2.6.16-gentoo-r7 #2) 
May 19 22:49:58 tux EIP is at 0x1
May 19 22:49:58 tux eax: d8f83ebc ebx: 00000001 ecx: 00000001 edx:
d8f83ec8
May 19 22:49:58 tux esi: 00000001 edi: db22e4a4 ebp: d87e1e84 esp:
d87e1e60
May 19 22:49:58 tux ds: 007b   es: 007b   ss: 0068
May 19 22:49:58 tux Process mplay (pid: 10349, threadinfo=d87e0000
task=df8f60d0)
May 19 22:49:58 tux Stack: <0>c010f8d4 d8f83ebc 00000003 00000000
00000000 00200002 d87e0000 00000000
May 19 22:49:58 tux 00200046 d87e1eac c010f911 db22e4a4 00000003
00000001 00000000 00000000
May 19 22:49:58 tux 00000000 00000001 c03d12fc dfcad980 c02afde4
00000000 00000001 d87e0000
May 19 22:49:58 tux Call Trace:
May 19 22:49:58 tux [<c010f8d4>] __wake_up_common+0x2b/0x47
May 19 22:49:58 tux [<c010f911>] __wake_up+0x21/0x44
May 19 22:49:58 tux [<c02afde4>] snd_pcm_action_single+0x2e/0x44
May 19 22:49:58 tux [<c02afe45>] snd_pcm_action+0x4b/0x55
May 19 22:49:58 tux [<c02b0118>] snd_pcm_stop+0x12/0x16
May 19 22:49:58 tux [<c02b0bbc>] snd_pcm_drop+0x8b/0xc3
May 19 22:49:58 tux [<c02b19d9>] snd_pcm_release+0x1e/0xbb
May 19 22:49:58 tux [<c01444d1>] __fput+0x83/0x142
May 19 22:49:58 tux [<c0143146>] filp_close+0x4c/0x55
May 19 22:49:58 tux [<c011426d>] close_files+0x4b/0x5b
May 19 22:49:58 tux [<c01142be>] put_files_struct+0x13/0x3b
May 19 22:49:58 tux [<c0114bd7>] do_exit+0x19a/0x35d
May 19 22:49:58 tux [<c0114e4f>] sys_exit_group+0x0/0x11
May 19 22:49:58 tux [<c0102549>] syscall_call+0x7/0xb
May 19 22:49:58 tux Code:  Bad EIP value.
May 19 22:49:58 tux <1>Fixing recursive fault but reboot is needed!
May 19 22:49:58 tux scheduling while atomic: mplay/0x00000003/10349
May 19 22:49:58 tux [<c033cbf1>] schedule+0x43/0x53f
May 19 22:49:58 tux [<c0102773>] error_code+0x4f/0x54
May 19 22:49:58 tux [<c0114aea>] do_exit+0xad/0x35d
May 19 22:49:58 tux [<c0102e2b>] do_trap+0x0/0xc1
May 19 22:49:58 tux [<c010e3c8>] do_page_fault+0x38d/0x4bd
May 19 22:49:58 tux [<c0116b54>] __do_softirq+0x34/0x7d
May 19 22:49:58 tux [<c010e03b>] do_page_fault+0x0/0x4bd
May 19 22:49:58 tux [<c0102773>] error_code+0x4f/0x54
May 19 22:49:58 tux [<c010f8d4>] __wake_up_common+0x2b/0x47
May 19 22:49:58 tux [<c010f911>] __wake_up+0x21/0x44
May 19 22:49:58 tux [<c02afde4>] snd_pcm_action_single+0x2e/0x44
May 19 22:49:58 tux [<c02afe45>] snd_pcm_action+0x4b/0x55
May 19 22:49:58 tux [<c02b0118>] snd_pcm_stop+0x12/0x16
May 19 22:49:58 tux [<c02b0bbc>] snd_pcm_drop+0x8b/0xc3
May 19 22:49:58 tux [<c02b19d9>] snd_pcm_release+0x1e/0xbb
May 19 22:49:58 tux [<c01444d1>] __fput+0x83/0x142
May 19 22:49:58 tux [<c0143146>] filp_close+0x4c/0x55
May 19 22:49:58 tux [<c011426d>] close_files+0x4b/0x5b
May 19 22:49:58 tux [<c01142be>] put_files_struct+0x13/0x3b
May 19 22:49:58 tux [<c0114bd7>] do_exit+0x19a/0x35d
May 19 22:49:58 tux [<c0114e4f>] sys_exit_group+0x0/0x11
May 19 22:49:58 tux [<c0102549>] syscall_call+0x7/0xb




-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-19 21:17     ` Gerald Grabner
@ 2006-05-20 13:07       ` Takashi Iwai
  2006-05-20 18:46         ` Gerald Grabner
  0 siblings, 1 reply; 10+ messages in thread
From: Takashi Iwai @ 2006-05-20 13:07 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

At Fri, 19 May 2006 21:17:45 +0000 (UTC),
Gerald Grabner wrote:
> 
> Takashi Iwai <tiwai <at> suse.de> writes:
> > 
> > At Mon, 15 May 2006 12:06:47 +0200,
> > I wrote:
> > > 
> > > At Sat, 13 May 2006 13:06:51 +0200,
> > > Gerald Grabner wrote:
> > > > 
> > > > Hi,
> > > > 
> > > > I'm experimenting with the ALSA PCM API and was wondering whether
> > > > there is a simple way to exit a record loop by stopping the pcm, but
> > > > without loosing pending frames.
> > > > 
> > > > Initially, I was thinking of something like this, where I would call
> > > > snd_pcm_drop(pcm) from some other thread:
> > > > 
> > > >    while ( true )
> > > >      {
> > > >        r = snd_pcm_readi (pcm, data, frames);
> > > >        fwrite (data, 2, 2*r, file);
> > > >        if ( r != frames )
> > > >          break;
> > > >      }
> > > > 
> > > > However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> > > > snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> > > > r=-EBADFD.
> > > > 
> > > > Is there an easy way to stop snd_pcm_readi in a way that I can
> > > > retrieve the residual frames? Do I need to set any parameters for
> > > > that purpose?
> > > 
> > > If you're using hw or plughw, it's likely a bug in alsa-driver.
> > > Try the patch below.
> > 
> > Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
> > the capture streams.  So, the patch becomes pretty simple like below.
> > I'll commit it to HG repo.
> > 
> > Takashi
> > 
> > diff -r 44d28ed5d3d5 core/pcm_native.c
> > --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
> > +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
> >  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
> struct snd_pcm_
> >  		}
> >  	}
> >  	up_read(&snd_pcm_link_rwsem);
> > -	if (! num_drecs)
> > -		goto _error;
> > 
> >  	snd_pcm_stream_lock_irq(substream);
> >  	/* resume pause */
> 
> 
> Hi Takashi,
> 
> there seems to be some problem with this patch (the short one). After
> recompiling the kernel (and my application), my application doesn't
> exit and I can't kill it anymore. The pcm device is kind of lost. See
> below for the /var/log/messages entry.

Hmm, according the error message below, I suspect it's something
different since the patch isn't so intrusive.

Could you test again after reverting the patched part?


thanks,

Takashi

> 
> Gerald
> 
> 
> May 19 22:49:58 tux Unable to handle kernel NULL pointer dereference
> at virtual address 00000001
> May 19 22:49:58 tux printing eip:
> May 19 22:49:58 tux 00000001
> May 19 22:49:58 tux *pde = 00000000
> May 19 22:49:58 tux Oops: 0000 [#1]
> May 19 22:49:58 tux PREEMPT 
> May 19 22:49:58 tux Modules linked in: ipt_REJECT xt_tcpudp
> iptable_filter ipt_MASQUERADE iptable_nat ip_nat ip_conntrack
> ip_tables x_tables nvidia
> May 19 22:49:58 tux CPU:    0
> May 19 22:49:58 tux EIP:    0060:[<00000001>]    Tainted: P      VLI
> May 19 22:49:58 tux EFLAGS: 00210087   (2.6.16-gentoo-r7 #2) 
> May 19 22:49:58 tux EIP is at 0x1
> May 19 22:49:58 tux eax: d8f83ebc ebx: 00000001 ecx: 00000001 edx:
> d8f83ec8
> May 19 22:49:58 tux esi: 00000001 edi: db22e4a4 ebp: d87e1e84 esp:
> d87e1e60
> May 19 22:49:58 tux ds: 007b   es: 007b   ss: 0068
> May 19 22:49:58 tux Process mplay (pid: 10349, threadinfo=d87e0000
> task=df8f60d0)
> May 19 22:49:58 tux Stack: <0>c010f8d4 d8f83ebc 00000003 00000000
> 00000000 00200002 d87e0000 00000000
> May 19 22:49:58 tux 00200046 d87e1eac c010f911 db22e4a4 00000003
> 00000001 00000000 00000000
> May 19 22:49:58 tux 00000000 00000001 c03d12fc dfcad980 c02afde4
> 00000000 00000001 d87e0000
> May 19 22:49:58 tux Call Trace:
> May 19 22:49:58 tux [<c010f8d4>] __wake_up_common+0x2b/0x47
> May 19 22:49:58 tux [<c010f911>] __wake_up+0x21/0x44
> May 19 22:49:58 tux [<c02afde4>] snd_pcm_action_single+0x2e/0x44
> May 19 22:49:58 tux [<c02afe45>] snd_pcm_action+0x4b/0x55
> May 19 22:49:58 tux [<c02b0118>] snd_pcm_stop+0x12/0x16
> May 19 22:49:58 tux [<c02b0bbc>] snd_pcm_drop+0x8b/0xc3
> May 19 22:49:58 tux [<c02b19d9>] snd_pcm_release+0x1e/0xbb
> May 19 22:49:58 tux [<c01444d1>] __fput+0x83/0x142
> May 19 22:49:58 tux [<c0143146>] filp_close+0x4c/0x55
> May 19 22:49:58 tux [<c011426d>] close_files+0x4b/0x5b
> May 19 22:49:58 tux [<c01142be>] put_files_struct+0x13/0x3b
> May 19 22:49:58 tux [<c0114bd7>] do_exit+0x19a/0x35d
> May 19 22:49:58 tux [<c0114e4f>] sys_exit_group+0x0/0x11
> May 19 22:49:58 tux [<c0102549>] syscall_call+0x7/0xb
> May 19 22:49:58 tux Code:  Bad EIP value.
> May 19 22:49:58 tux <1>Fixing recursive fault but reboot is needed!
> May 19 22:49:58 tux scheduling while atomic: mplay/0x00000003/10349
> May 19 22:49:58 tux [<c033cbf1>] schedule+0x43/0x53f
> May 19 22:49:58 tux [<c0102773>] error_code+0x4f/0x54
> May 19 22:49:58 tux [<c0114aea>] do_exit+0xad/0x35d
> May 19 22:49:58 tux [<c0102e2b>] do_trap+0x0/0xc1
> May 19 22:49:58 tux [<c010e3c8>] do_page_fault+0x38d/0x4bd
> May 19 22:49:58 tux [<c0116b54>] __do_softirq+0x34/0x7d
> May 19 22:49:58 tux [<c010e03b>] do_page_fault+0x0/0x4bd
> May 19 22:49:58 tux [<c0102773>] error_code+0x4f/0x54
> May 19 22:49:58 tux [<c010f8d4>] __wake_up_common+0x2b/0x47
> May 19 22:49:58 tux [<c010f911>] __wake_up+0x21/0x44
> May 19 22:49:58 tux [<c02afde4>] snd_pcm_action_single+0x2e/0x44
> May 19 22:49:58 tux [<c02afe45>] snd_pcm_action+0x4b/0x55
> May 19 22:49:58 tux [<c02b0118>] snd_pcm_stop+0x12/0x16
> May 19 22:49:58 tux [<c02b0bbc>] snd_pcm_drop+0x8b/0xc3
> May 19 22:49:58 tux [<c02b19d9>] snd_pcm_release+0x1e/0xbb
> May 19 22:49:58 tux [<c01444d1>] __fput+0x83/0x142
> May 19 22:49:58 tux [<c0143146>] filp_close+0x4c/0x55
> May 19 22:49:58 tux [<c011426d>] close_files+0x4b/0x5b
> May 19 22:49:58 tux [<c01142be>] put_files_struct+0x13/0x3b
> May 19 22:49:58 tux [<c0114bd7>] do_exit+0x19a/0x35d
> May 19 22:49:58 tux [<c0114e4f>] sys_exit_group+0x0/0x11
> May 19 22:49:58 tux [<c0102549>] syscall_call+0x7/0xb
> 
> 
> 
> 
> -------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/alsa-devel
> 


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-20 13:07       ` Takashi Iwai
@ 2006-05-20 18:46         ` Gerald Grabner
  2006-05-22 10:41           ` Takashi Iwai
  0 siblings, 1 reply; 10+ messages in thread
From: Gerald Grabner @ 2006-05-20 18:46 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

Takashi Iwai wrote:
> At Fri, 19 May 2006 21:17:45 +0000 (UTC),
> Gerald Grabner wrote:
>> Takashi Iwai <tiwai <at> suse.de> writes:
>>> At Mon, 15 May 2006 12:06:47 +0200,
>>> I wrote:
>>>> At Sat, 13 May 2006 13:06:51 +0200,
>>>> Gerald Grabner wrote:
>>>>> Hi,
>>>>>
>>>>> I'm experimenting with the ALSA PCM API and was wondering whether
>>>>> there is a simple way to exit a record loop by stopping the pcm, but
>>>>> without loosing pending frames.
>>>>>
>>>>> Initially, I was thinking of something like this, where I would call
>>>>> snd_pcm_drop(pcm) from some other thread:
>>>>>
>>>>>    while ( true )
>>>>>      {
>>>>>        r = snd_pcm_readi (pcm, data, frames);
>>>>>        fwrite (data, 2, 2*r, file);
>>>>>        if ( r != frames )
>>>>>          break;
>>>>>      }
>>>>>
>>>>> However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
>>>>> snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
>>>>> r=-EBADFD.
>>>>>
>>>>> Is there an easy way to stop snd_pcm_readi in a way that I can
>>>>> retrieve the residual frames? Do I need to set any parameters for
>>>>> that purpose?
>>>> If you're using hw or plughw, it's likely a bug in alsa-driver.
>>>> Try the patch below.
>>> Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
>>> the capture streams.  So, the patch becomes pretty simple like below.
>>> I'll commit it to HG repo.
>>>
>>> Takashi
>>>
>>> diff -r 44d28ed5d3d5 core/pcm_native.c
>>> --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
>>> +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
>>>  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
>> struct snd_pcm_
>>>  		}
>>>  	}
>>>  	up_read(&snd_pcm_link_rwsem);
>>> -	if (! num_drecs)
>>> -		goto _error;
>>>
>>>  	snd_pcm_stream_lock_irq(substream);
>>>  	/* resume pause */
>>
>> Hi Takashi,
>>
>> there seems to be some problem with this patch (the short one). After
>> recompiling the kernel (and my application), my application doesn't
>> exit and I can't kill it anymore. The pcm device is kind of lost. See
>> below for the /var/log/messages entry.
> 
> Hmm, according the error message below, I suspect it's something
> different since the patch isn't so intrusive.
> 
> Could you test again after reverting the patched part?

After recompiling the kernel with the original source, the problem
disappeared.

Gerald


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-20 18:46         ` Gerald Grabner
@ 2006-05-22 10:41           ` Takashi Iwai
  2006-05-22 16:28             ` Takashi Iwai
  2006-06-04 11:51             ` Gerald Grabner
  0 siblings, 2 replies; 10+ messages in thread
From: Takashi Iwai @ 2006-05-22 10:41 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

[-- Attachment #1: Type: text/plain, Size: 2630 bytes --]

At Sat, 20 May 2006 20:46:34 +0200,
Gerald Grabner wrote:
> 
> Takashi Iwai wrote:
> > At Fri, 19 May 2006 21:17:45 +0000 (UTC),
> > Gerald Grabner wrote:
> >> Takashi Iwai <tiwai <at> suse.de> writes:
> >>> At Mon, 15 May 2006 12:06:47 +0200,
> >>> I wrote:
> >>>> At Sat, 13 May 2006 13:06:51 +0200,
> >>>> Gerald Grabner wrote:
> >>>>> Hi,
> >>>>>
> >>>>> I'm experimenting with the ALSA PCM API and was wondering whether
> >>>>> there is a simple way to exit a record loop by stopping the pcm, but
> >>>>> without loosing pending frames.
> >>>>>
> >>>>> Initially, I was thinking of something like this, where I would call
> >>>>> snd_pcm_drop(pcm) from some other thread:
> >>>>>
> >>>>>    while ( true )
> >>>>>      {
> >>>>>        r = snd_pcm_readi (pcm, data, frames);
> >>>>>        fwrite (data, 2, 2*r, file);
> >>>>>        if ( r != frames )
> >>>>>          break;
> >>>>>      }
> >>>>>
> >>>>> However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> >>>>> snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> >>>>> r=-EBADFD.
> >>>>>
> >>>>> Is there an easy way to stop snd_pcm_readi in a way that I can
> >>>>> retrieve the residual frames? Do I need to set any parameters for
> >>>>> that purpose?
> >>>> If you're using hw or plughw, it's likely a bug in alsa-driver.
> >>>> Try the patch below.
> >>> Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
> >>> the capture streams.  So, the patch becomes pretty simple like below.
> >>> I'll commit it to HG repo.
> >>>
> >>> Takashi
> >>>
> >>> diff -r 44d28ed5d3d5 core/pcm_native.c
> >>> --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
> >>> +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
> >>>  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
> >> struct snd_pcm_
> >>>  		}
> >>>  	}
> >>>  	up_read(&snd_pcm_link_rwsem);
> >>> -	if (! num_drecs)
> >>> -		goto _error;
> >>>
> >>>  	snd_pcm_stream_lock_irq(substream);
> >>>  	/* resume pause */
> >>
> >> Hi Takashi,
> >>
> >> there seems to be some problem with this patch (the short one). After
> >> recompiling the kernel (and my application), my application doesn't
> >> exit and I can't kill it anymore. The pcm device is kind of lost. See
> >> below for the /var/log/messages entry.
> > 
> > Hmm, according the error message below, I suspect it's something
> > different since the patch isn't so intrusive.
> > 
> > Could you test again after reverting the patched part?
> 
> After recompiling the kernel with the original source, the problem
> disappeared.

OK, could you try the patch below?


thanks,

Takashi

[-- Attachment #2: Type: text/plain, Size: 540 bytes --]

diff -r 18da48cda4cc core/pcm_native.c
--- a/core/pcm_native.c	Mon May 22 12:05:42 2006 +0200
+++ b/core/pcm_native.c	Mon May 22 12:39:22 2006 +0200
@@ -1381,7 +1381,8 @@ static int snd_pcm_do_drain_init(struct 
 		if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) {
 			int state = snd_pcm_capture_avail(runtime) > 0 ?
 				SNDRV_PCM_STATE_DRAINING : SNDRV_PCM_STATE_SETUP;
-			snd_pcm_do_stop(substream, state);
+			substream->ops->trigger(substream,
+						SNDRV_PCM_TRIGGER_STOP);
 			snd_pcm_post_stop(substream, state);
 		}
 	}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-22 10:41           ` Takashi Iwai
@ 2006-05-22 16:28             ` Takashi Iwai
  2006-06-04 11:51             ` Gerald Grabner
  1 sibling, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2006-05-22 16:28 UTC (permalink / raw)
  To: Gerald Grabner; +Cc: alsa-devel

At Mon, 22 May 2006 12:41:45 +0200,
I wrote:
> 
> [1  <text/plain; US-ASCII (7bit)>]
> At Sat, 20 May 2006 20:46:34 +0200,
> Gerald Grabner wrote:
> > 
> > Takashi Iwai wrote:
> > > At Fri, 19 May 2006 21:17:45 +0000 (UTC),
> > > Gerald Grabner wrote:
> > >> Takashi Iwai <tiwai <at> suse.de> writes:
> > >>> At Mon, 15 May 2006 12:06:47 +0200,
> > >>> I wrote:
> > >>>> At Sat, 13 May 2006 13:06:51 +0200,
> > >>>> Gerald Grabner wrote:
> > >>>>> Hi,
> > >>>>>
> > >>>>> I'm experimenting with the ALSA PCM API and was wondering whether
> > >>>>> there is a simple way to exit a record loop by stopping the pcm, but
> > >>>>> without loosing pending frames.
> > >>>>>
> > >>>>> Initially, I was thinking of something like this, where I would call
> > >>>>> snd_pcm_drop(pcm) from some other thread:
> > >>>>>
> > >>>>>    while ( true )
> > >>>>>      {
> > >>>>>        r = snd_pcm_readi (pcm, data, frames);
> > >>>>>        fwrite (data, 2, 2*r, file);
> > >>>>>        if ( r != frames )
> > >>>>>          break;
> > >>>>>      }
> > >>>>>
> > >>>>> However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
> > >>>>> snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
> > >>>>> r=-EBADFD.
> > >>>>>
> > >>>>> Is there an easy way to stop snd_pcm_readi in a way that I can
> > >>>>> retrieve the residual frames? Do I need to set any parameters for
> > >>>>> that purpose?
> > >>>> If you're using hw or plughw, it's likely a bug in alsa-driver.
> > >>>> Try the patch below.
> > >>> Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
> > >>> the capture streams.  So, the patch becomes pretty simple like below.
> > >>> I'll commit it to HG repo.
> > >>>
> > >>> Takashi
> > >>>
> > >>> diff -r 44d28ed5d3d5 core/pcm_native.c
> > >>> --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
> > >>> +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
> > >>>  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
> > >> struct snd_pcm_
> > >>>  		}
> > >>>  	}
> > >>>  	up_read(&snd_pcm_link_rwsem);
> > >>> -	if (! num_drecs)
> > >>> -		goto _error;
> > >>>
> > >>>  	snd_pcm_stream_lock_irq(substream);
> > >>>  	/* resume pause */
> > >>
> > >> Hi Takashi,
> > >>
> > >> there seems to be some problem with this patch (the short one). After
> > >> recompiling the kernel (and my application), my application doesn't
> > >> exit and I can't kill it anymore. The pcm device is kind of lost. See
> > >> below for the /var/log/messages entry.
> > > 
> > > Hmm, according the error message below, I suspect it's something
> > > different since the patch isn't so intrusive.
> > > 
> > > Could you test again after reverting the patched part?
> > 
> > After recompiling the kernel with the original source, the problem
> > disappeared.
> 
> OK, could you try the patch below?

In case it still doesn't fix -- please elaborate what your app
actually does.  Or even better a small test code.
I still don't figure out how can it happen.


thanks,

Takashi


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: quit snd_pcm_readi, retrieve pending frames
  2006-05-22 10:41           ` Takashi Iwai
  2006-05-22 16:28             ` Takashi Iwai
@ 2006-06-04 11:51             ` Gerald Grabner
  1 sibling, 0 replies; 10+ messages in thread
From: Gerald Grabner @ 2006-06-04 11:51 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

Takashi Iwai wrote:
> At Sat, 20 May 2006 20:46:34 +0200,
> Gerald Grabner wrote:
>> Takashi Iwai wrote:
>>> At Fri, 19 May 2006 21:17:45 +0000 (UTC),
>>> Gerald Grabner wrote:
>>>> Takashi Iwai <tiwai <at> suse.de> writes:
>>>>> At Mon, 15 May 2006 12:06:47 +0200,
>>>>> I wrote:
>>>>>> At Sat, 13 May 2006 13:06:51 +0200,
>>>>>> Gerald Grabner wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I'm experimenting with the ALSA PCM API and was wondering whether
>>>>>>> there is a simple way to exit a record loop by stopping the pcm, but
>>>>>>> without loosing pending frames.
>>>>>>>
>>>>>>> Initially, I was thinking of something like this, where I would call
>>>>>>> snd_pcm_drop(pcm) from some other thread:
>>>>>>>
>>>>>>>    while ( true )
>>>>>>>      {
>>>>>>>        r = snd_pcm_readi (pcm, data, frames);
>>>>>>>        fwrite (data, 2, 2*r, file);
>>>>>>>        if ( r != frames )
>>>>>>>          break;
>>>>>>>      }
>>>>>>>
>>>>>>> However, snd_pcm_drain(pcm) doesn't work here; the loop continues.
>>>>>>> snd_pcm_drop(pcm) breaks the loop, but pending frames are lost, and
>>>>>>> r=-EBADFD.
>>>>>>>
>>>>>>> Is there an easy way to stop snd_pcm_readi in a way that I can
>>>>>>> retrieve the residual frames? Do I need to set any parameters for
>>>>>>> that purpose?
>>>>>> If you're using hw or plughw, it's likely a bug in alsa-driver.
>>>>>> Try the patch below.
>>>>> Actually the patch was also wrong.  snd_pcm_drain() shouldn't wait for
>>>>> the capture streams.  So, the patch becomes pretty simple like below.
>>>>> I'll commit it to HG repo.
>>>>>
>>>>> Takashi
>>>>>
>>>>> diff -r 44d28ed5d3d5 core/pcm_native.c
>>>>> --- a/core/pcm_native.c	Wed May 17 11:26:39 2006 +0200
>>>>> +++ b/core/pcm_native.c	Wed May 17 17:07:17 2006 +0200
>>>>>  <at>  <at>  -1469,8 +1469,6  <at>  <at>  static int snd_pcm_drain(
>>>> struct snd_pcm_
>>>>>  		}
>>>>>  	}
>>>>>  	up_read(&snd_pcm_link_rwsem);
>>>>> -	if (! num_drecs)
>>>>> -		goto _error;
>>>>>
>>>>>  	snd_pcm_stream_lock_irq(substream);
>>>>>  	/* resume pause */
>>>> Hi Takashi,
>>>>
>>>> there seems to be some problem with this patch (the short one). After
>>>> recompiling the kernel (and my application), my application doesn't
>>>> exit and I can't kill it anymore. The pcm device is kind of lost. See
>>>> below for the /var/log/messages entry.
>>> Hmm, according the error message below, I suspect it's something
>>> different since the patch isn't so intrusive.
>>>
>>> Could you test again after reverting the patched part?
>> After recompiling the kernel with the original source, the problem
>> disappeared.
> 
> OK, could you try the patch below?
> 
> 
> thanks,
> 
> Takashi
> 
> 
> ------------------------------------------------------------------------
> 
> diff -r 18da48cda4cc core/pcm_native.c
> --- a/core/pcm_native.c	Mon May 22 12:05:42 2006 +0200
> +++ b/core/pcm_native.c	Mon May 22 12:39:22 2006 +0200
> @@ -1381,7 +1381,8 @@ static int snd_pcm_do_drain_init(struct 
>  		if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) {
>  			int state = snd_pcm_capture_avail(runtime) > 0 ?
>  				SNDRV_PCM_STATE_DRAINING : SNDRV_PCM_STATE_SETUP;
> -			snd_pcm_do_stop(substream, state);
> +			substream->ops->trigger(substream,
> +						SNDRV_PCM_TRIGGER_STOP);
>  			snd_pcm_post_stop(substream, state);
>  		}
>  	}

With this patch, I don't run into the same problem as with the last
one, i.e. there are no error messages.

However, it still doesn't do what I want - which is most probably my
own fault. In my program, there is one thread like this:

     while ( true )
       {
         r = snd_pcm_readi (pcm, data, frames);
         fwrite (data, 2, 2*r, file);
         if ( r != frames )
           break;
       }

My idea was to arrive at the break statement by calling
snd_pcm_drain(pcm) from another thread, but without loosing the
pending frames. If I understood Clemens Ladisch correctly, I will have
to use poll() for that purpose...

Thx,
Gerald

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2006-06-04 11:51 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-05-13 11:06 quit snd_pcm_readi, retrieve pending frames Gerald Grabner
2006-05-14 13:07 ` Clemens Ladisch
2006-05-15 10:06 ` Takashi Iwai
2006-05-17 15:08   ` Takashi Iwai
2006-05-19 21:17     ` Gerald Grabner
2006-05-20 13:07       ` Takashi Iwai
2006-05-20 18:46         ` Gerald Grabner
2006-05-22 10:41           ` Takashi Iwai
2006-05-22 16:28             ` Takashi Iwai
2006-06-04 11:51             ` Gerald Grabner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.