* sof-hda-dsp: Huawei MACHD-WXX9 CX11880 exposes internal woofers as Headphone
[not found] <18d32486be57d100-webhooks-bot@alsa-project.org>
@ 2026-09-07 20:40 ` GitHub issues - opened
0 siblings, 0 replies; only message in thread
From: GitHub issues - opened @ 2026-09-07 20:40 UTC (permalink / raw)
To: alsa-devel
alsa-project/alsa-ucm-conf issue #853 was opened from DickHorner:
## Summary
On a Huawei MateBook X Pro 2021 (`MACHD-WXX9`) using `sof-hda-dsp` with a Conexant CX11880 codec, the internal four-speaker setup is exposed incorrectly to userspace.
The internal speaker system consists of two independently controlled pairs:
- `Speaker Playback *` controls the internal tweeter pair
- `Headphone Playback *` controls the internal woofer pair
There is no `Bass Speaker` control.
The generic HDA UCM configuration assumes that `Headphone` refers only to the external headphone jack. As a result, when headphones are unplugged, UCM disables `Headphone Playback Switch`, which also disables the internal woofer pair.
There is a second related problem: the regular `Speaker` / `Master` volume controls only affect the tweeters, while the woofer level remains fixed. This causes the speaker balance to change with system volume.
I have reproduced both issues consistently and have working local workarounds for both.
## Hardware
- Laptop: Huawei MateBook X Pro 2021
- System vendor: `HUAWEI`
- Product name: `MACHD-WXX9`
- Product version: `M1010`
- Board vendor: `HUAWEI`
- Board name: `MACHD-WXX9-PCB-B1`
- ALSA card: `sof-hda-dsp`
- Card long name: `HUAWEI-MACHD_WXX9-M1010-MACHD_WXX9_PCB_B1`
- UCM master file: `sof-hda-dsp.conf`
- Codec: Conexant CX11880
- Codec vendor ID: `0x14f11f86`
- Codec subsystem ID: `0x1e83323f`
- Codec revision ID: `0x100100`
- SOF topology: `sof-hda-generic-2ch.tplg`
- alsa-lib: `1.2.16.1`
- Kernel tested: `7.2.0`
- Distribution: CachyOS / Arch Linux
- Audio server: PipeWire / WirePlumber
## Mixer layout
The relevant mixer controls are:
```text
Master Playback Volume/Switch
Speaker Playback Volume/Switch
Headphone Playback Volume/Switch
```
There is no:
```text
Bass Speaker Playback Volume
Bass Speaker Playback Switch
```
Testing the controls independently while playing audio through the internal speakers gives an unambiguous mapping:
```text
Speaker Playback Switch -> internal tweeters
Headphone Playback Switch -> internal woofers
```
## Problem 1: unplugging headphones disables the internal woofers
The default UCM transition behaves as follows.
With headphones plugged in:
```text
Headphone Playback Switch = on
Speaker Playback Switch = off
```
With headphones unplugged:
```text
Headphone Playback Switch = off
Speaker Playback Switch = on
```
The second state is wrong for this machine because `Headphone Playback Switch` also controls the internal woofer pair.
Therefore, after unplugging headphones, the laptop speakers continue playing but lose their entire low-frequency branch.
This initially sounds like poor speaker quality rather than a completely broken output, which makes the problem rather difficult to identify.
## Working UCM workaround
The generic speaker configuration currently enables only the regular speaker control in the non-`Bass Speaker` branch.
On this machine, adding `Headphone Playback Switch` to the Speaker `EnableSequence` fixes the internal speaker routing:
```text
EnableSequence [
cset "name='Speaker Playback Switch' on"
cset "name='Headphone Playback Switch' on"
]
DisableSequence [
cset "name='Speaker Playback Switch' off"
]
```
With this change:
- both tweeters and woofers are active on the internal Speaker output
- headphone plug/unplug switching still works
- unplugging headphones no longer kills the woofer pair
- the fix survives repeated physical jack cycles
This has been tested on the actual hardware.
## Problem 2: hardware volume changes only the tweeters
There is an additional volume-control problem.
`Master` and the normal system Speaker volume affect the tweeter branch, but the woofer branch remains at a fixed level.
For example:
```text
Master 100% -> tweeters and woofers have the expected balance
Master reduced -> tweeters get quieter
woofers remain at the same hardware level
```
Thus the tonal balance changes substantially when lowering the system volume.
Using `Master` as a common hardware volume does not solve the problem.
## Working volume workaround
Enabling PipeWire's software mixer for this ALSA card fixes the volume behavior:
```ini
monitor.alsa.rules = [
{
matches = [
{
device.name = "alsa_card.pci-0000_00_1f.3-platform-skl_hda_dsp_generic"
}
]
actions = {
update-props = {
api.alsa.soft-mixer = true
}
}
}
]
```
With the hardware speaker gains left at their working levels, the software volume is then applied before both physical branches.
Result:
```text
system volume down -> tweeters and woofers get quieter together
system volume up -> tweeters and woofers get louder together
speaker balance -> remains constant
```
This has also been verified on the actual hardware.
## Expected behavior
For this machine, the internal Speaker output should:
1. enable both the `Speaker` and internal woofer paths
2. keep normal headphone jack switching functional
3. provide one system volume control that changes the complete internal speaker system without changing the tweeter/woofer balance
Users should not need to manually manipulate ALSA mixer controls or install local WirePlumber/UCM overrides.
## Diagnostic data
Full `alsa-info.sh --no-upload` output:
[alsa-info-matebook-x-pro-2021.txt](https://github.com/user-attachments/files/31352502/alsa-info-matebook-x-pro-2021.txt)
## Related work
This was originally reported in the discussion of:
- #533
However, #533 handles the more conventional case where the second speaker pair is exposed as:
```text
Bass Speaker
```
This Huawei differs because its internal woofer pair is exposed through:
```text
Headphone
```
There is also a recent device-specific CX11880 UCM precedent:
- #808 — Lenovo ThinkPad E16 Gen 1
That PR layers a machine-specific `sof-hda-dsp` configuration on top of the generic configuration and only overrides the parts required for that board.
## Question for maintainers
What is the preferred layer for fixing this hardware?
Would a machine-specific `sof-hda-dsp` UCM configuration, similar in structure to #808, be appropriate for `HUAWEI-MACHD_WXX9-M1010-MACHD_WXX9_PCB_B1`?
Or does the fact that an internal woofer path is exposed as `Headphone` indicate that the Conexant CX11880 HDA codec driver should instead provide a machine-specific quirk and expose this path as a separate / `Bass Speaker` control?
I am happy to test patches on the hardware and can provide additional codec verbs, UCM dumps, mixer state comparisons, or jack-cycle tests if useful.
Issue URL : https://github.com/alsa-project/alsa-ucm-conf/issues/853
Repository URL: https://github.com/alsa-project/alsa-ucm-conf
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-07 20:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <18d32486be57d100-webhooks-bot@alsa-project.org>
2026-09-07 20:40 ` sof-hda-dsp: Huawei MACHD-WXX9 CX11880 exposes internal woofers as Headphone GitHub issues - opened
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.