나는 Huawei Matebook 14s 노트북을 구입하고 여기에 Ubuntu 22.04를 설치했습니다. 이 노트북에는 두 쌍의 스피커가 있습니다. 문제는 시스템이 첫 번째를 스피커로 정의하고 두 번째를 헤드폰으로 정의한다는 것입니다. 그들이 함께 일하게 하려면 어떻게 해야 합니까? Intel 사운드 카드와 같은 추가 드라이버나 이와 유사한 것을 설치해야 할 수도 있습니다.
PulseAudio를 다시 시작해 보았지만 도움이 되지 않았습니다.
답변1
비슷한 문제가 발생하여 찾은 정보를 바탕으로 이를 해결하기 위한 데몬을 작성했습니다. 내 GitHub 저장소에서 얻을 수 있습니다.https://github.com/Smoren/huawei-ubuntu-sound-fix.
질문
Linux 배포용 사운드 카드 드라이버에는 헤드폰 및 스피커 채널이 혼합되어 있습니다.
헤드폰이 연결되면 시스템은 사운드가 스피커에서 출력되어야 한다고 생각합니다. 헤드폰이 꺼지면 시스템은 헤드폰을 통해 사운드 출력을 시도합니다.
문제 세부정보(발견됨여기)
내 관점에서 볼 때 흥미로운 위젯은 다음과 같기 때문에 이상한 하드웨어 디자인이 있는 것 같습니다.
- 0x01 - 오디오 기능 그룹
- 0x10 - 헤드폰 DAC(실제로 두 장치가 모두 여기에 연결되어 있음)
- 0x11 - 스피커 DAC
- 0x16 - 헤드폰 잭
- 0x17 - 내장 스피커
그리고:
- 위젯 0x16 및 0x17은 서로 다른 DAC 0x10 및 0x11에 연결되어야 하지만 내부 스피커 0x17은 연결 선택 명령을 무시하고 헤드폰 잭 0x16의 값을 사용합니다.
- 헤드폰 잭 0x16은 이상한 것에 의해 제어되므로 오디오 그룹 0x01의 GPIO 명령을 사용하여 활성화해야 합니다.
- 내부 스피커 0x17은 헤드폰 잭 0x16에 연결되므로 EAPD/BTL 활성화 명령을 사용하여 명시적으로 비활성화해야 합니다.
해결책
헤드폰 연결/분리를 모니터링하고 사운드 카드 장치에 액세스하여 재생을 올바른 위치로 전환하는 데몬이 구현되었습니다.
Huawei-사운드 카드-headphones-monitor.sh
#!/bin/bash
# ensures script can run only once at a time
pidof -o %PPID -x $0 >/dev/null && echo "Script $0 already running" && exit 1
function move_output() {
hda-verb /dev/snd/hwC0D0 0x16 0x701 "$@" > /dev/null 2> /dev/null
}
function move_output_to_speaker() {
move_output 0x0001
}
function move_output_to_headphones() {
move_output 0x0000
}
function switch_to_speaker() {
move_output_to_speaker
# enable speaker
hda-verb /dev/snd/hwC0D0 0x17 0x70C 0x0002 > /dev/null 2> /dev/null
# disable headphones
hda-verb /dev/snd/hwC0D0 0x1 0x715 0x2 > /dev/null 2> /dev/null
}
function switch_to_headphones() {
move_output_to_headphones
# disable speaker
hda-verb /dev/snd/hwC0D0 0x17 0x70C 0x0000 > /dev/null 2> /dev/null
# pin output mode
hda-verb /dev/snd/hwC0D0 0x1 0x717 0x2 > /dev/null 2> /dev/null
# pin enable
hda-verb /dev/snd/hwC0D0 0x1 0x716 0x2 > /dev/null 2> /dev/null
# clear pin value
hda-verb /dev/snd/hwC0D0 0x1 0x715 0x0 > /dev/null 2> /dev/null
# sets amixer sink port to headphones instead of the speaker
pacmd set-sink-port alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink "[Out] Headphones"
}
function get_sound_card_index() {
card_index=$(cat /proc/asound/cards | grep sof-hda-dsp | head -n1 | grep -Eo "^\s*[0-9]+")
# remove leading white spaces
card_index="${card_index#"${card_index%%[![:space:]]*}"}"
echo $card_index
}
sleep 2 # allows audio system to initialise first
card_index=$(get_sound_card_index)
if [ $card_index == "" ]; then
echo "sof-dha-dsp card is not found in /proc/asound/cards"
return 1
fi
old_status=0
while true; do
# if headphone jack isn't plugged:
if amixer "-c${card_index}" get Headphone | grep -q "off"; then
status=1
move_output_to_speaker
# if headphone jack is plugged:
else
status=2
move_output_to_headphones
fi
if [ ${status} -ne ${old_status} ]; then
case "${status}" in
1)
message="Headphones disconnected"
switch_to_speaker
;;
2)
message="Headphones connected"
switch_to_headphones
;;
esac
echo "${message}"
old_status=$status
fi
sleep .3
done
Huawei-사운드 카드-헤드폰-monitor.service
[Unit]
Description=Huawei soundcard headphones monitor
[Service]
ExecStart=/usr/local/bin/huawei-soundcard-headphones-monitor.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target