All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.