Author: Martín el Cheikh (@melcheikh) Target Devices: Lenovo Legion Pro 7i Gen 10 (
16IAX10H, DMI Product83F5), Legion Pro 7 Gen 10 (16AFR10H).
This repository is a userspace workaround for kernels that do not yet carry the proper driver fix. It is not the recommended solution, and on a current kernel it is unnecessary.
Both problems this repository works around are fixed in the HDA driver itself.
The fix is in Linux mainline — see alc287_fixup_legion_16iax10h_aw88399() in
sound/hda/codecs/realtek/alc269.c,
landed in commit 494978ae8243
("ALSA: hda/realtek: enable AW88399 on Lenovo Legion", 2026-07-29) and reported
by the saga repository as shipping in kernel 7.3-rc1. Background:
the maintainer's explanation.
| Problem | Driver-level fix |
|---|---|
| Volume slider only attenuates the tweeters; woofers pinned at 0 dB | Pin 0x17 was routed to DAC 0x06, which has no volume controls. The driver now overrides it to DAC 0x02, giving real hardware volume over all four speakers through the standard mixer. |
| Bogus 4.0 surround profiles offered by the sound server | max_channels is capped to 2 at the driver level. |
If your kernel has those fixes, do not use this repository. Audio should work
out of the box, with no WirePlumber rules, no manual amixer calls, and no boot
parameters.
Earlier versions of this README told you to add
snd_intel_dspcfg.dsp_driver=3 to your kernel command line. That advice was
wrong and has been removed.
This hardware is legacy HDA, not SOF. Forcing SOF mode is unnecessary and can
disable the internal microphone, depending on your alsa-ucm-conf version. If
you added that parameter on the strength of an older version of this document,
remove it from /etc/default/grub, run sudo update-grub, reboot, and verify
your microphone with arecord -l.
Note that the WirePlumber rules below match SOF device names
(alsa_card.*skl_hda_dsp_generic*, alsa_output.*sofhdadsp*). They only do
anything at all while SOF is being forced — which is the configuration you
should not be in. That coupling is precisely why this approach is a dead end and
the driver fix is the right layer.
Play something with real low end, then move your desktop volume slider from 100% down to about 20% and listen.
- The bass drops along with everything else → your driver already has the fix. Stop here. Nothing in this repository applies to you.
- The bass stays at full blast while only the tweeters get quieter → you are on a driver without the fix. Move to a kernel that has it if you can; the workaround below is for when you cannot.
To see which mixer controls your card exposes (aplay -l gives you the card
number):
amixer -c <card-number> scontrolsThe Legion Pro 7i Gen 10 drives 4 speakers through two different paths:
- Tweeters — Realtek ALC3306 (ALC287) HDA codec.
- Woofers — dual Awinic AW88399 smart amplifiers on
i2c-2(addresses0x34and0x35).
Historically the session volume control bound only to the 2-channel Speaker
mixer element, so the woofers were never attenuated. This repository compensated
in userspace by handing volume control to PipeWire (api.alsa.soft-mixer) and
upmixing to 4.0.
That reasoning identified the symptom correctly but stopped one layer above the cause: the real problem was the pin-to-DAC routing described in the table above. Compensating in userspace could not fix that; it could only mask it.
git clone https://github.com/melcheikh/AudioLegion.git
cd AudioLegion
./install.shThe script detects your WirePlumber version, deploys the rules into your user
config directory, restarts the services, and pins the hardware mixer baseline.
Everything lives in $HOME/.config/wireplumber/, so it survives
alsa-ucm-conf package upgrades and needs no root.
To remove it: ./uninstall.sh.
Create ~/.config/wireplumber/main.lua.d/51-legion-upmix.lua:
alsa_monitor.rules = alsa_monitor.rules or {}
-- 1. Hand volume attenuation to PipeWire instead of the hardware mixer
table.insert(alsa_monitor.rules, {
matches = {
{ { "device.name", "matches", "alsa_card.*skl_hda_dsp_generic*" } },
},
apply_properties = {
["api.alsa.soft-mixer"] = true,
}
})
-- 2. Duplicate front stereo onto the rear woofers
table.insert(alsa_monitor.rules, {
matches = {
{ { "node.name", "matches", "alsa_output.*sofhdadsp*" } },
},
apply_properties = {
["audio.channels"] = 4,
["audio.position"] = "FL,FR,RL,RR",
["channelmix.upmix"] = true,
["channelmix.upmix-method"] = "duplicate",
["channelmix.lock-channels"] = true,
["channelmix.lfe-cutoff"] = 150,
["channelmix.fc-cutoff"] = 12000,
}
})Create ~/.config/wireplumber/wireplumber.conf.d/51-legion-upmix.conf:
monitor.alsa.rules = [
{
matches = [
{
device.name = "~alsa_card.*skl_hda_dsp_generic*"
}
]
actions = {
update-props = {
api.alsa.soft-mixer = true
}
}
},
{
matches = [
{
node.name = "~alsa_output.*sofhdadsp*"
}
]
actions = {
update-props = {
audio.channels = 4
audio.position = [ "FL", "FR", "RL", "RR" ]
channelmix.upmix = true
channelmix.upmix-method = "duplicate"
channelmix.lock-channels = true
channelmix.lfe-cutoff = 150
channelmix.fc-cutoff = 12000
}
}
}
]
systemctl --user restart pipewire pipewire-pulse wireplumberWith the soft-mixer active, the hardware controls are meant to sit at their 0 dB baseline:
amixer -c 1 sset Master 87 on
amixer -c 1 sset Speaker 87 on
amixer -c 1 sset 'Bass Speaker' onOn a driver that carries the DAC 0x02 override this step is not only
unnecessary, it throws away the hardware volume control you now have.
| Symptom | Cause | Solution |
|---|---|---|
| Audio sounds thin and metallic | Bass Speaker switch got muted |
amixer -c 1 sset 'Bass Speaker' on |
| Volume slider only changes tweeters | Rule not applied, or your card is not named sofhdadsp |
Check pw-dump for the real device name and adjust the match |
| No internal microphone | SOF forced via snd_intel_dspcfg.dsp_driver=3 |
Remove that parameter from /etc/default/grub, sudo update-grub, reboot |
- Driver patches (the real fix): nadimkobeissi/16iax10h-linux-sound-saga — track this, not this repository.
- Linux Kernel Bugzilla: Bug #218329 — "Lenovo Yoga Pro 9 14IRP8, ALC 3306: extremely low audio volume" (the shared ALC3306 thread; our notes are comments #32–#33 and are superseded by the driver fix)
- ALSA Upstream Profiles: alsa-project/alsa-ucm-conf — open PR: #838, under review against the driver's channel handling
For the full record of what was submitted upstream, what came back, and why the
Launchpad / Ubuntu SRU route did not apply, see
docs/UPSTREAM_LOG.md.
MIT — see LICENSE.