Watch
1
0
Fork
You've already forked SouveraineOS
0

task-39: the in-call speaker button routes to a headset, and why

gnome-calls asks org.mobian_project.CallAudio, which callaudiod owns, and
callaudiod switches a sink port - which cannot work when ACP splits earpiece and
speaker across two profiles. The working toggle is the hook's speaker on|off and
nothing in the UI calls it. Fix is a shim that claims the name; it needs a real
call to test before enabling.
This commit is contained in:
Fimeg 2026-08-02 08:23:19 -04:00
commit 9c2558863f

View file

@ -172,3 +172,42 @@ which gives a flat noise floor at rms ~14000 with no speech variation at all;
84 drops it to ~6200. A runtime `amixer cset` does **not** persist — activating
the profile reapplies the UCM value, verified. Whatever gain STT wants has to
land in `souveraine-ucm-blueline`.
## The in-call speaker button routes to a headset (root cause, 2026-08-02)
Casey, observed: an inbound call **defaulted to speakerphone**, and tapping the
speaker button (to *turn on* speakerphone) **switched to headset mode**.
Not mysterious once the ownership is traced:
- `gnome-calls` is the dialer, and its speaker button calls the D-Bus name
`org.mobian_project.CallAudio`.
- That name is owned by upstream **`callaudiod`**
(`/usr/share/dbus-1/services/org.mobian_project.CallAudio.service`,
`Exec=/usr/bin/callaudiod`), which is D-Bus activated on demand.
- **callaudiod cannot route this card.** It switches a sink *port* and needs a
speaker port and an earpiece port on one sink; ACP models UCM devices as one
profile per combination — `Voice Call (Earpiece, Mic)` and
`Voice Call (Mic, Speaker)` — so no sink carries both. `blueline-callaudio-hook`
already says this in a comment; the consequence was never written down.
- So the button asks for a port that does not exist and lands on a headset
route. **The working toggle already exists and nothing in the UI calls it:**
`blueline-callaudio-hook speaker on|off` does direct mixer writes and is
verified working (`speaker: on` / `speaker: off (earpiece)`).
`souveraine-callaudio` ships only the hook — it does **not** contest the D-Bus
name, so callaudiod always wins.
**The fix is a shim that claims `org.mobian_project.CallAudio`** and translates
`EnableSpeaker`/`SelectMode` into the hook's `speaker on|off`. It must be tested
against a real inbound call before it is enabled: this path is phone calls, and
a broken shim loses them entirely.
Until then the manual escape is `sudo blueline-callaudio-hook speaker on`.
Note the default-to-speakerphone half is a *separate* symptom: `apply()` forces
Earpiece deliberately ("enabling Speaker here is what made every call come out
of the loudspeaker with no way back"), and the hook is enabled, active and
unshadowed (`FragmentPath=/usr/lib/systemd/system/...`). So something else put
the card in a speaker profile before or during that call — unreproduced, and it
needs a call to chase.