Hi guys, Anssi, thank you very much for your work! I'll test the patch asap and I'll keep you posted.
Takashi, where can I get patched kernel sources, or on which branch do I apply the patch to?
Thanks Etienne
Le 2 sept. 2013 à 15:06, Takashi Iwai tiwai@suse.de a écrit :
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@gmail.com Reported-by: Peter Frühberger fritsch@xbmc.org Signed-off-by: Anssi Hannula anssi.hannula@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