[alsa-devel] [PATCH] hda: SPDIF stream muting support
Takashi Iwai
tiwai at suse.de
Mon Sep 29 12:33:43 CEST 2008
At Sat, 27 Sep 2008 18:13:47 -0400,
Matthew Ranostay wrote:
>
> Added support for muting S/DPIF outs using the 'Digital Playback Source' muxs on
> supporting codecs.
>
> Signed-off-by: Matthew Ranostay <mranostay at embeddedalley.com>
Applied now. Thanks.
Takashi
> ---
>
> diff --git a/pci/hda/patch_sigmatel.c b/pci/hda/patch_sigmatel.c
> index b5c1449..cb419a0 100644
> --- a/pci/hda/patch_sigmatel.c
> +++ b/pci/hda/patch_sigmatel.c
> @@ -138,6 +138,7 @@ struct sigmatel_spec {
> unsigned int mic_switch: 1;
> unsigned int alt_switch: 1;
> unsigned int hp_detect: 1;
> + unsigned int spdif_mute: 1;
>
> /* gpio lines */
> unsigned int eapd_mask;
> @@ -547,10 +548,32 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
> {
> struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
> struct sigmatel_spec *spec = codec->spec;
> + struct hda_input_mux *smux = &spec->private_smux;
> unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
> + int err, val;
> + hda_nid_t nid;
>
> - return snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
> + err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
> spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
> + if (err < 0)
> + return err;
> +
> + if (spec->spdif_mute) {
> + if (smux_idx == 0)
> + nid = spec->multiout.dig_out_nid;
> + else
> + nid = codec->slave_dig_outs[smux_idx - 1];
> + if (spec->cur_smux[smux_idx] == smux->num_items - 1)
> + val = AMP_OUT_MUTE;
> + if (smux_idx == 0)
> + nid = spec->multiout.dig_out_nid;
> + else
> + nid = codec->slave_dig_outs[smux_idx - 1];
> + /* un/mute SPDIF out */
> + snd_hda_codec_write_cache(codec, nid, 0,
> + AC_VERB_SET_AMP_GAIN_MUTE, val);
> + }
> + return 0;
> }
>
> static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
> @@ -1228,6 +1251,15 @@ static int stac92xx_build_controls(struct hda_codec *codec)
> return err;
> }
> if (spec->num_smuxes > 0) {
> + int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
> + struct hda_input_mux *smux = &spec->private_smux;
> + /* check for mute support on SPDIF out */
> + if (wcaps & AC_WCAP_OUT_AMP) {
> + smux->items[smux->num_items].label = "Off";
> + smux->items[smux->num_items].index = 0;
> + smux->num_items++;
> + spec->spdif_mute = 1;
> + }
> stac_smux_mixer.count = spec->num_smuxes;
> err = snd_ctl_add(codec->bus->card,
> snd_ctl_new1(&stac_smux_mixer, codec));
> @@ -4370,7 +4402,6 @@ again:
>
> spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
> spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
> - spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
>
> switch (spec->board_config) {
> case STAC_HP_M4:
>
More information about the Alsa-devel
mailing list