From: GitHub issues - opened <github@alsa-project.org>
To: alsa-devel@alsa-project.org
Subject: sof-hda-dsp: Huawei MACHD-WXX9 CX11880 exposes internal woofers as Headphone
Date: Mon, 7 Sep 2026 22:40:40 +0200 (CEST) [thread overview]
Message-ID: <18d32486be8b0100-webhooks-bot@alsa-project.org> (raw)
In-Reply-To: <18d32486be57d100-webhooks-bot@alsa-project.org>
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
parent reply other threads:[~2026-09-07 20:41 UTC|newest]
Thread overview: expand[flat|nested] mbox.gz Atom feed
[parent not found: <18d32486be57d100-webhooks-bot@alsa-project.org>]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18d32486be8b0100-webhooks-bot@alsa-project.org \
--to=github@alsa-project.org \
--cc=alsa-devel@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.