[alsa-devel] [PATCH] ALSA: hda - hdmi: Fallback to ALSA allocation when selecting CA
Takashi Iwai
tiwai at suse.de
Mon Sep 2 16:23:14 CEST 2013
At Mon, 02 Sep 2013 17:14:02 +0300,
Anssi Hannula wrote:
>
> 02.09.2013 16:06, Takashi Iwai kirjoitti:
> > At Sun, 1 Sep 2013 14:36:47 +0300,
> > Anssi Hannula wrote:
> >> 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.
>
> I was talking about the "non-chmap" case.
>
> Example:
>
> Sink has FL + FR + FC + LFE.
>
> Application plays 4 channel audio via ALSA, i.e. FL + FR + RL + RR as
> per ALSA API channel allocation.
>
> Instead of sending CA for FL + FR + RL + RR (0x06) which is what the
> audio really is, hdmi_channel_allocation() selects CA for FL + FR + FC
> + LFE (0x03), since that is what the sink reported as present. As a
> result rear channels are mapped to FC and LFE.
>
>
> Of course this is rather unusual case (in terms of sink speaker mask),
> and it may be argued that the user actually _wanted_ to output the
> second pair of channels to FC+LFE despite them normally being RL+RR in ALSA.
Yeah, of course, it's just a best effort and the channel map is
incomplete and might mismatch unless you explicitly set the channel
map. This was the very reason we introduced this new API...
Takashi
>
>
>
> > 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
> >>
>
>
> --
> Anssi Hannula
>
More information about the Alsa-devel
mailing list