pulse audio 고생기

5422보드에서 오디오 작업을 하고 있는데 어느 순간 부터 재생음이 끊기고 겹치는 현상이 발생했다.
처음엔 안 괜찮다가, 어느 순간 부터 그랬다.
뭔가 apt-get으로 시스템 업데이트를 하면서 꼬였거나, 설정을 잘못 건들인 것으로 생각되서 문제점을 뒤졌다.
증상을 자세히 살펴보니,

$ aplay -D hw:0,0 test.wav

이렇게 명시적으로 장치를 지정하면 문제가 없는데,

$ aplay test.wav

이렇게 default 장치를 쓰면 문제가 발생했다.

차이점을 살펴보니 default 장치를 사용하게 되면, aplay가 PulseAudio PCM I/O Plugin을 이용해서 소리르 재생한다는 것을 알았다.

aplay는 alsa를 이용하는 저수준 프로그램인데 그 상위 계층인 PulseAudio에게 음악 재생을 시키다니..? 이해가 안됬지만, 뭐 편리함을 위해서 그럴수 있지…라고 결론짓고 이 부분은 그냥 패스..

문제의 핵심은 audio device -> ALSA -> PulseAudio로 넘어갔다.

PulseAudio는 디버깅 해본적이 한번도 없어서 자료를 찾아서 문제점을 파악하는 방법을 공부했다.
우선 PulseAudio는 환경설정 파일이 /etc/pulse 디렉토리에 몰려있었다.
여기서 특히 default.pa 파일은 어떤 모듈을 로딩할지에 대한 설정을 담고 있었다.
그 외에는 ~/.config/pulse 디렉토리에 안에 캐시 파일이나 개인 환경 설정이 저장된다.

여튼 PulseAudio가 밷어내는 출력 메세지를 보는 방법을 찾았는데 아래 문서에 자세하게 설명되어 있다.
https://wiki.ubuntu.com/PulseAudio/Log

$ echo autospawn = no >> ~/.config/pulse/client.conf

위 명령은 PulseAudio 서버가 자동으로 실행되는 것을 막아준다.

$ killall pulseaudio

이미 실행되고 있는 PulseAuido 서버를 다 죽인다.

LANG=C pulseaudio -vvvv –log-time=1 > ~/pulseverbose.log 2>&1

로그 기능을 활성화 해서 새롭게 PulseAudio 데몬 하나를 띄운다.

이렇게 해서 음악을 재생하면 긴 로그가 쌓이게 된다. 너무 내용도 길고 어려워서 뭔말인지 모르겠다…

그래서 실시간으로 보기 위해서 그냥 콘솔에서 직업 로그가 나오게 했다.

$ pulseaudio -vvvv –log-level=debug

이렇게 하고 다른 창에서 aplay로 음악을 재생해보니, 음이 문제가 되는 시점마다 로그에 아래 메세지가 찍힌다.

( 4.176| 0.000) I: [alsa-sink-Playback wm8960-hifi-0] alsa-sink.c: Increasing wakeup watermark to 40.00 ms

구글링을 통해서 정확한 답은 찾지 못했지만 비슷한 이슈를 하나 찾았다.
http://mailman.alsa-project.org/pipermail/alsa-devel/2015-August/097068.html

그래서 나도 /etc/pulse/default.pa 파일의 아래 라인을 수정했더니 잘 되었다!

load-module module-alsa-sink rate=44100 tsched=0

이 글은 Ubuntu 14.04 에서 테스트 되었음

PulseAudio 관련 명령어들

$ pacmd

이 문제를 조사하면서 참고한 자료들이다.
* https://wiki.ubuntu.com/PulseAudio
* https://wiki.ubuntu.com/PulseAudio/Log
* https://wiki.archlinux.org/index.php/PulseAudio/Examples

Advertisements