쉘을 사용하여 다른 오디오 출력 하드웨어를 어떻게 전환 할 수 있습니까?


33

스피커가있는 외부 모니터와 함께 랩톱을 사용합니다. 모니터가 HDMI를 통해 연결된 경우 일반 랩톱 오디오 출력과 모니터 출력간에 (GUI : 사운드 설정-> 하드웨어 사용) 전환 할 수 있습니다.

이 절차를 여러 번 반복하여 자동화 할 수 있는지 또는 어쨌든 쉘을 사용하여 더 빠른 방법으로 실행할 수 있는지 궁금해지기 시작했습니다.

내 배포판은 그놈 3이있는 Ubuntu 12.04입니다.

편집하다:

pacmd를 사용해 보았지만 목록 싱크는 현재 사용중인 장치 만 제공합니다.

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

GUI에서 전환 한 후 :

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

그리고 변경하려고하면 다음과 같은 결과가 나타납니다.

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.

답변:


27

이 경우 카드는 항상 동일합니다. 스위치와 다른 스위치간에 변경되는 것은 "카드 프로필"입니다.

따라서 실제로 작동 한 솔루션은 다음과 같습니다.

pacmd set-card-profile <cardindex> <profilename>

필자의 경우 모든 카드 프로필을 다음과 같이 찾았습니다.

pacmd list-cards

그리고 다음을 사용하여 모니터와 노트북 스피커를 전환 할 수 있습니다.

pacmd set-card-profile 0 output:hdmi-stereo

과:

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

여기서 0은 카드의 색인입니다.

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

마지막으로 스위치 속도를 높이기 위해 .bashrc 파일에 두 개의 별칭을 설정했습니다.

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

이렇게하면 모니터에서 입력하거나 쉘에 입력하는 랩톱 (헤드폰) 또는 audio-hdmi 또는 audio-laptop에서 오디오를 전환 할 수 있습니다


흠. 내 pacmd에는 '목록 카드'옵션이 없습니다.
ka3ak


3

이전 스크립트를 기반으로 매우 작은 스크립트를 만들었습니다.이 스크립트는 오디오뿐만 아니라 비디오 출력도 전환합니다. 디스 퍼 를 사용하여 디스플레이를 전환합니다.

코드는 다음과 같습니다.

#!/bin/bash

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

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

나에게는 디스플레이를 복제하는 것을 좋아하지 않기 때문에 특히 유용합니다. 나는 둘 중 하나를 사용합니다. 오디오 프로파일을 특정 시스템에 맞게 조정해야 할 수도 있습니다.


2

당신은 사용할 수 있습니다 pactl, 자세한 내용은 man 페이지를 참조하십시오.


2

알림 애플릿을 구현하기위한 Lukas의 Python 스크립트 ( https://github.com/lkettenb/sound-output-switcher )가 제대로 작동합니다. appindicator 패키지가 필요합니다. 그것은 함께 설치할 수 있습니다

sudo apt-get install python-appindicator

3
스크립트에 무엇이 있고 왜 유용한 지 설명하는 답변에 최소한 몇 단어를 포함 시키십시오.
derobert


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"..

사용자 정의 바로 가기 를 사용 하여 실행할 수 있습니다 bash -c(다른 바로 가기와 충돌이있을 경우 경고).

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

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

스크립트에서

@ user829996 (및 여기 @ user56655)에 따라 몇 가지 사항을 변경했습니다.

#!/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

0

다음을 수행하는 다음 파이썬 스크립트를 만들었습니다.

  1. ID와 상관없이 기본 장치를 목록의 다음 장치 (랩 어라운드)로 전환
  2. 실행중인 모든 응용 프로그램을이 장치로 이동합니다.
  3. 장치 이름을 사용하여 GUI에 알림을 보냅니다.
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

스크립트에 키보드 단축키를 할당했으며 이제 내 인생은 행복합니다.

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