[alsa-devel] [PATCH v3] stop setup_dig_out_stream() causing clicks
Takashi Iwai
tiwai at suse.de
Sun Nov 4 09:17:53 CET 2012
At Sat, 3 Nov 2012 17:00:06 +0000,
Laurence Darby wrote:
>
> Starting audio or seeking in various music players causes
> setup_dig_out_stream() to be called, which resets the SPDIF stream,
> which caused one DAC (but not another) to make a clicking noise every
> time.
>
> This patch ensures the reset only happens when it needs to, which is
> when the format changes, and makes the code a little more readable.
>
> Signed-off-by: Laurence Darby <ldarby at tuffmail.com>
> ---
>
> Takashi Iwai wrote:
>
> > > + reset = codec->spdif_status_reset &&
> > > + spdif->ctls & AC_DIG1_ENABLE &&
> > > + curr_fmt != format;
> >
> > Better to put parentheses around the bit operations when combined with
> > logical operations. gcc would suggest it, too, I thought.
> >
>
> gcc doesn't warn about it, but it does on code like this:
>
> reset = codec->spdif_status_reset &&
> spdif->ctls & AC_DIG1_ENABLE + 0 &&
> curr_fmt != format;
>
> which suggests putting them around the +. But since you spotted it, I've put them back in.
Thanks, applied now.
Takashi
>
> Regards,
> Laurence
>
>
> sound/pci/hda/hda_codec.c | 20 +++++++++++++++-----
> 1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> index 38fdefc..2b21906 100644
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -4718,10 +4718,20 @@ EXPORT_SYMBOL_HDA(snd_hda_input_mux_put);
> static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
> unsigned int stream_tag, unsigned int format)
> {
> - struct hda_spdif_out *spdif = snd_hda_spdif_out_of_nid(codec, nid);
> -
> - /* turn off SPDIF once; otherwise the IEC958 bits won't be updated */
> - if (codec->spdif_status_reset && (spdif->ctls & AC_DIG1_ENABLE))
> + struct hda_spdif_out *spdif;
> + unsigned int curr_fmt;
> + bool reset;
> +
> + spdif = snd_hda_spdif_out_of_nid(codec, nid);
> + curr_fmt = snd_hda_codec_read(codec, nid, 0,
> + AC_VERB_GET_STREAM_FORMAT, 0);
> + reset = codec->spdif_status_reset &&
> + (spdif->ctls & AC_DIG1_ENABLE) &&
> + curr_fmt != format;
> +
> + /* turn off SPDIF if needed; otherwise the IEC958 bits won't be
> + updated */
> + if (reset)
> set_dig_out_convert(codec, nid,
> spdif->ctls & ~AC_DIG1_ENABLE & 0xff,
> -1);
> @@ -4733,7 +4743,7 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
> format);
> }
> /* turn on again (if needed) */
> - if (codec->spdif_status_reset && (spdif->ctls & AC_DIG1_ENABLE))
> + if (reset)
> set_dig_out_convert(codec, nid,
> spdif->ctls & 0xff, -1);
> }
> --
> 1.7.12.1
>
More information about the Alsa-devel
mailing list