Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Jun 2006 20:22:29 +0100
From:      Andrea Bittau <a.bittau@cs.ucl.ac.uk>
To:        Eric Anderson <anderson@centtech.com>
Cc:        freebsd-mobile@freebsd.org
Subject:   Re: HDA sound driver mod for thinkpad x60s
Message-ID:  <20060606192229.GA4465@shorty.sorbonet.org>
In-Reply-To: <4485CEF8.10201@centtech.com>
References:  <20060606124030.GA32057@shorty.sorbonet.org> <4485CEF8.10201@centtech.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jun 06, 2006 at 01:52:40PM -0500, Eric Anderson wrote:
> I can't seem to play any audio tho..  I realize this isn't an IBM, but 
> was hoping it would work.. :)

What does that mean?  If you:
cat /dev/urandom > /dev/dsp
does it complain?  dmesg?  Also, if you ctrl C, does it stop after a bit, with
no complatins?

Anyway, assuming my code is "good enough" there might be two reasons why it's
not working:

1) I lamely hardcoded the Output device node identifier.
2) I hardcoded the Pin node identifier for the volume control.


To solve #1 try this in my code:
in hdac_attach2() get rid of the if(0) before sorbo_enum().  That is,
sorbo_enum() needs to be called.  Then, in sorbo_print_widget() get rid of the 0
&& in the type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT.  That is,
sorbo_conf_output() needs to be called if the type is audio output.  [I'm not
sure what happens if all output devices are configured though...].  Basically,
this will cause all output devices to accept the music stream.  Try it like
that.

Ideally you want only one output device to be configured, but I guess if you
look at the dmesg output u can figure out which node identifiers are output
devices and try them all, one at a time, until you find the correct one.  You
might notice that in IBM's case it's a 3, so I call sorbo_conf_output(sc, 0, 3);
Actually, you probably wanna get rid of that call too if your output device is
not node id 3.


To solve #2 do this:
Enable sorbo_enum() like above, and then in sorbo_print_widget() get rid of the
if (0) before sorbo_set_amp(sc, codecid, nodeid, 40);.  Basically, this will
cause all nodes to be amplified.  Try it like that.  Once again, ideally you
only want the correct node [TYPE_PIN] to be amplified.


As a final test, you might want to put a printf in sorbo_in_intr() to see if you
are getting any interrupts.


good luck, and remember to sync before kldload =P



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060606192229.GA4465>