After replacing Windows 11 with Ubuntu on my ASUS ZenBook Pro Duo, the built-in speakers stayed silent. Headphones worked and the volume controls looked normal, but unplugging the headphones left me with no sound. I spent a long time searching for an answer, and the advice I could find did not explain this exact hardware combination.
This is the fix I confirmed on my own UX582HS. Closely named ASUS models can use different audio hardware, so check the model and codec IDs before trying the workaround.
- Check the exact hardware
- Restore ALSA profiles
- Apply the ALC294 setting
- Make it persistent
The laptop and software I used
ASUSTeK ZenBook Pro Duo UX582HS, DMI product name ZenBook Pro Duo UX582HS_UX582HS, BIOS UX582HS.303, Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic. Audio: Realtek ALC294, vendor 0x10ec0294, subsystem 0x10431b42, driver sof-audio-pci-intel-tgl. I installed alsa-ucm-conf 1.2.15.3-1ubuntu1.7 and alsa-tools 1.2.15-1. The problem had also existed before my Ubuntu upgrade.
What fixed it
Installing the missing ALSA profiles restored the proper speaker profile, but that alone did not make the speakers audible. On this laptop, codec coefficient 0x0f read 0x7778. Writing 0x7774 restored sound. Spotify then played through the speakers. That points to a codec routing or initialisation issue; it does not prove the complete underlying driver fault.
1. Check the hardware
Run these commands and make sure the model and codec IDs match before continuing:
cat /sys/class/dmi/id/sys_vendor
cat /sys/class/dmi/id/product_name
cat /sys/class/dmi/id/bios_version
cat /etc/os-release
uname -r
grep -H -E '^(Codec|Vendor Id|Subsystem Id):' /proc/asound/card*/codec#*
2. Restore the speaker profile
Install the ALSA packages, restart WirePlumber from your normal desktop login, then select the built-in Speakers output in Settings → Sound. Unmute it, unplug headphones and use a moderate volume. Restart playback if needed. On my laptop this restored the profile, but the next adjustment was still needed.
sudo apt update
sudo apt install alsa-ucm-conf alsa-tools
systemctl --user restart wireplumber
3. Try the adjustment temporarily
My codec appeared at /dev/snd/hwC1D0. Card numbers can differ, so confirm the path on your own system. Read and record the current value first:
sudo hda-verb /dev/snd/hwC1D0 0x20 SET_COEF_INDEX 0x0f
sudo hda-verb /dev/snd/hwC1D0 0x20 GET_PROC_COEF 0
My original value was 0x7778. This was the adjustment that brought sound back. A register readback alone is not proof; actual playback confirmed the fix on my laptop:
sudo hda-verb /dev/snd/hwC1D0 0x20 SET_COEF_INDEX 0x0f
sudo hda-verb /dev/snd/hwC1D0 0x20 SET_PROC_COEF 0x7774
4. Apply it at startup and after resume
If the temporary change restores sound, this guarded script applies it only when both the exact laptop model and codec IDs match. It discovers the ALSA card instead of assuming it is always card 1.
sudo tee /usr/local/sbin/asus-speaker-routing >/dev/null <<'EOF'
#!/bin/sh
# ASUS UX582HS / ALC294 speaker routing; verified on this laptop.
set -eu
[ "$(cat /sys/class/dmi/id/product_name)" = 'ZenBook Pro Duo UX582HS_UX582HS' ] || exit 0
exec 9>/run/lock/asus-speaker-routing.lock
flock -x 9
attempt=0
while [ "$attempt" -lt 15 ]; do
for codec in /proc/asound/card*/codec#*; do
[ -f "$codec" ] || continue
grep -q '^Vendor Id: 0x10ec0294$' "$codec" || continue
grep -q '^Subsystem Id: 0x10431b42$' "$codec" || continue
card=${codec#/proc/asound/card}; card=${card%%/*}
device=${codec##*codec#}
hw=/dev/snd/hwC${card}D${device}
[ -c "$hw" ] || continue
/usr/bin/hda-verb "$hw" 0x20 SET_COEF_INDEX 0x0f
/usr/bin/hda-verb "$hw" 0x20 SET_PROC_COEF 0x7774
echo "Applied ASUS UX582HS speaker routing to $hw"
exit 0
done
attempt=$((attempt + 1))
sleep 1
done
echo 'Expected ASUS Realtek codec unavailable' >&2
exit 1
EOF
sudo chmod 0755 /usr/local/sbin/asus-speaker-routing
Create the systemd service and resume hook
sudo tee /etc/systemd/system/asus-speaker-routing.service >/dev/null <<'EOF'
[Unit]
Description=ASUS UX582HS internal speaker routing fix
After=sound.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/asus-speaker-routing
RemainAfterExit=yes
TimeoutStartSec=25
[Install]
WantedBy=multi-user.target
EOF
sudo install -d /usr/lib/systemd/system-sleep
sudo tee /usr/lib/systemd/system-sleep/asus-speaker-routing-resume >/dev/null <<'EOF'
#!/bin/sh
case "$1" in
post) /usr/bin/systemctl --no-block restart asus-speaker-routing.service ;;
esac
EOF
sudo chmod 0755 /usr/lib/systemd/system-sleep/asus-speaker-routing-resume
Validate and enable the service
The service is a one-shot adjustment, so active (exited) is expected. Check its startup log with:
sudo sh -n /usr/local/sbin/asus-speaker-routing
sudo sh -n /usr/lib/systemd/system-sleep/asus-speaker-routing-resume
sudo systemctl daemon-reload
sudo systemd-analyze verify /etc/systemd/system/asus-speaker-routing.service
sudo systemctl enable --now asus-speaker-routing.service
sudo systemctl status asus-speaker-routing.service --no-pager
sudo journalctl -u asus-speaker-routing.service -b --no-pager
What I confirmed, and what remains to check
I confirmed speaker playback by listening to Spotify after the codec change. I enabled the startup service and it ran successfully; the shell scripts and systemd unit passed their checks. I have not yet confirmed a real reboot, suspend/resume cycle or headphone plug/unplug behaviour after installing the hooks. Please check those on your machine before relying on them.
Undo the workaround
Disable the service and remove the three files created for it:
sudo systemctl disable --now asus-speaker-routing.service
sudo rm -- /usr/local/sbin/asus-speaker-routing
sudo rm -- /etc/systemd/system/asus-speaker-routing.service
sudo rm -- /usr/lib/systemd/system-sleep/asus-speaker-routing-resume
sudo systemctl daemon-reload
Stopping the service does not restore the codec value already written. On my laptop I can temporarily restore the recorded original value like this. Use your own recorded value and verified codec path if they differ. Leave the standard Ubuntu ALSA packages installed.
sudo hda-verb /dev/snd/hwC1D0 0x20 SET_COEF_INDEX 0x0f
sudo hda-verb /dev/snd/hwC1D0 0x20 SET_PROC_COEF 0x7778
This finally brought back the speakers that had been silent throughout my Ubuntu installation. If you have the same UX582HS hardware and symptom, checking the profiles and output selection first, then testing this targeted codec change, gave me a clear route to a working result.
