Watch
1
0
Fork
You've already forked souveraine
0
souveraine/.handoff-from-phone/pixel3-speaker-routing/README.md
Fimeg 19fe6b1d0e shell: dock reorder, fullscreen detection fix, idle-power, sessiond, misc shell work
- Dock drag-to-reorder for pinned apps (insertion gap, quick-slide vs dwell)
- Fullscreen detection: scan all windows via HyprlandData.windowList
- IdleCoordinator, GlobalStates, Session.qml updates
- Deploy script, qmldir, settings, wallpaper, visualizer fixes
- sessiond server, memory module updates

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-22 22:18:20 -04:00

4.8 KiB

Pixel 3 (blueline) — loudspeaker routing fix

Status: SOLVED 2026-07-12 — pmOS routing applied; fix lives in Pixel3Arch rootfs-overlay UCM (commit 2f39c06) + alsactl store. Both speakers verified by ear. Goal: Make the loud bottom speaker work. Right now sound only comes from the top earpiece; the loud bottom-firing speaker never fires. Casey reports postmarketOS had audio working but with the channels "reversed".

Device / stack

  • Google Pixel 3 (blueline), sdm845, mainline kernel 7.1.1-sdm845 (built 2026-07-11)
  • Souveraine OS (Arch Linux ARM), Hyprland/Wayland
  • ALSA card 0 = "Google Pixel 3" (G3)
  • Audio: PipeWire 1.6.7 (PulseAudio shim)
  • Speakers: dual Cirrus CS35L36 amps ("Left"/"Right") on QUAT_TDM_RX_0 (MultiMedia1)
  • Earpiece amp: WCD9340 EAR PA (separate codec)

Key config files

  • Active UCM (system): /usr/share/alsa/ucm2/Google/blueline/HiFi.conf
    • referenced by /usr/share/alsa/ucm2/conf.d/sdm845/Google-Pixel-3.conf
    • Only defines a "Speaker" device. No earpiece device. Never sets Channel Mux.
  • Intended fix location: user override under ~/.config/alsa/ucm2/... (Casey chose user-override so pacman updates to alsa-ucm-conf don't clobber it.)
  • Baseline ALSA state snapshot saved to scratchpad as asound-current.state (scratchpad is ephemeral — re-capture with alsactl -f <file> store 0 if needed).

What we PROVED (via live tone tests)

  1. Both CS35L36 amps are healthy; both transducers (earpiece + loud speaker) can physically produce sound.
  2. The 30% volume / SUSPENDED sink was a huge red herring — many "silent" test results were just low volume. ALWAYS test at pactl set-sink-volume @DEFAULT_SINK@ 100% and un-suspend the sink first.
  3. Default state: both amps have Channel Mux = RX1 (numid 121 Left, 112 Right). => both amps pull the same slot => only earpiece is audible.
  4. EAR PA Volume=0 did NOT silence the earpiece output => the sound you hear from the "earpiece" is being driven by a CS35L36 amp, not the WCD EAR PA.
  5. At 100% vol, an L-only vs R-only test: one channel DID come out the loud bottom speaker. So the loudspeaker amp works — it just needs the right channel/slot routed to it. (Casey couldn't reliably tell L vs R by ear.)
  6. BUT: simply splitting Left Channel Mux=RX1 / Right Channel Mux=RX2 and playing duplicated-mono did NOT wake the loudspeaker in a later test. => The channel→amp mapping is UPSTREAM of Channel Mux, on the QUAT_TDM_RX_0 TDM bus. Channel Mux alone is not the whole story.

Relevant mixer controls (card 0, by numid)

  • 121 Left Channel Mux (enum: 0=RX1, 1=RX2) — default 0
  • 112 Right Channel Mux (enum: 0=RX1, 1=RX2) — default 0
  • 122 Left AMP Enable Switch / 113 Right AMP Enable Switch (default on)
  • 123 Left BOOST Enable Switch / 114 Right BOOST Enable Switch(default on)
  • 18 EAR PA Volume (WCD earpiece amp; default 4)
  • CS35L36 input source slots: Left/Right ASPTX1..6SRC (both amps identical: 1SRC=2, 2SRC=3, 3SRC=5, 4SRC=6, 5SRC=4, 6SRC=0)
  • UCM SectionVerb enables: QUAT_TDM_RX_0 Audio Mixer MultiMedia1 = 1

NEXT STEP (where we stopped)

Get postmarketOS's authoritative blueline mixer mapping — pmOS works, so its UCM / mixer_paths is the source of truth. The most relevant is the pmaports 7.1rc1 kernel MR (!8446) because that matches this exact kernel (7.1.x):

Find in pmOS's config: which TDM slot / channel each CS35L36 amp is fed, and whether it sets Channel Mux + the TDM RX slot routing so earpiece(top) and loudspeaker(bottom) each get a distinct channel. Then encode that as a user UCM override in ~/.config/alsa/ucm2/ (copy blueline HiFi.conf there, add the Channel Mux / slot csets to the Speaker device's EnableSequence).

HOW TO TEST (repeatable)

pactl set-sink-volume @DEFAULT_SINK@ 100%   # ALWAYS — 30% masks everything
pactl set-sink-mute   @DEFAULT_SINK@ 0
# distinct L/R tones already generated in scratchpad: left.wav right.wav stereo.wav
paplay left.wav ; paplay right.wav
# read/toggle mux:
amixer -c 0 cget numid=121   # Left Channel Mux
amixer -c 0 cset numid=112 1 # Right -> RX2

Restore baseline: both muxes -> 0, EAR PA -> 4, volume -> 30%.

CAUTION

  • Don't trust "silent" results unless volume is 100% and sink un-suspended.
  • Reverse-engineering the TDM routing blind was NOT converging. Read the pmOS config first, then change mixers — don't guess.