Subject: Re: Recording with wss(4) hardware seems to be broken in NetBSD-3.X, anyone else agree?
To: None <current-users@NetBSD.org, port-i386@NetBSD.org>
From: Valeriy E. Ushakov <uwe@stderr.spb.ru>
List: port-i386
Date: 08/13/2007 07:44:50
I have wss(4) in my old dell laptop, and I tried to record something
and saw two problems:
. cat /dev/audio produces nothing
. audiorecord complains about invalid arguments to ioctl
There seems to be two bugs contributing to this.
The following patch makes cat /dev/audio work. The quality is crappy
but I haven't tried to fool with any mixer settings, etc, and I really
have no clue as to what's going on here hardware-wise, so someone with
a datasheet should verify this.
Index: isa/ad1848_isa.c
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/ad1848_isa.c,v
retrieving revision 1.32
diff -u -r1.32 ad1848_isa.c
--- isa/ad1848_isa.c 16 Nov 2006 01:33:00 -0000 1.32
+++ isa/ad1848_isa.c 13 Aug 2007 03:21:20 -0000
@@ -580,7 +580,7 @@
DMAMODE_READ | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT);
isc->sc_recrun = 1;
- if (sc->mode == 2 && isc->sc_playdrq != isc->sc_recdrq) {
+ if (sc->mode >= 2 && isc->sc_playdrq != isc->sc_recdrq) {
isc->sc_rintr = intr;
isc->sc_rarg = arg;
} else {
@@ -711,7 +711,7 @@
/* Handle interrupt */
if ((status & INTERRUPT_STATUS) != 0) {
- if (sc->mode == 2 && isc->sc_playdrq != isc->sc_recdrq) {
+ if (sc->mode >= 2 && isc->sc_playdrq != isc->sc_recdrq) {
status = ad_read(sc, CS_IRQ_STATUS);
if ((status & CS_IRQ_PI) && isc->sc_playrun) {
(*isc->sc_pintr)(isc->sc_parg);
The next patch is necessary to make audiorecord work (cat /dev/audio
bypasses SETINFO dance that audiorecord makes and so doens't bump into
this bug).
I *very* much doubt that hiding nports++ behind a short-circuiting &&
was really intended. Please correct me if there's some higher purpose
in this.
(As an aside, this is exactly the reason why I hate assignments hidden
in tests, especially pre/post-increments. while (*dst++=*src++); is
cute, clarity of the code is much more valuable)
Index: audio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/audio.c,v
retrieving revision 1.222
diff -u -r1.222 audio.c
--- audio.c 11 Jun 2007 13:05:46 -0000 1.222
+++ audio.c 13 Aug 2007 03:21:20 -0000
@@ -576,8 +576,9 @@
au_portof(sc, mi->un.e.member[j].label.name,
mi->mixer_class);
if (ports->mixerout != -1 &&
- ports->miport[ports->nports++] != -1)
+ ports->miport[ports->nports] != -1)
ports->isdual = true;
+ ++ports->nports;
}
} else if (mi->type == AUDIO_MIXER_SET) {
for(i = 0; tbl[i].name; i++)
SY, Uwe
--
uwe@stderr.spb.ru | Zu Grunde kommen
http://snark.ptc.spbu.ru/~uwe/ | Ist zu Grunde gehen