[alsa-devel] [PATCH] ALSA: hda: Disable 4/6 channels on some NVIDIA GPUs.

Anssi Hannula anssi.hannula at iki.fi
Tue Jan 11 18:11:53 CET 2011


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?

(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


More information about the Alsa-devel mailing list