Hello @moonwhaler, please do not intentionally open duplicate issue reports. Closing as a duplicate of #6150.
Thank you. My report goes a bit deeper into the issue with more testing/workarounds etc. I have linked this issue in the other one, to keep these findings available.
Nothing extracted yet.
Your system information
1788652215(Arch packagesteam 1.0.0.87-3)Audio stack: PipeWire 1.6.8 / pipewire-pulse 1.6.8 / WirePlumber 0.5.17, libpulse 17.0+r98.
Client: Steam Link 1.3.32.315 on NVIDIA Shield TV (2015), Android 11, audio set to 5.1.
Please describe your issue in as much detail as possible:
Full analysis, measurements, reproduction and workaround: https://gist.github.com/moonwhaler/5e3b1b6d8378243771a3223182229959
The Remote Play host creates its capture sink
steam-streaming-playbackwith 6 channels but no channel positions (pw-dumpshowsaudio.channels = 6and noaudio.positionkey, sopactlreportsaux0..aux5). It then records that sink's monitor requesting PulseAudio's default 6-channel map, which isPA_CHANNEL_MAP_AIFF(RFC3551):That map has no LFE and no discrete rear-left/rear-right. Applications declare
surround-51(FL, FR, FC, LFE, RL, RR), so PipeWire matches what it can by label and fills the remaining target slots in order:The client decodes the wire as standard 5.1, reading indices 1 and 3 as
FRandLFE. Net effect: front-right and LFE are swapped. Measured per-channel with one distinct tone per channel:What I expected: the host requests a channel map matching what the client decodes, so 5.1 channel order is preserved.
What happened: it requests the AIFF map, which cannot represent 5.1 at all.
Scope:
FL→0 andFR→3 match: the right channel is routed to the non-directional, low-passed subwoofer. Reproduced with Steam Big Picture's own UI sounds and with Everspace 2.FL,FR.Suggested fix: pass an explicit
channel_map(e.g.surround-51) when creating the record stream instead of relying on PulseAudio's default, and/or setaudio.positiononsteam-streaming-playbackat creation so the sink and the capture stream agree.Six host-side configuration overrides were tried and do not work, including forcing
audio.positionon both the sink (node.rules; overridden bymodule-null-sink's own args) and the capture stream (stream.rules; rule applies and is visible inpw-dump, but the format negotiated from the client's libpulse channel map wins),channelmix.disable, a correctly positioned 5.1 default sink, andSTEAM_RUNTIME=0. All documented with results in the Gist. Amodule-remap-sinkworkaround that cancels the permutation out does work, and is described in the Gist and in #6150.Steps for reproducing this issue:
The Gist contains a self-contained reproduction using only
pactl/parec/paplay, with no Steam involved. Two pitfalls when reproducing:paplaywithout an explicit--channel-mapdefaults a 6-channel file to the AIFF map, which matches Steam's request and masks the bug entirely; andffmpeg'sjoinfilter reorders channels, so verify any generated test file's channel order before trusting results.