[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