[alsa-devel] [PATCH] ALSA: hda - Fix default multichannel HDMI mapping regression

Takashi Iwai tiwai at suse.de
Mon Feb 4 10:31:29 CET 2013


At Sun,  3 Feb 2013 17:55:45 +0200,
Anssi Hannula wrote:
> 
> Commit d45e6889ee69456a4d5b1bbb32252f460cd48fa9 ("ALSA: hda - Provide
> the proper channel mapping for generic HDMI driver") added support for
> custom channel maps in the HDA HDMI driver. Due to a mistake in an
> 'if' condition the custom map is always used even when no such map has
> been set. This causes incorrect channel mapping for multichannel audio
> by default.
> 
> Pass per_pin->chmap_set to hdmi_setup_channel_mapping() as a parameter
> so that it can use it for detecting if a custom map has been set instead
> of checking if map is NULL (which is never the case).
> 
> Reported-by: Staffan Lindberg <pike at xbmc.org>
> Signed-off-by: Anssi Hannula <anssi.hannula at iki.fi>
> Cc: stable at vger.kernel.org

Thanks, applied.


Takashi


> ---
> 
> This also affects stable 3.7, but not earlier versions.
> 
>  sound/pci/hda/patch_hdmi.c |   11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 807a2aa..e85959f 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -714,9 +714,10 @@ static void hdmi_setup_fake_chmap(unsigned char *map, int ca)
>  
>  static void hdmi_setup_channel_mapping(struct hda_codec *codec,
>  				       hda_nid_t pin_nid, bool non_pcm, int ca,
> -				       int channels, unsigned char *map)
> +				       int channels, unsigned char *map,
> +				       bool chmap_set)
>  {
> -	if (!non_pcm && map) {
> +	if (!non_pcm && chmap_set) {
>  		hdmi_manual_setup_channel_mapping(codec, pin_nid,
>  						  channels, map);
>  	} else {
> @@ -905,7 +906,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx,
>  			    pin_nid,
>  			    channels);
>  		hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
> -					   channels, per_pin->chmap);
> +					   channels, per_pin->chmap,
> +					   per_pin->chmap_set);
>  		hdmi_stop_infoframe_trans(codec, pin_nid);
>  		hdmi_fill_audio_infoframe(codec, pin_nid,
>  					    ai.bytes, sizeof(ai));
> @@ -915,7 +917,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx,
>  		 * accordingly */
>  		if (per_pin->non_pcm != non_pcm)
>  			hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca,
> -						   channels, per_pin->chmap);
> +						   channels, per_pin->chmap,
> +						   per_pin->chmap_set);
>  	}
>  
>  	per_pin->non_pcm = non_pcm;
> -- 
> 1.7.10
> 


More information about the Alsa-devel mailing list