[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