[alsa-devel] [PATCH] ALSA: hda: Disable 4/6 channels on some NVIDIA GPUs.
Takashi Iwai
tiwai at suse.de
Tue Jan 11 20:06:10 CET 2011
At Tue, 11 Jan 2011 19:11:53 +0200,
Anssi Hannula wrote:
>
> On 10.01.2011 18:19, Nitin Daga wrote:
> > Added hardware constraint in patch_hdmi.c to disable
> > channels 4/6 which are not supported by some older
> > NVIDIA GPUs.
>
> And 3/5/7, which do not seem to work either with my 0x0007.
>
> However, 3/5/7 do not work with my 0x000b system either, is this a hw
> limitation as well (that should be added to the driver) or is there a
> bug in the HDA driver for uneven channel counts?
In theory yes, but I don't know any really working codecs. It seems
that codecs (or controllers?) are designed to take always
stereo-pairs.
Maybe we can put a hw_constraint in hda_intel.c.
thanks,
Takashi
> (I looked at the HDA specification and it does seem to allow
> odd-numbered channel counts)
>
> Strangely, on both of my systems speaker-test -c5 fails with an error:
>
> $ speaker-test -Dhdmi -c5
>
> speaker-test 1.0.23
>
> Playback device is hdmi
> Stream parameters are 48000Hz, S16_LE, 5 channels
> Using 16 octaves of pink noise
> Rate set to 48000Hz (requested 48000Hz)
> Buffer size range from 128 to 419392
> Period size range from 64 to 209664
> Using max buffer size 419392
> Periods = 4
> Unable to set nperiods 4 for playback: No such file or directory
> Setting of hwparams failed: No such file or directory
>
> While -c3 and -c7 run fine but no sound is received.
>
>
> > Signed-off-by: Nitin Daga <ndaga at nvidia.com>
> > Acked-By: Stephen Warren <swarren at nvidia.com>
> > ---
> > pci/hda/patch_hdmi.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 42 insertions(+), 0 deletions(-)
> >
> > diff --git a/pci/hda/patch_hdmi.c b/pci/hda/patch_hdmi.c
> > index d3e49aa..ddde59b 100644
> > --- a/pci/hda/patch_hdmi.c
> > +++ b/pci/hda/patch_hdmi.c
> > @@ -1166,11 +1166,53 @@ static int nvhdmi_7x_init(struct hda_codec *codec)
> > return 0;
> > }
> >
> > +static unsigned int channels_2_6_8[] = {
> > + 2, 6, 8
> > +};
> > +
> > +static unsigned int channels_2_8[] = {
> > + 2, 8
> > +};
> > +
> > +static struct snd_pcm_hw_constraint_list hw_constraints_2_6_8_channels = {
> > + .count = ARRAY_SIZE(channels_2_6_8),
> > + .list = channels_2_6_8,
> > + .mask = 0,
> > +};
> > +
> > +static struct snd_pcm_hw_constraint_list hw_constraints_2_8_channels = {
> > + .count = ARRAY_SIZE(channels_2_8),
> > + .list = channels_2_8,
> > + .mask = 0,
> > +};
> > +
> > static int simple_playback_pcm_open(struct hda_pcm_stream *hinfo,
> > struct hda_codec *codec,
> > struct snd_pcm_substream *substream)
> > {
> > struct hdmi_spec *spec = codec->spec;
> > + struct snd_pcm_hw_constraint_list *hw_constraints_channels = NULL;
> > +
> > + switch (codec->preset->id) {
> > + case 0x10de0002:
> > + case 0x10de0003:
> > + case 0x10de0005:
> > + case 0x10de0006:
> > + hw_constraints_channels = &hw_constraints_2_8_channels;
> > + break;
> > + case 0x10de0007:
> > + hw_constraints_channels = &hw_constraints_2_6_8_channels;
> > + break;
> > + default:
> > + break;
> > + }
> > +
> > + if (hw_constraints_channels != NULL) {
> > + snd_pcm_hw_constraint_list(substream->runtime, 0,
> > + SNDRV_PCM_HW_PARAM_CHANNELS,
> > + hw_constraints_channels);
> > + }
> > +
> > return snd_hda_multi_out_dig_open(codec, &spec->multiout);
> > }
> >
>
>
> --
> Anssi Hannula
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
More information about the Alsa-devel
mailing list