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

           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.