연결 / 연결 해제시 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.