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

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

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

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

나는 이것 사이를 바꾸고 싶다 :

...이:

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

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

이것을 스크립트로 작성할 수 있는 방법이 있나요?

답변1

@ 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의 기본 수신기를 설정하는 명령이 있지만 내 컴퓨터에는 아무런 영향을 미치지 않는 것 같습니다.

$ 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

좋습니다. 두 개의 스트림(ID 290 및 295)이 있으며 둘 다 싱크에 연결되어 있습니다 1.
아래로 이동해 보겠습니다 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 이벤트나 단축키에 연결할 수 있습니다.

답변2

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(숫자가 낮을수록 볼륨이 낮아짐)

위키와 매뉴얼 페이지에서 가져온 내용 중 일부입니다. 인용하다이것자세한 내용을 알아보세요. 또는 명령 --help이나 페이지를 볼 수 있습니다 man.

이 목적으로 사용할 수 있는 기존 명령줄 도구도 있습니다. 그것의 이름은포니믹스. PulseAudio용 명령줄 믹서입니다. 제공된 링크는 프로젝트 github을 가리킵니다. 친구이자 신뢰할 수 있는 Arch Linux 사용자/개발자가 개발했습니다. Arch가 실행 중이 아닌 경우 make소스에서 사용하고 컴파일 할 수 있습니다 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

답변3

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-stereoHDMI를 통해 멋진 음악이 재생됩니다. 나는 얻다:

$ 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출력 어딘가에 있습니다.

답변4

새 계정이므로 댓글을 달 수 없지만 @mreithub의 답변에 일부 코드를 추가하고 오디오 출력을 자동으로 반복하도록 만들었습니다.

#!/bin/bash
BACKGROUND_RED="`tput setaf 1` "
$BACKGROUND_WHITE="`tput setaf 6` "
FORGROUND_BLACK="`tput setaf 0` "
DIM="`tput dim` "
INVERT="`tput smso`"
BOLD="`tput bold` "
RESET="`tput sgr0` "
CLEAR="`tput clear` "

echo -e "$CLEAR" 
pactl list short sinks >&2
# ------------------------------------

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

if [ "$1" == '-' ]; then
   echo -en "$INVERT$BACKGROUND_WHITE Current sink : $RESET    " >&2
   currentSink=$(pactl list short sinks | grep RUNNING | awk '{print $1}' | head -1)
   if [ -e $currentSink ];then
       currentSink=$(pactl list short sinks | awk '{print $1}' | head -1)
   fi
   pactl list short sinks | grep "^$currentSink" | awk '{print $1,$2}' >&2
   sinks=( $(pactl list short sinks | awk '{print $1}') )
   for (( index=0; index <= (${#sinks[@]} * 2); index++ )); do
       if [ "${sinks[$((index % ${#sinks[@]}))]}" == "$currentSink" ]; then
           newSink="${sinks[$((++index % ${#sinks[@]}))]}"
           break
       fi
   done
else
   newSink="$1"
fi
   echo "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_"
   echo -en "$INVERT$BACKGROUND_RED New sink : $RESET     "
   pactl list short sinks | grep --color "^$newSink" | awk '{print $1,$2}' >&2

pacmd set-default-sink "$newSink" >&2

pactl list short sink-inputs|while read stream; do
   streamId=$(echo -en $stream|cut '-d ' -f1)
   echo -e "$FORGROUND_BLACK$DIM moving stream $streamId $RESET" >&2
   pactl move-sink-input "$streamId" "$newSink" >&2
done

관련 정보