Shell에서 PulseAudio 입력 / 출력을 변경 하시겠습니까?


38

스피커와 일반 마이크 외에 때때로 사용하는 멋진 무선 헤드폰 세트가 있습니다.

하나의 입력 및 출력 소스와 다른 소스와 기본적으로 내 헤드폰과 스피커 + 마이크 사이를 전환하는 스크립트를 작성하고 싶습니다.

나는 이것을 바꾸고 싶다 :

...이:

두 입력과 ​​출력 사이의 스크립트 전송 방법이 있습니까? 본질적으로 나는 다음과 같은 것을 찾고 있습니다 :

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

이것을 스크립팅하는 방법이 있습니까?


3
man pactlPulseAudio 명령 행 옵션을 살펴볼 수 있습니다.
Teresa e Junior

주제 외 : 해당 스크린 샷에서 어떤 GUI 응용 프로그램입니까?
WhyNotHugo

초등학교의 시스템 설정입니다.
Naftuli Kay

답변:


52

@ Teresa-e-Junior가 지적했듯이 다음 pactl과 같은 도구를 사용할 수 있습니다.

우선 PA 싱크의 ID를 얻고 싶을 수도 있습니다. 내 시스템에서 이것은 내가 얻는 것입니다.

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

싱크 1은 현재 기본 싱크입니다.
그러나 이제는 현재와 미래의 모든 스트림을 HDMI (예 : 싱크 0)를 통해 재생하려고합니다.

PulseAudio의 기본 싱크를 설정하는 명령이 있지만 PC에 영향을 미치지 않는 것 같습니다.

$ pacmd set-default-sink 0 #doesn't work on my PC :(

대신 새로운 스트림이 가장 최근에 스트림을 이동 한 싱크에 연결되어있는 것 같습니다.

pactl에게 현재 재생중인 모든 스트림을 싱크로 이동 시키라고하자 0. 먼저 다음을 나열해야합니다.

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

좋습니다 1. 싱크에 연결된 두 개의 스트림 (ID 290 및 295)이 있습니다 .
싱크대로 옮기자 0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

그게 다야. 이제 우리를 위해 작동하는 스크립트를 만들어야합니다.

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

당신은 싱크 ID 또는 (예 중 하나를 매개 변수로 싱크 이름 중 하나와 함께 호출 할 수 있습니다 0또는 뭔가처럼 alsa_output.pci-0000_01_00.1.hdmi-surround).

이제이 스크립트를 udev 이벤트 또는 키 바로 가기에 첨부 할 수 있습니다.


1
정말 고마워요! 나는 이것을 훌륭하고 다루기 쉬운 파이썬 스크립트로 만들었습니다 . 여기 에서 사용할 수 있습니다 .
Naftuli Kay


1
@NaftuliTzviKay : 더 이상 스크립트를 사용할 수 없습니다. 그래도 있으면 [GitHub Gist] (gist.github.com)에 게시하십시오.
Denilson Sá Maia

그리고 만약에 0 sink input(s) available.? 그러나 그 시끄러운 플래시 플레이어는 여전히 오디오를 재생하고 있습니까? 그리고는 플래시 플레이어를 보려면 client(s) logged in섹션pacmd list
Zhigalin

1
$ pacmd set-default-sink INDEX내 스크립트에는 여전히 필요합니다. 그렇지 않으면 볼륨 변경을위한 키보드 명령이 계속 이전 싱크 소스를 사용합니다.
myol

9

다음 명령은 PulseAudio 사운드 서버를 조작하는 데 사용됩니다.

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

다음은 작동 방식에 대한 몇 가지 예입니다.

pacmd list-sinks:: 가능한 싱크의 목록 이름 또는 색인 번호

pacmd set-default-sink [sinkname]:: 기본 출력 싱크 설정

pacmd set-default-source [sourcename]:: 기본 입력 설정

pacmd set-sink-volume [index] [volume]:: 싱크 볼륨 설정

pacmd set-source-volume index volume:: 음량 조절 범위 0-65536 (숫자가 낮을수록 음량이 낮아짐)

이것들은 wiki & man 페이지에서 가져온 몇 가지입니다. 자세한 내용은 이것을 참조 하십시오. 또는 명령 --help이나 man페이지를 볼 수 있습니다 .

이 목적을 수행하는 명령 줄 도구가 이미 있습니다. 이름은 ponymix 입니다. PulseAudio 용 명령 줄 믹서입니다. 제공된 링크는 프로젝트 github에 대한 것입니다. 친구 및 동료 Arch Linux Trusted User / Developer가 개발했습니다. Arch를 실행하지 않는다면 makeand를 사용하여 소스에서 컴파일 할 수 있습니다 sudo make install.

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card


5

Fedora 20을 실행하는 랩탑에서 HDMI 출력은 기본 프로파일 의 싱크로 표시되지 않고 다른 프로파일 자체로 표시됩니다.

노트북과 같은 멋진 음악을 재생하는 싱크는 1 개뿐입니다.

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

내가 달리면 pactl set-card-profile 0 output:hdmi-stereo멋진 음악이 HDMI를 통해 재생됩니다. 나는 얻다:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

기본값으로 돌아가려면 그냥 실행하십시오 pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. 어느 쪽이든 재부팅하면 기본값이 다시 나타납니다.

내 카드의 프로파일 목록이 pactl list cards출력됩니다.


이 정보는 이미 허용 된 답변에 의해 제공되었습니다. 더 추가 할 것이 없다면 다른 사용자의 답변을 복사하지 마십시오. 이것은 다른 답변을 다시 해치 우고 새롭거나 유용한 것을 제공하지 않았습니다!
slm

5
set-card-profile이전에 언급되지 않았으며이 답변에서 가장 중요한 정보입니다.
Spidey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.