[alsa-devel] [PATCH] ALSA: hda - hdmi: Fallback to ALSA allocation when selecting CA

Ashecrow ashecrow42 at free.fr
Fri Sep 6 10:43:17 CEST 2013


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 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