write(2) lc_r problem

Mathew Kanner mat at cnd.mcgill.ca
Sat Jan 24 12:09:19 PST 2004


On Jan 24, Stefan Ehmann wrote:
> On Sat, 2004-01-24 at 20:15, Mathew Kanner wrote:
> > On Jan 24, Stefan Ehmann wrote:
> > > I'm trying to write a small sound application and run across a problem
> > > on CURRENT.
> > > 
> > > It's very basic at the moment. It simply reads pcm data from a file and
> > > uses write(2) on /dev/dsp.
> > > 
> > > But as soon as I link the program with -lc_r there's always about 1
> > > second delay before a write call - which makes it pretty unusable for
> > > playing sound.
> > > 
> > > It should be easy reproducable if you link audio/waveplay with -lc_r.
> > > 
> > > This doesn't happen in either FreeBSD 4.9, Knoppix or CURRENT if linked
> > > with -lkse or -lthr.
> > > 
> > > Am I'm missing something basic when using write together with lc_r or
> > > ist this a bug in CURRENT?
> > 
> > 	There is definetly a bug with the sound code when using vchans
> > and select.  Make sure that  (using sysctl)
> > 
> > 	hw.snd.maxautovchans=0
> > 	hw.snd.pcmX.vchans=0
> 
> You're right, that fixed it. That's also the reason why it worked on
> stable (vchans was disabled there).

	Please try this untested patch with vchans enabled.

	--Mat


-- 
	We peer so suspiciously at each other that we cannot see
	that we Canadians are standing on the mountaintop of human
	wealth, freedom and privilege.
			- Pierre Elliott Trudeau
-------------- next part --------------
Index: channel.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/sound/pcm/channel.c,v
retrieving revision 1.93
diff -u -r1.93 channel.c
--- channel.c	5 Dec 2003 02:08:13 -0000	1.93
+++ channel.c	24 Jan 2004 20:05:21 -0000
@@ -115,11 +115,19 @@
 static void
 chn_wakeup(struct pcm_channel *c)
 {
-    	struct snd_dbuf *bs = c->bufsoft;
+	struct snd_dbuf *bs = c->bufsoft;
+	struct pcmchan_children *pce;
+
+	//	CHN_LOCKASSERT(c);
+	if (SLIST_EMPTY(&c->children)) {
+		if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c))
+			selwakeup(sndbuf_getsel(bs));
+	} else {
+		SLIST_FOREACH(pce, &c->children, link) {
+			chn_wakeup(pce->channel);
+		}
+	}
 
-	CHN_LOCKASSERT(c);
-	if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c))
-		selwakeuppri(sndbuf_getsel(bs), PRIBIO);
 	wakeup(bs);
 }
 


More information about the freebsd-current mailing list