HDMI 연결 디스플레이를 사용하는 랩탑 (12.04 LTS 사용)에 듀얼 스크린 설정이 있습니다. 모든 것이 잘 작동하지만 케이블을 연결 / 분리 할 때마다 사운드 환경 설정으로 이동하여 사운드 출력 장치를 수동으로 변경해야합니다.
케이블 연결 / 연결 해제시 사운드 출력 장치를 변경할 수있는 방법이 있습니까? 따라서 디스플레이를 연결하면 사운드 출력이 HDMI로 설정되고 연결을 끊으면 사운드가 랩탑 스피커로 되돌아갑니다.
HDMI 연결 디스플레이를 사용하는 랩탑 (12.04 LTS 사용)에 듀얼 스크린 설정이 있습니다. 모든 것이 잘 작동하지만 케이블을 연결 / 분리 할 때마다 사운드 환경 설정으로 이동하여 사운드 출력 장치를 수동으로 변경해야합니다.
케이블 연결 / 연결 해제시 사운드 출력 장치를 변경할 수있는 방법이 있습니까? 따라서 디스플레이를 연결하면 사운드 출력이 HDMI로 설정되고 연결을 끊으면 사운드가 랩탑 스피커로 되돌아갑니다.
답변:
이 질문을 우연히 본 사람들의 이익을 위해-Salem의 솔루션은 13.04 년에 거의 나를 위해 일했습니다. 웹에서 모든 부분에서 비트와 조각을 모으는 것이 끝났습니다. 저는 거래 변수가 환경 변수 PULSE_SERVER의 부족이라고 생각했습니다.
여기 내 전체 솔루션이 있습니다.이 솔루션은 기본적으로 누락 된 부분이 거의없는 Salem의 솔루션을 반복합니다. 또한 파이썬 스크립트가 가져 오기 경로 문제로 실행되는 것을 두려워했기 때문에 쉘 스크립트 (파이썬에 대한 사랑에도 불구하고)로 다시 작성했습니다.
(Salesm의 답변과 동일) /etc/udev/rules.d/hdmi_sound.rules
내용이 포함 된 파일 을 루트로 만듭니다 .
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을 사용했습니다.
| uniq
USER_NAME 명령 을 추가 해야합니다. 또한 우분투의 소리 설정이 속일 수 있습니다. 사운드 설정 패널에서 변경 사항을 보지 못했지만 일단 무언가를 재생하면 오디오가 원활하게 전환되고 몇 번 HDMI를 연결하거나 분리 한 후 스크립트 실행이 중지되었음을 알았습니다. udev의 버그).
| sort -u
추가 옵션 elemer elemer --- 내 사용자 이름을 말했기 때문에 사용자 이름을 추가 했습니다. 하루가 끝난 후 FuegoFro의 솔루션과 동일합니다.
| grep -v pts
루트 터미널이 열려있는 kate를 통해 스크립트를 편집하고 있다는 사실 때문에 실제로 "root"사용자를 가지고있었습니다.
나는 마침내이 작업을 사용하여 관리했습니다 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에서 쉽게 만들 수 있지만 내 주요 언어는 파이썬이므로 사용했습니다. 알림을 제외한 모든 것이 작동합니다. 표시되지 않습니다. 이유를 모르겠습니다. 누군가 고치는 방법을 알고 있다면 무언가를 말하십시오.
참고 : script / udev 규칙의 이름은 변경할 수 있지만 전체 경로를 사용해야합니다.
나는 Salem 의 대답과 Daniel 의 대답을 취하고 필요한 부분을 변경했지만 솔루션이 즉시 작동하지 않았습니다.
(세일럼의 답변과 유사).
/etc/udev/rules.d/hdmi_sound.rules
컨텐츠가 있는 파일 을 루트로 작성하십시오 .
SUBSYSTEM=="drm", RUN+="/usr/local/bin/hdmi_sound_toggle"
참고 ACTION=="change",
가 없습니다!
/usr/local/bin/hdmi_sound_toggle
컨텐츠가 있는 파일 을 루트로 작성하십시오 .
#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '| sort -u`
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
참고 USER_NAME =그렇지 않으면--my username으로 3 번돌아 왔기 때문에who | grep "(:0)" | cut -f 1 -d ' '| sort -u
추가| sort -u
했습니다elemer elemer elemer
.
그런 다음 실행 파일로 만드십시오. chmod 0755 /usr/local/bin/hdmi_sound_toggle
udev 규칙을 다시로드하는 것을 잊지 마십시오 : sudo udevadm control --reload-rules
중요이 스크립트는 14.04로 업데이트되었습니다. 그 전에는 어디에서나 USER_ID 대신 USER_NAME을 사용했습니다.
이것은 Pulse Audio 8에 버그가 발생한 Ubuntu 16.04-17.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
.