At Tue, 6 Oct 2009 13:10:54 +0800, Li Bo wrote: > > On Mon, Oct 5, 2009 at 11:08 PM, Takashi Iwai <tiwai@xxxxxxx> wrote: > > At Mon, 5 Oct 2009 22:27:16 +0800, > > Li Bo wrote: > >> > >> [ALSA] HDA VIA: Refresh front playback mute if hp plug-in mutes speaker. > >> > >> Signed-off-by: Lydia Wang <lydiawang@xxxxxxxxxxxxxx> > >> > >> Index: sound-2.6/sound/pci/hda/patch_via.c > >> =================================================================== > >> --- sound-2.6.orig/sound/pci/hda/patch_via.c 2009-10-05 15:10:13.000000000 +0800 > >> +++ sound-2.6/sound/pci/hda/patch_via.c 2009-10-05 15:10:22.000000000 +0800 > >> @@ -1346,14 +1346,26 @@ > >> /* mute internal speaker if HP is plugged */ > >> static void via_hp_automute(struct hda_codec *codec) > >> { > >> - unsigned int present; > >> + unsigned int present = 0; > >> struct via_spec *spec = codec->spec; > >> + char name[32] = "Front Playback Switch"; > > > > Use a constant string, at least a form like: const char *name = "..."; > > But... > OK > > > > > >> > >> present = snd_hda_codec_read(codec, spec->autocfg.hp_pins[0], 0, > >> AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; > >> - snd_hda_codec_amp_stereo(codec, spec->autocfg.line_out_pins[0], > >> - HDA_OUTPUT, 0, HDA_AMP_MUTE, > >> - present ? HDA_AMP_MUTE : 0); > >> + > >> + if (!spec->hp_independent_mode) { > >> + struct snd_card *card = codec->bus->card; > >> + struct snd_kcontrol *kctl; > >> + /* auto mute */ > >> + snd_hda_codec_amp_stereo( > >> + codec, spec->autocfg.line_out_pins[0], HDA_OUTPUT, 0, > >> + HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); > >> + /* notify change */ > >> + list_for_each_entry(kctl, &card->controls, list) > >> + if (strcmp(kctl->id.name, name) == 0) > >> + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, > >> + &kctl->id); > > > > Don't search for a kctl here. > > Just set up kctl->id, and let snd_ctl_notify() to search for the > > element. > I tried to setup kctl->id, but found that to setup it properly, we > also need search. > Maybe we have to search here? No, you just need to set up a control id struct, and call with it. Something like below: struct snd_ctl_elem_id id; memset(&id, 0, sizeof(id)); id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; strcpy(id.name, "Front Playback Switch"); snd_ctl_notify(card, SNDRV_CTL_ELEM_MASK_VALUE, &id); Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel