본문 바로가기

IT

pactl 을 이용한 sound output 제어

반응형

사운드 출력을 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 에서 단축키를 추가했습니다.

이제 간편하게 단축키를 사용해서 이어폰과 모니터 스피커간의 사운드 출력을 전환할 수 있습니다.

반응형