1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-20 14:56:55 +00:00
mpv/audio
wm4 4e358a9636 af_lavrresample: don't drop sl/sr channels for 7.1 on ALSA
ao_alsa: attempt to fix 7.1 over HDMI

The last 2 channels of 7.1 (RLC/RRC in ALSA) were exported as sdl/sdr
instead of sl/sr (I don't even know why I chose sdl/sdr, but SL/SR
and RLC/RRC are different in the ALSA API). libsw/avresample do not
move the sl/sr channels to sdl/sdr when rematrixing, so silence was
sent for 2 channels. If my selection of sdl/sdr is essentially API
abuse, there's no reason why they should do this differently.

The mess here is really that ALSa doesn't map the HDMI layouts cleanly.
Most ALSA drivers export 7.1 in a way compatible to our expectations,
but Intel HDA/HDMI does not:

mpv/ffmpeg:   fl-fr-fc-lfe-bl-br-sl-sr
ALSA/generic: FL FR FC LFE RL RR SL  SR  [1]
ALSA/HDMI:    FL FR LFE FC RL RR RLC RRC [2]

The HDMI layout is layout 0x13 (going by CEA-861-B). The comment in
the kernel code has to be correct too. The early standard defines only
1 other layout, which replaces RLC/RRC with FRC/FLC - this probably
corresponds to what we call "7.1(wide)".

So it appears when ALSA requests RLC/RRC, we should feed it sl/sr.

To make it more complicated, Kodi/xbmc apparently also have to deal with
ALSA being special, but instead of sending sl/sr to RLC/RRC, they swap
the last two pairs of the layout, and send sl/sr to RL/RR and bl/br to
RLC/RRC. Or I might have misunderstood their code. I don't have a
7.1-capable A/V receiver, so I can't test this.

For now, go with the simpler solution, and wait until someone tests it.
If the speakers end up swapped, a completely different solution will be
needed.

[1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/sound/core/pcm_lib.c?id=refs/tags/v4.3#n2434
[2] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/sound/pci/hda/patch_hdmi.c?id=refs/tags/v4.3#n307
2015-11-03 00:28:00 +01:00
..
decode audio: make spdif re-probe from normal decoding work 2015-10-06 20:21:29 +02:00
filter af_lavrresample: don't drop sl/sr channels for 7.1 on ALSA 2015-11-03 00:28:00 +01:00
out ao_alsa: minor cleanups 2015-11-03 00:23:28 +01:00
audio_buffer.c player: add audio drop/duplicate mode 2015-10-27 20:56:46 +01:00
audio_buffer.h player: add audio drop/duplicate mode 2015-10-27 20:56:46 +01:00
audio.c audio: use AVFrames with more than 8 channels correctly 2015-10-26 15:54:00 +01:00
audio.h audio/filter: remove some useless filters 2015-09-03 23:55:36 +02:00
chmap_sel.c audio: always log channel maps before determining final map 2015-10-26 15:52:08 +01:00
chmap_sel.h audio: always log channel maps before determining final map 2015-10-26 15:52:08 +01:00
chmap.c af_lavrresample: don't drop sl/sr channels for 7.1 on ALSA 2015-11-03 00:28:00 +01:00
chmap.h audio: bump maximum number of channels to 16 2015-10-26 15:54:19 +01:00
fmt-conversion.c Update license headers 2015-04-13 12:10:01 +02:00
fmt-conversion.h Update license headers 2015-04-13 12:10:01 +02:00
format.c audio/format: revise af_format_conversion_score 2015-09-10 23:58:09 -07:00
format.h ao_lavc: use new sample format determination code 2015-09-10 23:38:42 +02:00
mixer.c audio: fix restoring volume 2015-07-27 15:07:51 +02:00
mixer.h audio: change range of volume option/property 2015-05-22 18:35:03 +02:00