Date: Sat, 24 Jan 2004 15:03:43 -0500 From: Mathew Kanner <mat@cnd.mcgill.ca> To: Stefan Ehmann <shoesoft@gmx.net> Cc: Mathew Kanner <mat@cnd.mcgill.ca> Subject: Re: write(2) lc_r problem Message-ID: <20040124200343.GP64193@cnd.mcgill.ca> In-Reply-To: <1074973701.719.4.camel@shoeserv.freebsd> References: <1074937301.2959.7.camel@shoeserv.freebsd> <20040124191514.GO64193@cnd.mcgill.ca> <1074973701.719.4.camel@shoeserv.freebsd>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040124200343.GP64193>
