====== PulseAudio 설정 및 활용 ====== ===== PulseAudio의 실행과 중단 ===== [[https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Running/|Running PulseAudio]]를 한번 훑어보자. 과연 내 리눅스 시스템에 PulseAudio가 설치되어 돌아가는 중인가? 우분투/데비안 계열이라면 그럴 가능성은 200%이다. 그럼에도 불구하고 확신이 들지 않는다면 다음 명령어를 입력해 본다. $ pulseaudio --check # 아무 것도 나오지 않으면(exit code 0) 실행 중이라는 뜻이다. # 또는 다음과 같이 입력하여 무언가 줄줄 출력된다면 실행 중이라는 뜻이다. $ pactl list # or 'pactl list short' $ pactl list short sinks # or 'pacmd list-sinks' PulseAudio는 autospawn 기능에 의해 클라이언트 요청이 있으면 저절로 시작된다. 따라서 PulseAudio을 중단하려면 ~/.config/pulse/client.conf 또는 /etc/pulse/client.conf 파일에서 "autospawn = no"으로 설정을 한 뒤 다음을 실행한다. $ pulseaudio --kill # 'pulseaudio -k' 또는 다음과 같이 실행한다. $ killall pulseaudio PulseAudio는 start-pulseaudio-x11 명령을 통해 실행된다. 설정 파일은 /etc/xdg/autostart/pulseaudio.desktop이다. /etc/xdg/autostart는 graphical session manager가 사용자 로그인시 자동으로 실행하는 응용 프로그램의 정보를 수록한 디렉토리이다. PulseAudio를 다시 시작하려면 설정 파일을 "autospawn = yes"로 되돌린 후 다음을 실행한다. $ pulseaudio --start ===== CLI 문법 ===== $ man pulse-cli-syntax # PulseAudio Command Line Interface Syntax * **pactl** - Control a running PulseAudio sound server * **pacmd** - Reconfigure a PulseAudio sound server during runtime 두 프로그램이 어떤 차이가 있는지 쉽게 구별할 수 있겠는가? 잘 모르겠다. control과 reconfigure의 차이인데, 예컨대 음량을 바꾸는 것은 control의 범주이고, loopback을 설정하는 것은 reconfigure의 범주에 속하는 것 같다. pacmd는 세부 명령어를 직접 입력할 수 있는 간단한 live shell을 제공하기도 한다. $ pacmd Welcome to PulseAudio 11.1! Use "help" for usage information. >>> 'pactl list [short] [TYPE]' 명령에서 TYPE은 modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards 중의 하나가 되어야 한다. pacmd 명령에서는 samples만 제외한 나머지 7개에 대하여 'pacmd list-modules'와 같은 방식으로 명령을 내려야 한다. 두 명령어의 출력 포맷은 같지 않다. ==== 음량 조절 ==== set-sink-volume 바로 뒤의 숫자는 사운드 카드의 인덱스를 의미한다. $ pactl -- set-sink-volume 0 +10% $ pactl -- set-sink-volume 0 80% pavucontrol -> Output Devices 탭을 열어 놓고 pactl로 음량 조절을 해 보라. ===== pacat 활용하기 ===== paplay, parec, parecord, pamon은 전부 **pacat**을 가리키는 심볼릭 링크이다. 다른 이름으로 불리고 있지만 실제로는 하나의 실행 파일이 녹음과 재생 등 다양한 역할을 수행하는 것이다. * pacat -r | %%--%%record = parec * pacat -p | %%--%%playback = paplay ==== parec 응용 스크립트로 애플리케이션 출력을 녹음하기 ==== **parec**은 PulseAudio 사운드 서버를 거치는 오디오 스트림(예: 애플리케이션의 출력)을 녹음하는 유틸리티이다. 이것을 그대로 사용하기에는 꽤 난해하니(바로 다음에 새로 추가한 섹션에 따르면 그렇지도 않음) 이를 응용하여 만든 스크립트인 [[https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007|pulse-recorder.bash]]를 사용하는 것이 편리하다. pulse-recorder.bash를 이용하여 유튜브의 재생음을 녹음하는 방법은 다음과 같다. 녹음하려는 애플리케이션이 재생 중인 상태여야 이것(sink-input)의 인덱스 번호를 구할 수 있다. 출력 파일에는 temp.ogg라는 이름이 자동으로 붙는다. $ pulse-recorder.bash index: 2 application.name = "Firefox" module-stream-restore.id = "sink-input-by-application-name:Firefox" Choose recording index: 2 temp.ogg file already exist, replace (y/n)? y Encoding standard input to "temp.ogg" at approximate bitrate 192 kbps (VBR encoding enabled) Encoding [ 1m05s so far] - # Ctrl+C를 눌러서 녹음을 종료하고 소리를 들어보자. $ ogg123 temp.ogg Audio Device: PulseAudio Output Playing: temp.ogg Ogg Vorbis stream: 2 channel, 44100 Hz Done. # GUI 재생기를 써 보자. $ parole temp.ogg 2> /dev/null & $ vlc temp.ogg 왜 하필이면 OGG 파일인가? 이 포맷은 대중적인 MP3보다 압축률이 더 크고, 무엇보다도 공개된 포맷이라서 라이센스 제한이 없다는 점이 유용하다. pulse-recorder.bash 스크립트는 Ask Ubuntu의 질문 [[https://askubuntu.com/questions/60837/record-a-programs-output-with-pulseaudio|Record a program's output with PulseAudio]]에 대한 답변으로 만들어진 것이다. parec을 '날것'으로 이용하여 오디오 스트림을 녹음하는 방법을 익히려면 이 Ask Ubuntu의 글을 꼼꼼히 읽어보면 도움이 될 것이다. [[https://freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-combine-sink|module-combine-sink]] 모듈과 move-sink-input 명령을 알아야 이 과정을 이해할 수 있다. * **move-sink-input** __ID__ __SINK__ : Move the specified playback stream (identified by its numerical index) to the specified sink (identified by its symbolic name or numerical index). ==== parec을 이용한 간편한 녹음 ==== 바로 위 섹션에서는 parec을 이용하여 애플리케이션의 재생음을 녹음하는 방법을 설명하였다. USB 오디오 장비를 연결하지 않은 상태에서 헤드셋을 컴퓨터에 꽂은 다음, 마이크 입력을 parec으로 녹음하는 간편한 방법이 있는지를 찾아보았다. Jérôme Belleman의 [[http://jeromebelleman.gitlab.io/posts/productivity/parec/|Recording the Sounds of your Computer]]가 좋은 힌트가 되었다. 이 방법은 애플리케이션이 아니라 sink 또는 source device를 지정한다는 점이 앞서 소개한 방법과는 조금 다르다. $ parec -d # 이 상태에서 탭을 쳐 보라. alsa_input.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo.monitor Source로 사용할 수 있는 디바이스는 *input*(마이크) 또는 output*.monitor이다. 무엇을 써야 마이크로 녹음이 될지는 명백하다. $ parec -d alsa_input.pci-0000_00_1b.0.analog-stereo | twolame -r - out.mp3 --------------------------------------------------------- Input Filename: STDIN Output Filename: out.mp3 Raw input format: 2 channels, 16-bit, 44100 Hz --------------------------------------------------------- LibTwoLame 0.3.13 (http://www.twolame.org) Input : 44100 Hz, 2 channels Output: 44100 Hz, Stereo 192 kbps CBR MPEG-1 Layer II psycho model=3 [De-emph:Off Copyright:No Original:Yes] [Padding:Off CRC:Off Energy:Off ] --------------------------------------------------------- Encoding frame: 447 # Ctrl+C를 눌러서 종료 $ play out.mp3 lame과 twolame은 거의 같은 기능을 하는 것 같다. twolame은 녹음이 진행될 때 친절하게 화면에 정보를 뿌리는 것이 마음에 든다. 다른 encorder를 쓰는 방법을 알아보자. CLI로 녹음하는 일에 재미를 들이면 아마도 각종 encorder의 파라미터를 공부하는 자신을 발견하게 될 것이다. $ DEVICE=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor $ parec -d ${DEVICE} | oggenc -b 192 --raw - -o temp.ogg $ parec -d ${DEVICE} | lame -r -q 3 --lowpass 17 --abr 192 - temp.mp3 $ pared -d ${DEVICE} | sox -t raw -r 44100 -L -e signed-integer -S -b 16 -c 2 - "output.wav" # parec 명령어는 파일 포맷을 지정하여 직접 오디오 파일로 기록할 수도 있다. $ parec -d ${DEVICE} --file-format=wav output.wav $ parec -d ${DEVICE} -v --file-format=wav output.wav 샘플 사양 '녹음', 채널 맵 's16le 2ch 44100Hz'으로 front-left,front-right 스트림을 엽니다. 연결되었습니다. 스트림이 성공적으로 생성되었습니다. 버퍼 지표: maxlength=4194304, fragsize=352800 샘플 사양 's16le 2ch 44100Hz', 채널 맵 'front-left,front-right' 사용. 장치 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor에 연결되었습니다(색인: 0, 정지됨: no). 시간: 6.870 sec; 지연: -24419 usec. parec은 [[http://www.mega-nerd.com/libsndfile/|libsndfile]]이 지원하는 모든 파일 포맷을 인식한다. libsndfile 패키지에 포함된 프로그램들(sndfile-*)에는 쓸만 한 것들이 제법 있어 보인다. ==== JACK 실행 중에도 parec으로 녹음을 할 수 있다 ==== JACK을 실행한 상태에서 'parec -d ' + tab을 눌러 보자. $ parec -d alsa_input.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo.monitor jack_in jack_out jack_out.monitor jack_out.monitor를 선택하여 애플리케이션 재생음을 녹음하면 된다. $ parec -d jack_out.monitor | twolame -r - out.mp3 JACK 실행 중에는 'parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor'로 녹음을 하여 MP3 파일을 만들었더니 재생이 안 되는 현상을 발견하였다. 이에 대해서는 좀 더 알아보도록 하자. ==== pacat은 무엇에 쓸까? ==== WAV 파일은 'pacat file.wav' 명령을 이용하여 재생할 수 있다. MP3 파일이라면 디코더가 필요할 것이다. 그러나 mpg123이나 play(+libsox-fmt-mp3 or libsox-fmt-all)와 같은 훌륭한 MP3 재생기가 있으므로 디코더를 병용해야 하는 pacat을 써야 할 이유가 별로 없다. ===== 참고 자료 ===== * [[https://wiki.archlinux.org/index.php/PulseAudio|PulseAudio - ArchWiki]] * [[https://gavv.github.io/articles/pulseaudio-under-the-hood/|Victor Gaydov - PulseAudio under the hood]] * [[https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/|PulseAudio user documentation]] * [[https://brokkr.net/2018/05/24/down-the-drain-the-elusive-default-pulseaudio-sink/|Down the drain: The elusive ‘default’ PulseAudio sink]]