스피커와 일반 마이크 외에도 가끔 사용하는 멋진 무선 헤드폰 세트가 있습니다.
하나의 입력 소스와 출력 소스를 다른 소스로 전환하는 스크립트를 작성하고 싶습니다. 본질적으로 헤드폰과 스피커 + 마이크 사이를 전환합니다.
나는 이것 사이를 바꾸고 싶다 :
...이:
두 입력과 출력 간의 전송을 스크립팅하는 방법이 있습니까? 본질적으로 나는 다음과 같은 것을 찾고 있습니다 :
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-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
출력 어딘가에 있습니다.
답변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