Any comments on this patch? It really is needed because some BIOS's only define speaker-out's in the HDA codec default pin configs, and no line-outs. So speaker-out's must be sequenced just as is being done for line-out's, otherwise the surround pin assignments will be wrong. Steve Steve Longerbeam wrote: > > ------------------------------------------------------------------------ > > changeset: 5028:01537f056c79 > tag: tip > user: stevel@xxxxxxxxxxxxxxxxx > date: Thu May 03 10:30:04 2007 -0700 > summary: Add speaker pin sequencing to hda_codec.c:snd_hda_parse_pin_def_config(). > > Some verb tables (such as an Asus VT sent by IDT) contain only speaker > outs in the default pin configs, and no line-outs. In such a case the > speaker sequence numbers have to be used to order the speaker out > pins, just as is being done for line-out pins. Then, when speaker-outs > are copied to line-outs, the line-outs will be ordered properly. > > Signed-off-by: Steve Longerbeam <stevel@xxxxxxxxxxxxxxxxx> > > diff -r c7366efee611 -r 01537f056c79 pci/hda/hda_codec.c > --- a/pci/hda/hda_codec.c Thu May 03 10:24:35 2007 -0700 > +++ b/pci/hda/hda_codec.c Thu May 03 10:30:04 2007 -0700 > @@ -2112,6 +2112,32 @@ static int __devinit is_in_nid_list(hda_ > return 0; > } > > + > +/* > + * Sort an associated group of pins according to their sequence numbers. > + */ > +static void sort_pins_by_sequence(hda_nid_t * pins, short * sequences, > + int num_pins) > +{ > + int i, j; > + short seq; > + hda_nid_t nid; > + > + for (i = 0; i < num_pins; i++) { > + for (j = i + 1; j < num_pins; j++) { > + if (sequences[i] > sequences[j]) { > + seq = sequences[i]; > + sequences[i] = sequences[j]; > + sequences[j] = seq; > + nid = pins[i]; > + pins[i] = pins[j]; > + pins[j] = nid; > + } > + } > + } > +} > + > + > /* > * Parse all pin widgets and store the useful pin nids to cfg > * > @@ -2134,13 +2160,16 @@ int __devinit snd_hda_parse_pin_def_conf > hda_nid_t *ignore_nids) > { > hda_nid_t nid, nid_start; > - int i, j, nodes; > - short seq, assoc_line_out, sequences[ARRAY_SIZE(cfg->line_out_pins)]; > + int nodes; > + short seq, assoc_line_out, assoc_speaker; > + short sequences_line_out[ARRAY_SIZE(cfg->line_out_pins)]; > + short sequences_speaker[ARRAY_SIZE(cfg->speaker_pins)]; > > memset(cfg, 0, sizeof(*cfg)); > > - memset(sequences, 0, sizeof(sequences)); > - assoc_line_out = 0; > + memset(sequences_line_out, 0, sizeof(sequences_line_out)); > + memset(sequences_speaker, 0, sizeof(sequences_speaker)); > + assoc_line_out = assoc_speaker = 0; > > nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid_start); > for (nid = nid_start; nid < nodes + nid_start; nid++) { > @@ -2175,13 +2204,22 @@ int __devinit snd_hda_parse_pin_def_conf > if (cfg->line_outs >= ARRAY_SIZE(cfg->line_out_pins)) > continue; > cfg->line_out_pins[cfg->line_outs] = nid; > - sequences[cfg->line_outs] = seq; > + sequences_line_out[cfg->line_outs] = seq; > cfg->line_outs++; > break; > case AC_JACK_SPEAKER: > + seq = get_defcfg_sequence(def_conf); > + assoc = get_defcfg_association(def_conf); > + if (! assoc) > + continue; > + if (! assoc_speaker) > + assoc_speaker = assoc; > + else if (assoc_speaker != assoc) > + continue; > if (cfg->speaker_outs >= ARRAY_SIZE(cfg->speaker_pins)) > continue; > cfg->speaker_pins[cfg->speaker_outs] = nid; > + sequences_speaker[cfg->speaker_outs] = seq; > cfg->speaker_outs++; > break; > case AC_JACK_HP_OUT: > @@ -2227,16 +2265,32 @@ int __devinit snd_hda_parse_pin_def_conf > } > > /* sort by sequence */ > - for (i = 0; i < cfg->line_outs; i++) > - for (j = i + 1; j < cfg->line_outs; j++) > - if (sequences[i] > sequences[j]) { > - seq = sequences[i]; > - sequences[i] = sequences[j]; > - sequences[j] = seq; > - nid = cfg->line_out_pins[i]; > - cfg->line_out_pins[i] = cfg->line_out_pins[j]; > - cfg->line_out_pins[j] = nid; > - } > + sort_pins_by_sequence(cfg->line_out_pins, sequences_line_out, > + cfg->line_outs); > + sort_pins_by_sequence(cfg->speaker_pins, sequences_speaker, > + cfg->speaker_outs); > + > + /* > + * FIX-UP: if no line-outs are detected, try to use speaker or HP pin > + * as a primary output > + */ > + if (!cfg->line_outs) { > + if (cfg->speaker_outs) { > + cfg->line_outs = cfg->speaker_outs; > + memcpy(cfg->line_out_pins, cfg->speaker_pins, > + sizeof(cfg->speaker_pins)); > + cfg->speaker_outs = 0; > + memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); > + cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; > + } else if (cfg->hp_outs) { > + cfg->line_outs = cfg->hp_outs; > + memcpy(cfg->line_out_pins, cfg->hp_pins, > + sizeof(cfg->hp_pins)); > + cfg->hp_outs = 0; > + memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins)); > + cfg->line_out_type = AUTO_PIN_HP_OUT; > + } > + } > > /* Reorder the surround channels > * ALSA sequence is front/surr/clfe/side > @@ -2278,28 +2332,6 @@ int __devinit snd_hda_parse_pin_def_conf > cfg->input_pins[AUTO_PIN_CD], > cfg->input_pins[AUTO_PIN_AUX]); > > - /* > - * FIX-UP: if no line-outs are detected, try to use speaker or HP pin > - * as a primary output > - */ > - if (!cfg->line_outs) { > - if (cfg->speaker_outs) { > - cfg->line_outs = cfg->speaker_outs; > - memcpy(cfg->line_out_pins, cfg->speaker_pins, > - sizeof(cfg->speaker_pins)); > - cfg->speaker_outs = 0; > - memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); > - cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; > - } else if (cfg->hp_outs) { > - cfg->line_outs = cfg->hp_outs; > - memcpy(cfg->line_out_pins, cfg->hp_pins, > - sizeof(cfg->hp_pins)); > - cfg->hp_outs = 0; > - memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins)); > - cfg->line_out_type = AUTO_PIN_HP_OUT; > - } > - } > - > return 0; > } > > > > ------------------------------------------------------------------------ > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@xxxxxxxxxxxxxxxx > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel