HDMI가 랩톱에 연결되어있을 때 HDMI 오디오로 전환 (14.04)


12

노트북을 연결하면 오디오를 HDMI로 전환하고 제거 할 때 표준 아날로그로 다시 전환하려고합니다.

전환을 수행하기 위해 스크립트를 트리거하도록 udev 규칙을 설정했지만 작동시키는 데 문제가 있습니다.

  • 사운드 설정에서 HDMI 오디오 출력을 선택할 때까지 사용 가능한 싱크로 인식되지 않으며 HDMI 오디오 출력을 선택하면 아날로그 출력이 더 이상 표시되지 않습니다.

아래를보십시오 :

# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks 
5   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI selected in sound settings    
$ pactl list short sinks 
7   alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED
kingamajick@kingamajick-laptop: ~

# HDMI removed
$ pactl list short sinks 
9   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 48000Hz   SUSPENDED

토글을 사용하는 스크립트 출력은 다음과 같습니다.

#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

사운드 설정에서 HDMI를 선택하기 전에 트리거 할 때 스크립트가 이러한 싱크가 없다는 오류를 표시합니다.


답변:


9
  1. 사용 가능한 카드 및 프로필 확인

    pactl list cards
    
  2. 기본 싱크 및 이동 스트림을 설정하기 전에 스크립트에 다음 명령을 추가하여 프로파일 변경

    pactl [options] set-card-profile  CARD PROFILE
    

(따라서 사운드 설정에서 수동으로 전환 할 필요가 없습니다)

참고:

pactl -h & man pactl


9

이에 본사를 둔 링크링크 ... 내가 테스트 WORKS FINE는 1404 우분투

당신은 규칙을 만들어야합니다 /etc/udev/rules.d/100-hdmi_sound.rules

이 내용을

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

그런 다음 생성

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

귀하의 콘텐츠

#!/bin/bash

HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

나는 희망이있다


4

나는 이것에 약간의 어려움을 겪었다. 원래 스크립트를 복사하여 제안대로 수정했으며 이제는 작동합니다.

다른 사람이 더 쉽게 사용할 수 있도록 여기에 포함 시켰습니다.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

이제는 udev로 트리거하고 싶지만 어떻게 해야하는지에 대해서는 실마리가 없습니다.


1
16.04에서는 작동하지 않습니다. 나는 다시 노력하고 있습니다.
Joe

3

제공된 스크립트는 Ubuntu 14.04의 udev에서 즉시 작동하지 않았습니다.

export DISPLAY=:0

처음에는 두 개의 pacmd 명령을 pactl로 변환하고 마지막으로 udev 규칙에서 sudo -s -u (사용자)를 사용하여 스크립트를 실행하십시오.

#!/bin/bash
## From: /ubuntu/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now

export DISPLAY=:0

##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')

if [ $HDMI_STATUS = "connected" ]
then
    pactl set-card-profile 0 output:hdmi-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo  &> /dev/null; done
else
    pactl set-card-profile 0 output:analog-stereo
    pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
    for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo  &> /dev/null; done
fi

2

글쎄, 제공된 모든 스크립트가 나에게 효과가 없었지만 (우분투 16.04) 한 번의 클릭으로 사운드 출력을 변경할 수있는이 앱 표시기를 찾았습니다 .

https://github.com/lkettenb/sound-output-switcher

(참고 : appindicator 패키지를 먼저 설치해야합니다. sudo apt-get install python-appindicator)

대안 솔루션이지만 나와 같은 상황에있을 수있는 다른 사람들을 위해 여기에 남겨 두겠다고 생각했지만 ... 매우 쉽고 불 연속적입니다 ;-)


0

이전을 기반으로 한 다른 솔루션 (16.04에서 작동하는 것으로 테스트 됨) pactl은 올바른 서버 를 올바르게 가리키는 방법으로 개선되었습니다 (카드 또는 프로파일의 이름을 자동으로 얻도록 개선 할 수 있습니다 ( 지금 pactl list또는 참조 pactl info)).

#!/bin/bash

USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)

HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"

INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"

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

function pactl_cmd() {
  sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}

if [ "$HDMI_STATUS" = "connected" ]; then
  CARD=$HDMI_CARD
  OUTPUT=$HDMI_PROFILE
else
  CARD=$INTERNAL_CARD
  OUTPUT=$INTERNAL_PROFILE
fi

pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT

INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
  pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done

관련 요지는 여기에 있습니다 .


나는 비슷한 스크립트를 사용 card0했지만 작동 했지만 언젠가는 전환되어 다음날 card1스크립트가 변경되었습니다 card0. 결국 나는 코드를 변경했고 card*그 이후로 모든 것이 잘되었습니다. 비슷한 일이 생기면 머리를 숙입니다.
WinEunuuchs2Unix

0

Udev 스크립트는 루트로 실행되지만 사용중인 디스플레이 관리자도 알아야합니다. 이 스크립트는 작동하지만 디스플레이 관리자에게 권한을 부여해야합니다.

사용중인 DM을 찾으십시오.

pgrep -a Xorg

-auth 옵션을 참조하면 디스플레이 관리자가 표시됩니다. 최신 Ubuntu 릴리스에서 sddm ou lightdm 일 수 있습니다.

이 줄은 다음과 같이 XAUTHORITY 변수로 내 보내야합니다.

ls /car/run/sddm*

예를 들어, 이것은 유효한 출력 일 수 있습니다.

/var/lib/mdm/:0.Xauth (스크립트에서 사용됨)

스크립트는 다음과 같아야합니다.

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0

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

디스플레이 관리자가 HDMI 출력을 변경할 수 있습니다. 지침에 따라 udev 규칙 파일을 작성하고 스크립트를 실행 가능하게하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.