아날로그 스테레오 출력 및 HDMI 오디오 출력 간 전환을위한 바로 가기


18

HDMI 오디오 출력 (모니터)과 시스템 오디오 잭 (모니터의 경우 오디오 출력이없는 헤드폰)의 일반 오디오 출력으로 다시 전환하려면 사운드 기본 설정을 열고 매번 올바른 채널을 선택해야합니다. 전환을 너무 자주 수행하기 때문에 패널에서 전환 버튼을 만들거나 전환 할 단축키를 지정할 수있는 방법이 있습니까?

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

여기에 이미지 설명을 입력하십시오


1
+1 한 번의 키 누름으로 올바른 HDMI 디스플레이 출력 모드 및 사운드 모드로 전환 할 수 있다면 정말 좋을 것입니다.
Kit Menke

더 좋은 방법은이 HDMI / Display Port 오디오 채널을 감지하면 자동으로 전환하는 것입니다. 이것이 도킹의 목적입니다. 특정 하드웨어 ID (MAC)를 기반으로 구성을 변경하는 도킹 코드가 기억 나고 있습니다. 그게 또 무엇인지 아는 사람 있습니까?
Elijah Lynn

답변:


10

pulseaudio 를 사용 하면 명령 줄에서 출력 싱크를 선택할 수 있습니다.

pacmd set-default-sink "SINKNAME"

이 명령은 실행기, 스크립트에서 사용하거나 다른 싱크 간 빠른 전환을 위해 키보드 단축키에 할당 할 수도 있습니다. "SINKNAME"을 원하는 싱크의 이름 또는 번호로 바꾸십시오. 관련 번호 및 이름이있는 알려진 싱크 목록은 다음 명령으로 제공됩니다.

pacmd list-sinks

참고 : 명령 행 인터페이스를 통해 출력 싱크를 변경하면 스트림 대상 장치 읽기 가 비활성화 된 경우에만 적용 할 수 있습니다 . 해당 라인을 편집하여 다음을 수행 할 수 있습니다 /etc/pulse/default.pa.

load-module module-stream-restore restore_device=false

또는 가상 오디오 장치 를 추가하는 옵션으로 paprefs 를 실행하여 pulseaudio를 실행하여 내부 오디오 장치와 hdmi 장치로 동시에 사운드를 출력 할 수 있습니다 .

paprefs


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"그리고 pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"단지 사운드 환경 설정에서 해당 프로파일을 선택한 후 사용할 수 있습니다. HDMI가 설정되어 있고 아날로그 스테레오에 대해 pacmd 명령을 실행하면 오류가 발생 Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.하지만 사운드 환경 설정 GUI에서 프로파일을 수동으로 선택하고 동일한 명령을 실행하면 오류가 발생하지 않습니다. 따라서 전환하는 데 도움이되지 않습니다.
iJeeves

@iJeeves : 업데이트 편집을 참조하십시오.
Takkat

비슷한 문제. 명령을 실행하면 GUI에서 시각적으로 변경되지만 사운드는 리디렉션되지 않습니다. GUI에서 수동으로 전환해야 작동합니다. 어떤 아이디어?
Elijah Lynn

1
@ElijahLynn : 또한 스트림을 이동해야 할 수도 있습니다 : askubuntu.com/questions/71863/…
Takkat

@Takkat : 아직 시도하지는 않았지만 정확한 문제인 것 같습니다. 정말 고마워!
Elijah Lynn

7

나는 이것이 매우 성가신 것을 발견하고 출력을 토글하는 스크립트를 작성했습니다.

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
else 
        pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo"        
fi

그런 다음 키보드에서 사용하지 않는 키를 바인딩하여 실행합니다 ( 사용자 정의 명령을 키보드 단축키에 바인딩하는 방법 참조 ).



한 카드의 두 프로필 만 아니라 두 카드 사이를 전환해야하는 경우 어떻게해야합니까?
Oebele

2

또 다른 싱크 스위처 스크립트

우분투 16.04에서 테스트


그러나이 기능을 사용하면 원하는 응용 프로그램의 오디오 만 전환 할 수 있습니다.

사용법 : 싱크를 변경하려는 응용 프로그램의 초점을 맞추고이 스크립트를 실행하십시오. 그게 다야 !!!

이 스크립트는 포커스가있는 응용 프로그램을 감지하고 해당 응용 프로그램에서 재생중인 모든 오디오를 찾은 다음 사용 가능한 다음 싱크로 전환합니다.

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

스크립트 설명

초점을 맞춘 애플리케이션의 PID를 찾아야합니다.

하지만 먼저 xid가 필요합니다

xprop -root _NET_ACTIVE_WINDOW 

그런 다음 여기 $xid에 삽입 하여 응용 프로그램의 pid를 얻으십시오.

xprop -id $xid _NET_WM_PID

이제 해당 PID와 관련된 싱크 입력을 찾아야합니다.

먼저 명령 출력을 선형화하여 pacmd list-sink-inputs한 줄에 하나의 싱크 입력을 나열하고 같은 줄에 색인, 싱크 및 pid를 표시합니다

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

단계별로 분석해 보겠습니다.

grep -E 'index:|sink:|process.id만을 포함하는 행을 유지 index:, sink:또는process.id

tr '\n' ' ' 모든 라인에 합류

tr -d '"'모든 "문자를 제거합니다 . 따옴표없이 pid를 얻는 데 필요

sed -e 's/index:/\n/g'모든 index:발생을 줄 바꾸기 문자로 바꿉니다.\n

tail -n +2 비어 있기 때문에 첫 번째 줄을 제거합니다

결과는 다음과 같습니다.

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

의미를 이해하기 위해 한 줄을 분석해 보겠습니다.

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182싱크 입력 인덱스, 0싱크 인덱스 및 13752마지막에 속하는 응용 프로그램의 pid

그런 다음 각 줄을 반복합니다.

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

마지막으로 집중 앱의 pid와 일치하는 싱크 입력의 pid 만 필터링하십시오.

  if [ $sink_input_pid = $app_pid ]; then

데이터 추출

함께 awk우리는 요소를 얻을 수 있습니다 우리는 필요

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

싱크 회전이 0에서 다시 시작해야하는 시점을 알기 위해 싱크 수를 가져옵니다.

sink_list_size=${#sink_list_array[@]}

다음 싱크를 찾으면 싱크 목록을 반복하여 current_sink_index 와 일치 하는 것을 알고 다음 싱크의 인덱스를 알아야합니다.

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

마지막으로 싱크 입력을 움직여 next_sink_index 에서 재생합니다.

pacmd move-sink-input $sink_input_index $next_sink_index

우분투 16.04에 대한 참고 사항 :

바로 가기 키를 구성 할 때 우분투의 바로 가기 관리자에서 작동하지 못했습니다. 그래서 compizconfig-settings-manager 를 설치해야 했습니다.

sudo apt-get install compizconfig-settings-manager

새로운 사용자로서의 첫 번째 답변은 +1입니다. 원래 질문은 Ubuntu 11.04에 대한 것이 었으므로 테스트 된 버전을 지적해야합니다.
WinEunuuchs2Unix

트윗 담아 가기 감사합니다 :). 제목 아래에 우분투 버전을 추가했습니다.
Madacol


1

스크린 샷에는 사운드 카드가 하나만 표시 되므로이 사운드 카드의 출력 을 전환해야 한다고 생각합니다 .

예를 들어 : 하나의 통합 사운드 카드가있는 노트북이 있지만 도킹되면 디지털 출력 (SPDIF)이 있습니다.

그래서 내가하고 싶은 것은 펄스 오디오에서 활성 출력 또는 "프로필"을 전환하는 것입니다.

정확히 그렇게하는 명령을 찾았습니다.

pacmd set-card-profile 0 output:analog-stereo
pacmd set-card-profile 0 output:iec958-stereo+input:analog-stereo

원하는 출력 설정 (여기서는 디지털 출력이지만 아날로그 (마이크로) 입력)에 대한 올바른 이름을 얻기 위해 수행 한 작업은 다음과 같습니다.

pacmd list | grep output

1

나는이 문제에 대한 해결책을 찾으려고 노력했다. 우분투 11.04부터는 이것이 직접 가능하지 않은 것 같습니다.이 안내서 만 HDMI와 아날로그를 별도의 출력으로 추가하는 것으로 나타 났으므로 pacmd는 3 개의 싱크를 보여줍니다. 그런 다음 위의 명령을 사용하여 싱크 간을 전환 할 수 있습니다. (도 참조 )

그러나 우분투 11.11은 잭 감지 시스템을 갖춘 PulseAudio를 얻을 것입니다. 아래 웹 사이트에 따르면 David Henningsson은 udev를 통해 감지를 코딩하여 펄스 오디오가 동일한 사운드 카드의 다른 프로파일 간 전환을 포함하여 마지막으로 추가 된 출력으로 자동 전환됩니다 (귀하의 설정과 내 설정의 경우). ( 여기 참조 )

다음 주 금요일에 최종 버전을 시험해 볼 때 이것이 효과가 있기를 바랍니다.


1

이전의 많은 답변을 바탕으로 사용 가능한 응답 사이에서 재생 싱크를 번갈아 설정하는 스크립트를 작성했습니다.

이를 사용하는 가장 좋은 방법은 바로 가기 키를 만들어 실행하는 것이므로 해당 키 조합을 누를 때마다 오디오가 사용 가능한 다음 싱크로 리디렉션됩니다.

코드는 여기에 있습니다 : https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

필자의 경우 아날로그 옵션은 목록에 없습니다. pavucontrol을 설치하십시오. sudo apt install pavucontrol

응용 프로그램을 시작하여 문제를 해결할 수 있습니다.

  1. 입력하여 단자를 통해 응용 프로그램을 시작합니다 pavucontrol(입력)
  2. '구성'탭으로 이동하십시오.
  3. 인턴 사운드에서 아날로그 스테레오 출력 프로파일 선택

여기에 이미지 설명을 입력하십시오

이제 여기에서 소리가 나고 다른 프로필을 선택할 수 있습니다 (Linux Mint에서).

여기에 이미지 설명을 입력하십시오


0

Sound Switcher Indicator (PPA를 추가해야 함) 의 대안 은 명령 (또는 스크립트)을 작성하고 바로 가기로 호출하는 것입니다.

내 경우에는 hdmi-stereo-extra1+input프로필이므로 한 줄에 다음과 같습니다.

[[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && \
     pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || \
     pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo"

당신은 사용할 수있는 사용자 정의 바로 가기를 ( gnome-control-center keyboard그것을 실행) bash -c(기타 바로 가기와 충돌이있을 경우 경고합니다) :

스크린 샷

스크린 샷

나는 사용한다:

  • Super + Alt + o: 헤드폰과 HDMI간에 출력을 전환합니다.
  • Super + Alt + Up: Vol Up
  • Super + Alt + Down: Vol Down

또한 당신은 추가 할 수 있습니다 alias당신에게 .bashrc.

우분투 16.04 및 18.04에서 테스트


스크립트에서 위의 동작을 원하지 않으면 @ user829996 답변을 기반으로 몇 가지 사항을 변경했습니다.

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile

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