| From 18e391862cceaf43ddb8eb5cca05e1a83abdebaa Mon Sep 17 00:00:00 2001 |
| From: Anssi Hannula <anssi.hannula@iki.fi> |
| Date: Sun, 1 Sep 2013 14:36:47 +0300 |
| Subject: ALSA: hda - hdmi: Fallback to ALSA allocation when selecting CA |
| |
| From: Anssi Hannula <anssi.hannula@iki.fi> |
| |
| commit 18e391862cceaf43ddb8eb5cca05e1a83abdebaa upstream. |
| |
| 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@gmail.com> |
| Reported-by: Peter FrΓΌhberger <fritsch@xbmc.org> |
| Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/patch_hdmi.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| --- a/sound/pci/hda/patch_hdmi.c |
| +++ b/sound/pci/hda/patch_hdmi.c |
| @@ -553,6 +553,17 @@ static int hdmi_channel_allocation(struc |
| } |
| } |
| |
| + 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); |