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


20

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

케이블 연결 / 연결 해제시 사운드 출력 장치를 변경할 수있는 방법이 있습니까? 따라서 디스플레이를 연결하면 사운드 출력이 HDMI로 설정되고 연결을 끊으면 사운드가 랩탑 스피커로 되돌아갑니다.


여기에도 같은 문제가 있습니다.
ThiagoPonte

내가 이것에 대한 도움을 위해 여기에 온 것은 이번이 처음입니다 ... 12.10에 같은 보트에 있습니다. 성가시다. 내 경험상 10.10 이후로 이런 식으로되었습니다. 이를 처리 할 수있는 구성이 있어야합니다. 편집 : voices.canonical.com/david.henningsson/2012/04/14/… 의도적으로 설정되었습니다. 그건 정말 나쁘다.
user138216

내 대답이 당신과 함께 작동하는지 확인하십시오.
Salem

답변:


11

이 질문을 우연히 본 사람들의 이익을 위해-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을 사용했습니다.


1
| uniqUSER_NAME 명령 을 추가 해야합니다. 또한 우분투의 소리 설정이 속일 수 있습니다. 사운드 설정 패널에서 변경 사항을 보지 못했지만 일단 무언가를 재생하면 오디오가 원활하게 전환되고 몇 번 HDMI를 연결하거나 분리 한 후 스크립트 실행이 중지되었음을 알았습니다. udev의 버그).
FuegoFro

1
| sort -u추가 옵션 elemer elemer --- 내 사용자 이름을 말했기 때문에 사용자 이름을 추가 했습니다. 하루가 끝난 후 FuegoFro의 솔루션과 동일합니다.
elemer82

나는 | grep -v pts루트 터미널이 열려있는 kate를 통해 스크립트를 편집하고 있다는 사실 때문에 실제로 "root"사용자를 가지고있었습니다.
Auspex

pactl을 실행할 때 "연결 실패 : 연결이 거부되었습니다. pa_context_connect () 실패 : 연결이 거부되었습니다"라는 메시지가 계속 표시됩니다. : \
Tomislav Nakic-Alfirevic

7

나는 마침내이 작업을 사용하여 관리했습니다 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 규칙의 이름은 변경할 수 있지만 전체 경로를 사용해야합니다.


3

를 기반으로 살렘 의 대답과 다니엘 의 대답

나는 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을 사용했습니다.

크레딧 : 살렘다니엘 .


1

우분투 16.04-17.04 답변

이것은 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.


정말 고맙습니다! 우분투 17.04에서도 작동했습니다! 이것은 오랫동안 나를
괴롭 혔고 그것은

1
당신은 가장 환영합니다. 17.04에도 필요하다는 의견을 보내 주셔서 감사합니다.
WinEunuuchs2Unix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.