우분투 사운드 문제

우분투 사운드 문제

나는 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

おすすめ記事