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@xxxxxxxxx> > Reported-by: Peter Frühberger <fritsch@xxxxxxxx> > Signed-off-by: Anssi Hannula <anssi.hannula@xxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> > --- > > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html