내부 및 HDMI 스피커 간 자동 전환 HDMI에 대해 정확히 그것을 원합니다. 내장 된 스피커가있는

헤드폰을 랩톱의 보조 잭에 꽂으면 내부 스피커가 자동으로 음소거되고 사운드가 헤드폰에서 나옵니다. 나는 HDMI에 대해 정확히 그것을 원합니다.

내장 된 스피커가있는 모니터를 랩톱에 연결하여 비디오를 볼 수도 있습니다. 비디오가 모니터에있을 때 (제 책상에서 3m 떨어진 곳에있는 경우) 매우 이상하지만 랩톱의 내부 스피커에서 소리가납니다 (노트북이 책상 위에 있음).

물론 사운드 설정으로 이동하여 출력 채널을 HDMI로 전환 할 수 있습니다. 그러나 나중에 몇 시간 전에 HDMI 케이블을 제거하고 완전히 다른 위치에있을 때 사운드 서버는 여전히 HDMI를 통해 재생하려고 시도하지만 사운드가 연결되어 있지 않으므로 사운드가 재생되지 않습니다. .

HDMI를 통해 연결된 장치가없는 경우 자동으로 내부 스피커로 다시 전환하는 것이 더 중요하지만 장치가 연결되어있을 때 HDMI를 통해 사운드 출력으로 전환하는 것은 여전히 ​​매우 좋습니다.

이것은 11.10에서 작동했지만 16.04에서는 작동하지 않습니다.



답변

배경

사운드가 HDMI TV에서 랩톱 스피커로 전환 될 때 일시 중지 / 다시 시작하는 동안 비슷한 문제가있었습니다. 다시 시작하면 소리가 랩탑 스피커에서 유지되고 출력 장치를 TV in- System Settings> 에서 수동으로 재설정해야합니다 Sound.

이것은 Ubuntu 14.04 에서 16.04 로의 업그레이드에 대한 나의 성가신 경험 중 하나였으며 루트는 16.04 LTS 와 함께 제공되는 PulseAudio 8로 업그레이드되었습니다.

많은 검색 후이라는 스크립트를 만들었습니다 TV-sound. 나는 당신처럼 TV를 꽂거나 뽑지 않지만, 구글 검색을하고 상황에 맞게 변형 된 스크립트를 만들었습니다. 나는 그것을 테스트했고 작동합니다.

1 단계 : 연결된 장치간에 오디오를 전환하는 스크립트 만들기

hotplugtvudev가 호출 하는 스크립트를 작성 합니다. 이 같은 스크립트를 여러 곳에서 호출 할 수 있습니다. 예를 들어, 테스트 lock-screen-timer하는 동안 화면 잠금 중에 사운드가 랩톱으로 되돌아 오는 위치 에서 사용했습니다 .

cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv

빈 화면으로 편집기가 열리면 다음을 복사하여 붙여 넣으십시오.

#! /bin/bash

# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# 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.

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

exit 0

두 개의 어커런스를 rick자신의 사용자 ID (예 UTF-8: 등) 로 바꿔야합니다 .

나는 이것이 자동으로 bash 변수로 설정된 사용자 이름으로보다 전문적 일 수 있다는 것을 알고 있지만 아직 숙련되지 않았습니다 : (어쨌든, 파일을 저장하고 종료하십시오 gedit.

2 단계 : udev 규칙 작성

udev는 HDMI 모니터를 연결하고 분리 할 때 핫 플러그 ​​이벤트를 모니터링합니다. 새 규칙을 만들려면 다음을 입력하십시오.

cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules

참고 : 파일 70-persistent-net.rules이 디렉토리에 없으면 다른 파일을 복사하십시오. 파일 내용이 필요하지 않으며 파일 권한 만 동일하므로 파일 내용이 동일합니다.

에디터는 관련없는 텍스트를 보여주고 강조 표시하고 삭제합니다. 그런 다음 아래 코드를 강조 표시하여 편집기에 붙여 넣으십시오.

# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks

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

파일을 저장하고 종료하십시오.

다시 부팅하지 않고 규칙을 활성화하려면 udev를 다시로드해야합니다.

sudo udevadm control --reload-rules

이제 HDMI 모니터 / TV 및 사운드 스위치를 적절하게 연결 및 분리 할 수 ​​있습니다.

경고

시스템에서 HDMI를 뽑으면 사운드가 랩탑 스피커로 자동 전환됩니다. 귀하의 시스템에서는 그렇지 않았습니다. HDMI를 뽑을 때 소리가 랩탑 스피커로 전달되지 않으면 코드를 추가로 개선해야 할 수 있습니다. 작동 방식 / 작동하지 않는 방식에 대해서는 의견을 통해 회신 해주십시오

CLI에서 빠른 테스트

다음을 사용하여 터미널에서 코드를 빠르게 테스트 할 수 있습니다.

    export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
  • HDMI / TV로 전환 :

        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
  • 내장 스피커로 다시 전환하십시오.

        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
  • rick사용자 이름 으로 바꾸 십시오.

  • 초기 export줄은 필요하지 않지만 안전을 위해 포함했습니다.
  • 사운드 카드가 여러 개 있거나 hdmi-stereo스크립트를 작성하기 전에 올바른 매개 변수를 찾으려면 조정 이외의 것이 필요합니다.

PulseAudio 내에서 장치 이름 해독

아래 코드는 동일한 명령을 두 번 사용합니다. 소리가 외부 HDMI TV로 설정된 경우 소리가 랩탑의 내장 스피커로 설정되어있을 때 두 번째입니다. PulseAudio가 사용하는 이름을 볼 때마다 :

$ pacmd list-sinks | grep -e 'name:' -e 'index'
  * index: 28
    name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
  * index: 30
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

사운드 카드가 여러 개인 경우

이 명령 aplay -l을 사용하여 0보다 큰 카드가 있는지 확인하십시오. 그렇다면 스크립트에서 적절한 카드 번호를 사용해야합니다. 예를 들면 다음과 같습니다.

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: 92HD91BXX Analog [92HD91BXX Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

위의 예에서 모든 카드 번호는 출력 소스가 다른 0입니다. USB 스피커가 있으면 0과 다른 카드 번호를 가질 수 있습니다.

2016 년 12 월 2 일 편집

알 수없는 이유로 오늘 스크립트가 손상되었습니다. 위의 코드는 “$ (cat / sys / class / drm / card0-HDMI-A-1 / status”)를 읽는 데 사용되었지만 변경 card0해야 card1하고 위의 코드가 수정되었습니다. 변경된 내용을 설명 할 수 없습니다. 2016 년 11 월 26 일 이후 정기 우분투 업데이트 이외의 시스템에서.

2016 년 12 월 14 일 편집

다시로 다시 전환 할 필요가 위의 코드 :. “$ (고양이 / SYS / 클래스 / DRM / card0-HDMI는-A-1 / 상태”대신 사이에 코드를 수정의 card0card1기준에 개정 프로그램을 부팅에 따라 card*두 시나리오를 캡처 .


답변