Posted 6 mins read
tl;dr: on my HP Spectre x360 13-ae0xx with Realtek ALC295, the top grille speakers are pin 0x14. enable it with hda-verb, disable hda power saving, and do not use the generic alc295-hp-x360 quirk or hdajackretask boot override on board 83B9.

I have an older HP Spectre x360 with the Bang & Olufsen speaker branding. Nice little machine, except Linux only used the bottom/front speaker pair. The top grille did nothing.

This is one of those laptop audio problems where the internet gives you a confident answer that is almost right, which is sometimes worse than no answer at all.

For my machine, the hardware looks like this:

Model:     HP Spectre x360 Convertible 13-ae0xx
Board:     83B9
Codec:     Realtek ALC295
Subsystem: 103c:83b9
Driver:    snd_hda_intel

The important bit is 103c:83b9. Do not skip that. ALC295 exists in a bunch of HP laptops, and not all of them need the same workaround.

The Symptom

Linux saw normal stereo output:

aplay -l

showed:

card 0: PCH [HDA Intel PCH], device 0: ALC295 Analog [ALC295 Analog]

PipeWire was fine. ALSA was fine. Nothing was muted. The laptop made sound, just only from the bottom/front pair.

This fix works the same whether you are running PipeWire or PulseAudio — the hda-verb commands operate below the sound server layer.

The codec dump showed the working internal speaker on pin 0x17:

Node 0x17 [Pin Complex]
  Pin Default 0x90170110: [Fixed] Speaker at Int N/A
  Pin-ctls: 0x40: OUT

The suspicious unused pin was 0x14:

Node 0x14 [Pin Complex]
  Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
  Pin-ctls: 0x00:

Before applying anything, verify your dump matches:

cat /proc/asound/card0/codec#0 | grep -A5 "Node 0x14"

If Pin Default is not 0x411111f0 or the node is missing EAPD capability, this fix may not apply to your board.

0x14 was not enabled as output, but it did have output capability and EAPD support. That turned out to matter.

Things That Did Not Work

The common advice is to add this:

echo 'options snd-hda-intel model=alc295-hp-x360' | sudo tee /etc/modprobe.d/alc295-hp-x360.conf

On this board, that was not the answer. The kernel did load the quirk:

ALC295: picked fixup alc295-hp-x360 (model specified)

but it did not expose the missing speaker pair, and it changed the audio behaviour enough that I backed it out.

Remove it if you tried it:

sudo rm /etc/modprobe.d/alc295-hp-x360.conf
sudo reboot

The other common advice is hdajackretask:

0x14 -> Internal Speaker (LFE)
0x1e -> Internal Speaker

That also did not work cleanly here. It broke the working speaker route until I removed the boot override. If you tried that and lost audio, open hdajackretask, click Remove boot override, and reboot.

Finding The Actual Top Speaker Pin

The useful test was not a permanent boot override. It was a temporary hda-verb probe.

First, I confirmed the bottom/front speakers were pin 0x17. Then I muted that pin and toggled 0x14 while playing a 5 kHz tone (good for tweeters — the top speakers roll off hard below a few kHz):

speaker-test -t sine -f 5000 -c 2

When 0x17 was muted and 0x14 was enabled, the tone came from the top grille only. Finally.

The magic pin is:

0x14

The working runtime commands are:

sudo hda-verb /dev/snd/hwC0D0 0x01 SET_GPIO_DIR 0x01
sudo hda-verb /dev/snd/hwC0D0 0x01 SET_GPIO_MASK 0x01
sudo hda-verb /dev/snd/hwC0D0 0x01 SET_GPIO_DATA 0x01

sudo hda-verb /dev/snd/hwC0D0 0x14 SET_POWER_STATE 0x00
sudo hda-verb /dev/snd/hwC0D0 0x14 SET_PIN_WIDGET_CONTROL 0x40
sudo hda-verb /dev/snd/hwC0D0 0x14 SET_EAPD_BTLENABLE 0x02
sudo hda-verb /dev/snd/hwC0D0 0x14 SET_AMP_GAIN_MUTE 0xb000

sudo hda-verb /dev/snd/hwC0D0 0x17 SET_PIN_WIDGET_CONTROL 0x40
sudo hda-verb /dev/snd/hwC0D0 0x17 SET_AMP_GAIN_MUTE 0xb000

amixer -c0 set Headphone 100% unmute

One weird detail: 0x14 is fed by the same DAC path ALSA exposes as the Headphone mixer. So yes, the Headphone mixer matters even though there are no headphones plugged in.

Make It Stick

Runtime hda-verb changes can disappear when the codec powers down. On my machine, snd_hda_intel power saving was set to 10, and 0x14 kept going back to this:

Pin-ctls: 0x00:

So the fix also disables HDA power saving:

printf '0' | sudo tee /sys/module/snd_hda_intel/parameters/power_save

Here is the script I use:

#!/usr/bin/env bash
set -euo pipefail

dev=/dev/snd/hwC0D0

if [[ ! -e "$dev" ]]; then
  echo "Missing $dev" >&2
  exit 1
fi

if [[ ${EUID:-$(id -u)} -ne 0 ]]; then
  exec sudo "$0" "$@"
fi

if [[ -w /sys/module/snd_hda_intel/parameters/power_save ]]; then
  printf '0' > /sys/module/snd_hda_intel/parameters/power_save
fi

verb() {
  hda-verb "$dev" "$@" >/dev/null 2>&1
}

verb 0x01 SET_GPIO_DIR 0x01
verb 0x01 SET_GPIO_MASK 0x01
verb 0x01 SET_GPIO_DATA 0x01

verb 0x14 SET_POWER_STATE 0x00
verb 0x14 SET_PIN_WIDGET_CONTROL 0x40
verb 0x14 SET_EAPD_BTLENABLE 0x02
verb 0x14 SET_AMP_GAIN_MUTE 0xb000

verb 0x17 SET_PIN_WIDGET_CONTROL 0x40
verb 0x17 SET_AMP_GAIN_MUTE 0xb000

amixer -c0 set Master unmute >/dev/null
amixer -c0 set Speaker unmute >/dev/null
amixer -c0 set Headphone 100% unmute >/dev/null

echo "Enabled ALC295 top speaker pin 0x14."

Install it:

sudo install -m 755 alc295-enable-top-speakers.sh /usr/local/sbin/alc295-enable-top-speakers.sh

And this is the systemd unit:

[Unit]
Description=Enable HP Spectre x360 ALC295 top speakers
After=systemd-modules-load.service sound.target alsa-restore.service
ConditionPathExists=/dev/snd/hwC0D0

[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep 3
ExecStart=/usr/local/sbin/alc295-enable-top-speakers.sh

[Install]
WantedBy=multi-user.target

Install and enable it:

sudo install -m 644 alc295-enable-top-speakers.service /etc/systemd/system/alc295-enable-top-speakers.service
sudo systemctl daemon-reload
sudo systemctl enable --now alc295-enable-top-speakers.service

systemctl status should show it as inactive (dead) after it runs. That is normal for a oneshot service. The useful part is status=0/SUCCESS.

Check It

After the service runs:

cat /sys/module/snd_hda_intel/parameters/power_save
grep -A12 'Node 0x14' /proc/asound/card0/codec#0

You want:

0
Pin-ctls: 0x40: OUT

For a quick physical test:

speaker-test -D default -c 2 -t sine -f 5000 -l 1

Cover the bottom speakers with your hand and put your ear near the top grille. The top speakers are quieter; they are not going to match the bottom pair. But they should be alive.

Rollback

If anything gets weird:

sudo systemctl disable --now alc295-enable-top-speakers.service
sudo rm /etc/systemd/system/alc295-enable-top-speakers.service
sudo rm /usr/local/sbin/alc295-enable-top-speakers.sh
sudo systemctl daemon-reload
sudo reboot

Also make sure these are gone if you tried earlier experiments:

sudo rm -f /etc/modprobe.d/alc295-hp-x360.conf

and remove any hdajackretask boot override from the GUI.

Final Notes

This is not a universal ALC295 fix. It is what worked on my HP Spectre x360 13-ae0xx with board 83B9 and subsystem 103c:83b9.

The short version: the bottom speakers are 0x17, the top grille is 0x14, and HDA power saving needs to stay off or the codec forgets the 0x14 setup.

Annoying? Yes. But at least now the B&O sticker is a little less decorative.