[alsa-devel] [PATCH] ALSA: hda - hdmi: Fallback to ALSA allocation when selecting CA
Takashi Iwai
tiwai at suse.de
Fri Sep 6 12:54:02 CEST 2013
At Fri, 6 Sep 2013 10:43:17 +0200,
Ashecrow wrote:
>
> 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?
The patch was already merged to Linus git tree now, so it'll be in
3.12-rc1. The commit was marked with Cc to stable, thus it'll be
picked up to stable kernels eventually later.
Takashi
>
> Thanks
> Etienne
>
> Le 2 sept. 2013 à 15:06, Takashi Iwai <tiwai at 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 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