사운드 출력을 command line 명령어를 통해서 제어하고, 단축키로 변경을 쉽게 할 수 있도록 간단한 스크립트를 하나 작성했습니다.
pactl 의 기본적인 사용방법은 아래와 같습니다.
소리를 출력하는 스피커와 같은 장치는 sink, 소리를 입력하는 마이크와 같은 장비는 source 라는 단어를 사용합니다.
여기서는 소리를 출력하는 sink 에 관한 설정만 다룹니다.
기본적은 제어 방법은 차이가 없기때문에 쉽게 수정해서 사용할 수 있을 겁니다.
기본 출력 장치 확인
pactl get-default-sink
출력 가능한 장치 목록
-- 출력 장치 목록 조회
pactl list sinks short
-- 출력 장치 명칭 목록 조회
pactl list sinks short | awk '{print $2}'
원하는 장치로 기본 출력 변경
-- yeti 마이크의 아날로그 출력 단자로 기본 출력 변경 (헤드폰 사용)
pactl set-default-sink $(pactl list sinks short | grep -i yeti | awk '{print $2}')
-- 모니터의 hdmi 로 기본 출력 변경
pactl set-default-sink $(pactl list sinks short | grep -i hdmi | awk '{print $2}')
pactl 의 set-default-sink 명령어에는 출력 가능한 장치 목록에서 보는 바와 같이 장치의 이름이 필요합니다.
저 긴 명칭을 다 외우기는 귀찮으니, 각 장치별로 중복이 없는 단어를 사용해서 grep 으로 해당하는 장치를 선별하고, awk 명령으로 2번째 칼럼에 출력되는 장치 명칭을 가져오는 명령어로 짧은 검색어(ex: yeti, hdmi) 로 장치를 선택할 수 있습니다.
좀 더 편하게
저의 최종 목표는 yeti analog, hdmi 간의 스위칭을 키보드 단축키를 사용해서 전환하는 것입니다.
그래서 간단하게 장치 명칭의 키워드를 입력해서 원하는 장치로 전환하거나, 위 2개의 장치를 명령어를 실행할 때마다 전환하는 스크립트를 작성했고, 아래와 같습니다.
#!/bin/bash
display_help() {
echo "Usage: $0 [option] {sink_keyword}" >&2;
echo;
echo " -h, --help print help message";
echo " --switch change sink 'yeti analog' or 'hdmi'";
echo " --set set sink with 'keyword of sink name'. ex)yeti, hdmi";
echo;
echo "[List of available sink name]";
pactl list sinks short | awk '{print $2}';
echo;
}
switch_sink() {
echo "Process to switch sink";
CURRENT_SINK=$(pactl get-default-sink);
echo "Current sink is $CURRENT_SINK";
if [[ $CURRENT_SINK =~ "Yeti" ]]; then
HDMI_SINK=$(pactl list sinks short | grep -i hdmi | head -1 | awk '{print $2}');
set_default_sink "$HDMI_SINK";
else
YETI_SINK=$(pactl list sinks short | grep -i yeti | head -1 | awk '{print $2}');
set_default_sink "$YETI_SINK";
fi
}
set_sink() {
echo "Process to set sink"
SINK=$(pactl list sinks short | grep -i "$1" | head -1 | awk '{print $2}');
set_default_sink "$SINK";
}
set_default_sink() {
echo "Found sink $1";
pactl set-default-sink "$1"
echo "Default sink set $1";
}
ARGUMENT_COUNT=$#
case "$1" in
-h|--help)
display_help "$0";
exit 1;
;;
--switch)
if [[ "$ARGUMENT_COUNT" -ne 1 ]]; then
echo "Usage: $0 --switch" >&2;
exit 1;
fi
switch_sink "$2";
exit 0;
;;
--set)
if [[ "$ARGUMENT_COUNT" -ne 2 ]]; then
echo "Usage: $0 --set keyword" >&2;
exit 1;
fi
set_sink "$2";
exit 0;
;;
*)
display_help "$0";
exit 1;
;;
esac
스크립트의 기능은 아래와 같습니다.
- 스크립트를 argument 없이 실행하면 도움말이 출력됩니다.
- --switch 를 사용하면 yeti, hdmi 간 상호 전환을 진행합니다.
- --set yeti 또는 --set hdmi 와 같이 사용하면 원하는 장치로 전환됩니다.
위 기능을 만들기는 했지만 저는 --switch 가 주된 목적입니다.
해당 파일은 /usr/local/bin 폴더에 change_sink 라는 스크립트 파일로 생성했고, chmod a+x 명령어를 이용해 실행 가능하도록 설정했습니다.
저의 리눅스 DE 는 gnome 이기때문에 settings -> keyboard -> keyboard shrotcuts -> custom shortcuts 에서 단축키를 추가했습니다.
이제 간편하게 단축키를 사용해서 이어폰과 모니터 스피커간의 사운드 출력을 전환할 수 있습니다.