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 <kafkaesque1...@gmail.com>
> Reported-by: Peter Frühberger <frit...@xbmc.org>
> Signed-off-by: Anssi Hannula <anssi.hann...@iki.fi>
> Cc: <stable@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
> 
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to