연결/연결 해제 시 자동으로 HDMI 사운드 출력 설정

연결/연결 해제 시 자동으로 HDMI 사운드 출력 설정

HDMI 연결 디스플레이를 사용하여 노트북(12.04 LTS 사용)에 듀얼 화면 설정이 있습니다. 모든 것이 잘 작동하지만 케이블을 연결/분리할 때마다 사운드 기본 설정으로 이동하여 사운드 출력 장치를 수동으로 변경해야 합니다.

케이블 연결/분리 시 사운드 출력 장치를 변경할 수 있는 방법이 있습니까? 디스플레이를 연결하면 사운드 출력이 HDMI로 설정되고, 연결을 끊으면 사운드가 노트북 스피커로 다시 돌아가나요?

답변1

이 질문을 우연히 발견한 사람들을 위해 - Salem의 솔루션은 13.04에서 나에게 거의 효과가 있었습니다. 결국 웹 전체에서 조각조각을 수집하게 되었고, 환경 변수 PULSE_SERVER가 없다는 점이 문제라고 생각합니다.

다음은 기본적으로 몇 가지 누락된 부분을 포함하여 Salem의 솔루션을 반복하는 전체 솔루션입니다. 또한 처음에는 Python 스크립트에서 가져오기 경로 문제가 발생할까 봐 두려웠기 때문에 (Python을 좋아함에도 불구하고) 이를 쉘 스크립트로 다시 작성했습니다.


/etc/udev/rules.d/hdmi_sound.rules(Salem의 답변과 동일) 다음 내용으로 루트로 파일을 만듭니다 .

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"

/usr/local/bin/hdmi_sound_toggle다음 내용을 사용하여 루트로 파일을 만듭니다 .

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [ $HDMI_STATUS = "connected" ]
then
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

그런 다음 다음을 사용하여 실행 가능하게 만드십시오.chmod 0755 /usr/local/bin/hdmi_sound_toggle

이 스크립트를 가능한 한 일반적으로 만들려고 노력했지만 HDMI_STATUS 파일 경로나 사용된 프로필과 같은 일부 줄을 변경해야 할 수도 있습니다. 프로필을 실행하고 보면 프로필 목록을 볼 수 있습니다 pactl list cards.

PULSE_SERVER를 설정할 때 "export" 키워드를 제거하면 스크립트가 실패했습니다. pactl이 env 변수를 찾고 있는 것 같습니다.

udev 규칙을 다시 로드하는 것을 잊지 마세요:sudo udevadm control --reload-rules

업데이트이 스크립트는 14.04에 대해 업데이트되었습니다. 그 전에는 어디에서나 USER_ID 대신 USER_NAME을 사용했습니다.

답변2

우분투 16.04 - 20.04 답변

이는 Pulse Audio 8에 버그가 발생한 Ubuntu 16.04 - 20.04에서 작동합니다. 파일을 생성하고 hotplugtv(또는 hotplug-hdmi원하는 경우) 다음 줄을 복사합니다.

#!/bin/bash

# NAME: hotplugtv
# PATH: /home/$USER/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-hotplugtv.rules 
#       and /home/$USER/bin/lock-screen-timer
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
#       so use /sys/class/dmcard* instead.
#       Dec 21, 2016 - Relocated to /home/$USER/bin for calling by lock-screen-timer
#       Aug 06, 2017 - Convert from home grown log-file to universal logger command.

if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV connected"
        /bin/sleep 2;
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV disconnected"
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi

exit 0

중요한:사용자 이름 "rick"을 사용자 이름으로 변경합니다.

udev핫 플러그 ​​이벤트 중에 이 스크립트를 호출하려면 다음을 /etc/udev/rules.d/99-hotplugtv.rules포함하는 파일을 생성하십시오.

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/rick/bin/hotplugtv"

/home/rick/bin/스크립트를 배치한 경로로 변경합니다 hotplugtv.

답변3

나는 마침내 udev. 따라서 누군가가 동일한 동작을 원하는 경우 다음 단계를 따르세요.

/etc/udev/rules.d/hdmi_sound.rules먼저 다음 내용이 포함된 파일을 만들어야 합니다 .

    SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"

이렇게 하면 HDMI 연결이 변경될 때마다 udev스크립트가 실행 됩니다. hdmi_sound_toggle해당 스크립트에는 실행 권한이 있어야 하며 내용은 다음과 같습니다.

#!/usr/bin/env python

import subprocess
from syslog import syslog

def output(cmd):
    return subprocess.check_output(cmd, shell=True)

# the following variables may need some modification.
user = "my_username"
card = "/sys/class/drm/card0"
dev_speaker = "output:analog-stereo+input:analog-stereo"
dev_hdmi = "output:hdmi-stereo+input:analog-stereo"
#

interfaces = output("ls {0}".format(card), ).split("\n")

vga = filter(lambda x: "VGA" in x, interfaces)[0]
hdmi = filter(lambda x: "HDMI" in x, interfaces)[0]

syslog("HDMI connection was changed!")

hdmi_connected = output("cat {0}/{1}/status".format(card,hdmi)).startswith("connected")
title = "HDMI was {0}".format("connected" if hdmi_connected else "disconnected")
message = "Audio output has changed to {opt}.".format(opt = "HDMI" if hdmi_connected else "built-in speakers")

cmd = "sudo -u " + user + " /usr/bin/pactl set-card-profile 0 " + (dev_hdmi if hdmi_connected else dev_speaker)

syslog("HDMI was connected." if hdmi_connected else "HDMI was disconnected.")
try:
    a = output(cmd)
    output("sudo -u {0} notify-send \"{1}\" \"{2}\"".format(user, title, message))
    syslog("Audio output changed.")
except Exception as ex:
    syslog("Error changing output device: " + str(ex))

아마도 이것은 bash에서 쉽게 만들 수 있지만 내 주요 언어는 Python이므로 그것을 사용했습니다. 알림을 제외한 모든 것이 작동합니다. 알림이 표시되지 않습니다. 왜 그런지 모르겠습니다. 혹시 고치는 방법 아시는 분 계시면 좀 알려주세요.

참고: script/udev 규칙의 이름은 변경할 수 있지만 전체 경로를 사용해야 합니다.

답변4

더 쉬운 방법이 있습니다:

여기에 설명된 대로 에서 default-sink 및 default-source를 정의합니다 /etc/pulse/default.pa.https://rastating.github.io/setting-default-audio-device-in-ubuntu-18-04/

grep default- /etc/pulse/default.pa
load-module module-default-device-restore
set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
set-default-source alsa_input.pci-0000_00_1f.3.analog-stereo

재시도하기 전에 pulseaudio를 다시 시작하는 것을 잊지 마세요:

pulseaudio -k

관련 정보