At Tue, 05 Sep 2006 17:18:00 +0200, I wrote: > > At Tue, 05 Sep 2006 23:29:46 +1000, > Vini Engel wrote: > > > > Does anyone have any information on how to make the hda-intel driver > > work properly when the codec is recognised as generic? My sound works > > but I have no mic and no headphones output. > > > > The mixer shows only the master volume and PCM, the input tab has only > > capture. The sound comes out well but the rest doesn't work. When I > > first installed FC5 on this machine I noticed an interesting thing, the > > mixer showed me the master volume control but when I ran XMMS and used > > the volume control on XMMS I noticed that the mixer had died then when I > > loaded it back the PCM control was there. > > > > I have done some research and found that people with different laptops > > have to pass a parameter to the module when loading it. I haven't seen > > anything that could possible relate to my card and laptop so if anyone > > here has had any similar issue and would like to share the experience I > > will much appreciate. > > > > My laptop is a Compaq V3000Z, with a AMD Turion 64 X2. I am running > > Fedora Core 5 and kernel 2.6.17-1.2174_FC5. > > > > Below is some information that I collected from my proc file system. > > > > I have had a look into the driver's code and found that the vendor ID > > (below) is nowhere there. Perhaps that might be the reason that it > > doesn't work properly? > > Yes, it looks like a Conexant codec that we don't support. That is, > there is no codec-specific code for this chip but everyhing is parsed > by the generic parser. > > The mic problem is known and fixed recently. The headphone output is > unlikely fixed yet. Anyway, try ALSA 1.0.13rc1.
The patch below might fix the headphone problem, too. Give it a try. It's to HG version but should be applicable to 1.0.13rc1, too. Takashi diff -r 63e58b008259 pci/hda/hda_generic.c --- a/pci/hda/hda_generic.c Mon Sep 04 13:03:51 2006 +0200 +++ b/pci/hda/hda_generic.c Tue Sep 05 18:16:32 2006 +0200 @@ -46,11 +46,18 @@ struct hda_gnode { }; /* patch-specific record */ + +#define MAX_PCM_VOLS 2 +struct pcm_vol { + struct hda_gnode *node; /* Node for PCM volume */ + unsigned int index; /* connection of PCM volume */ +}; + struct hda_gspec { struct hda_gnode *dac_node[2]; /* DAC node */ struct hda_gnode *out_pin_node[2]; /* Output pin (Line-Out) node */ - struct hda_gnode *pcm_vol_node[2]; /* Node for PCM volume */ - unsigned int pcm_vol_index[2]; /* connection of PCM volume */ + struct pcm_vol pcm_vol[MAX_PCM_VOLS]; /* PCM volumes */ + unsigned int pcm_vol_nodes; /* number of PCM volumes */ struct hda_gnode *adc_node; /* ADC node */ struct hda_gnode *cap_vol_node; /* Node for capture volume */ @@ -285,9 +292,11 @@ static int parse_output_path(struct hda_ return node == spec->dac_node[dac_idx]; } spec->dac_node[dac_idx] = node; - if (node->wid_caps & AC_WCAP_OUT_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = 0; + if ((node->wid_caps & AC_WCAP_OUT_AMP) && + spec->pcm_vol_nodes < MAX_PCM_VOLS) { + spec->pcm_vol[spec->pcm_vol_nodes].node = node; + spec->pcm_vol[spec->pcm_vol_nodes].index = 0; + spec->pcm_vol_nodes++; } return 1; /* found */ } @@ -307,13 +316,16 @@ static int parse_output_path(struct hda_ select_input_connection(codec, node, i); unmute_input(codec, node, i); unmute_output(codec, node); - if (! spec->pcm_vol_node[dac_idx]) { - if (node->wid_caps & AC_WCAP_IN_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = i; - } else if (node->wid_caps & AC_WCAP_OUT_AMP) { - spec->pcm_vol_node[dac_idx] = node; - spec->pcm_vol_index[dac_idx] = 0; + if (spec->dac_node[dac_idx] && + spec->pcm_vol_nodes < MAX_PCM_VOLS && + !(spec->dac_node[dac_idx]->wid_caps & + AC_WCAP_OUT_AMP)) { + if ((node->wid_caps & AC_WCAP_IN_AMP) || + (node->wid_caps & AC_WCAP_OUT_AMP)) { + int n = spec->pcm_vol_nodes; + spec->pcm_vol[n].node = node; + spec->pcm_vol[n].index = i; + spec->pcm_vol_nodes++; } } return 1; @@ -370,7 +382,9 @@ static struct hda_gnode *parse_output_ja /* set PIN-Out enable */ snd_hda_codec_write(codec, node->nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, - AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN); + AC_PINCTL_OUT_EN | + ((node->pin_caps & AC_PINCAP_HP_DRV) ? + AC_PINCTL_HP_EN : 0)); return node; } } @@ -745,18 +759,37 @@ static int check_existing_control(struct /* * build output mixer controls */ +static int create_output_mixers(struct hda_codec *codec, const char **names) +{ + struct hda_gspec *spec = codec->spec; + int i, err; + + for (i = 0; i < spec->pcm_vol_nodes; i++) { + err = create_mixer(codec, spec->pcm_vol[i].node, + spec->pcm_vol[i].index, + names[i], "Playback"); + if (err < 0) + return err; + } + return 0; +} + static int build_output_controls(struct hda_codec *codec) { struct hda_gspec *spec = codec->spec; - static const char *types[2] = { "Master", "Headphone" }; - int i, err; - - for (i = 0; i < 2 && spec->pcm_vol_node[i]; i++) { - err = create_mixer(codec, spec->pcm_vol_node[i], - spec->pcm_vol_index[i], - types[i], "Playback"); - if (err < 0) - return err; + static const char *types_speaker[] = { "Speaker", "Headphone" }; + static const char *types_line[] = { "Front", "Headphone" }; + + switch (spec->pcm_vol_nodes) { + case 1: + return create_mixer(codec, spec->pcm_vol[0].node, + spec->pcm_vol[0].index, + "Master", "Playback"); + case 2: + if (defcfg_type(spec->out_pin_node[0]) == AC_JACK_SPEAKER) + return create_output_mixers(codec, types_speaker); + else + return create_output_mixers(codec, types_line); } return 0; } ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ Alsa-user mailing list Alsa-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/alsa-user