protonscr

Remote Play: 5.1 host capture uses AIFF channel map, swapping front-right and LFE

steamclosed
ValveSoftware/steam-for-linux#13610 · opened 2026-09-12 by moonwhaler · updated 2026-09-12 · 2 comments · github
Mmoonwhaler 2026-09-12 github

Related: #6150 reports the same bug (open since 2019, still active). I filed this before finding that thread, and have posted the mechanism and a verified workaround there. Happy for this to be closed as a duplicate of #6150 if maintainers prefer. See also #4502 (closed) for the same AIFF signature in 7.1.

Your system information

  • Steam client version (build number or date): 1788652215 (Arch package steam 1.0.0.87-3)
  • Distribution (e.g. Ubuntu): Arch Linux, kernel 7.2.4-arch1-2
  • Opted into Steam client beta?: No
  • Have you checked for system updates?: Yes (fully updated)
  • Steam Logs: relevant excerpts quoted below; full logs available on request
  • GPU: Nvidia RTX 4090 (AD102), driver 615.71.09

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-playback with 6 channels but no channel positions (pw-dump shows audio.channels = 6 and no audio.position key, so pactl reports aux0..aux5). It then records that sink's monitor requesting PulseAudio's default 6-channel map, which is PA_CHANNEL_MAP_AIFF (RFC3551):

PulseAudio: Recording on device steam-streaming-playback.monitor
PulseAudio: Using sample spec 's16le 6ch 48000Hz', channel map
  'front-left,front-left-of-center,front-center,front-right,front-right-of-center,rear-center'
CLIENT: Opened audio device: format=2, channels=6, frequency=48000

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:

source channel matched by label? target index AIFF name at that index
FL yes 0 front-left
FR yes 3 front-right
FC yes 2 front-center
LFE no → first free 1 front-left-of-center
RL no → next free 4 front-right-of-center
RR no → next free 5 rear-center

The client decodes the wire as standard 5.1, reading indices 1 and 3 as FR and LFE. Net effect: front-right and LFE are swapped. Measured per-channel with one distinct tone per channel:

5.1 source:                        stereo source:
  client FL   <- game FL             client FL   <- LEFT
  client FR   <- game LFE   wrong    client FR   <- silent     (front-right dead)
  client FC   <- game FC             client FC   <- silent
  client LFE  <- game FR    wrong    client LFE  <- RIGHT      (right in the sub)
  client RL   <- game RL             client RL   <- silent
  client RR   <- game RR             client RR   <- silent

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:

  • Stereo sources collapse to front-left, because only FL→0 and FR→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.
  • 5.1 sources play with front-right and LFE swapped — the right speaker emits LFE rumble, the subwoofer receives right-channel content. Reproduced with Control, where it is easy to mistake for working surround.
  • Client set to Stereo: correct, because the 2-channel AIFF map is simply FL,FR.
  • Sunshine/Moonlight streams correct 5.1 from the same host, because it creates its sink with explicit channel positions and records it with a matching map.

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 set audio.position on steam-streaming-playback at creation so the sink and the capture stream agree.

Six host-side configuration overrides were tried and do not work, including forcing audio.position on both the sink (node.rules; overridden by module-null-sink's own args) and the capture stream (stream.rules; rule applies and is visible in pw-dump, but the format negotiated from the client's libpulse channel map wins), channelmix.disable, a correctly positioned 5.1 default sink, and STEAM_RUNTIME=0. All documented with results in the Gist. A module-remap-sink workaround that cancels the permutation out does work, and is described in the Gist and in #6150.

Steps for reproducing this issue:

  1. On a Linux host, start Steam and connect from a client with audio set to 5.1.
  2. Play any application that outputs stereo — Steam Big Picture's own UI sounds are enough. Audio is audible only from the front-left speaker.
  3. Play a game with native 5.1 output. Audio is present on all speakers, but front-right and LFE are exchanged.
  4. Confirm the cause on the host during the session:
    pactl list sinks | grep -A6 steam-streaming-playback   # Channel Map: aux0..aux5
    pactl list source-outputs | grep -A6 Steam             # Channel Map: AIFF 6ch
    
  5. Setting the client to Stereo restores correct left/right, confirming the fault is specific to the 6-channel path.

The Gist contains a self-contained reproduction using only pactl/parec/paplay, with no Steam involved. Two pitfalls when reproducing: paplay without an explicit --channel-map defaults a 6-channel file to the AIFF map, which matches Steam's request and masks the bug entirely; and ffmpeg's join filter reorders channels, so verify any generated test file's channel order before trusting results.

Kkisak-valve maintainer 2026-09-12 github

Hello @moonwhaler, please do not intentionally open duplicate issue reports. Closing as a duplicate of #6150.

Mmoonwhaler 2026-09-12 github

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.