[alsa-devel] [PATCH] ALSA: hda - hdmi: Fallback to ALSA allocation when selecting CA

Takashi Iwai tiwai at suse.de
Mon Sep 2 15:06:36 CEST 2013


At Sun,  1 Sep 2013 14:36:47 +0300,
Anssi Hannula wrote:
> 
> hdmi_channel_allocation() tries to find a HDMI channel allocation that
> matches the number channels in the playback stream and contains only
> speakers that the HDMI sink has reported as available via EDID. If no
> such allocation is found, 0 (stereo audio) is used.
> 
> Using CA 0 causes the audio causes the sink to discard everything except
> the first two channels (front left and front right).
> 
> However, the sink may be capable of receiving more channels than it has
> speakers (and then perform downmix or discard the extra channels), in
> which case it is preferable to use a CA that contains extra channels
> than to use CA 0 which discards all the non-stereo channels.
> 
> Additionally, it seems that HBR (HD) passthrough output does not work on
> Intel HDMI codecs when CA is set to 0 (possibly the codec zeroes
> channels not present in CA). This happens with all receivers that report
> a 5.1 speaker mask since a HBR stream is carried on 8 channels to the
> codec.
> 
> Add a fallback in the CA selection so that the CA channel count at least
> matches the stream channel count, even if the stream contains channels
> not present in the sink speaker descriptor.
> 
> Thanks to GrimGriefer at OpenELEC forums for discovering that changing
> the sink speaker mask allowed HBR output.
> 
> Reported-by: GrimGriefer
> Reported-by: Ashecrow
> Reported-by: Frank Zafka <kafkaesque1978 at gmail.com>
> Reported-by: Peter Frühberger <fritsch at xbmc.org>
> Signed-off-by: Anssi Hannula <anssi.hannula at iki.fi>
> Cc: <stable at vger.kernel.org>
> ---
> 
> Hopefully this fixes HBR (HD passthrough) for the remaining Intel users
> who were still experiencing problems.

Thanks, I applied the patch now.


> BTW, the hdmi_channel_allocation() logic seems also otherwise somewhat
> suspect to me. Shouldn't we always select an allocation matching ALSA
> channel mapping, instead of re-assigning channels received from
> userspace "randomly" to sink speakers (in case of unusual sink speaker
> mask)?

If per_pin->chmap_set is set beforehand,
hdmi_manual_channel_allocation() is called instead.  So it should be
fine.


Takashi

> Anyway, I let it be for now at least.
> 
> 
>  sound/pci/hda/patch_hdmi.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 030ca86..354fc55 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -551,6 +551,17 @@ static int hdmi_channel_allocation(struct hdmi_eld *eld, int channels)
>  		}
>  	}
>  
> +	if (!ca) {
> +		/* if there was no match, select the regular ALSA channel
> +		 * allocation with the matching number of channels */
> +		for (i = 0; i < ARRAY_SIZE(channel_allocations); i++) {
> +			if (channels == channel_allocations[i].channels) {
> +				ca = channel_allocations[i].ca_index;
> +				break;
> +			}
> +		}
> +	}
> +
>  	snd_print_channel_allocation(eld->info.spk_alloc, buf, sizeof(buf));
>  	snd_printdd("HDMI: select CA 0x%x for %d-channel allocation: %s\n",
>  		    ca, channels, buf);
> -- 
> 1.8.1.5
> 


More information about the Alsa-devel mailing list