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