고급 Linux 사운드 아키텍처
ALSA (Advanced Linux Sound Architecture)는 응용 프로그램이 시스템의 실제 하드웨어와 상호 작용할 수 있는 가장 낮은 수준의 인터페이스다. 사운드 관련 하드웨어 (오디오 인터페이스, 사운드 카드 등…)에 대한 액세스를 추상화하는 드라이버로 간주 할 수 있다. 대부분의 기존 오디오 장치를 즉시 지원한다. 가장 간단한 방법으로 ALSA는 PCM (= Pulse-Coded-Modulation) 신호를 입력으로 받아 하드웨어로 직접 보낸다.
ALSA는 대부분의 DAC 칩의 한계로 인해 한 번에 하나의 채널 만 하드웨어로 전송하게 되는데 이로 인해 단일 응용 프로그램 만 ALSA에 한 번에 소리를 보낼 수 있다. 즉, 미디어 플레이어의 음악과 메신저의 알림 음을 동시에 받을 수 없다. ALSA 개발자는 이 것을 개선하기 위해 Mixer를 구현하였고 여러 가상 오디오 채널을 단일 채널로 결합 할 수 있게 한 것이 alsalib 이다.
이것이 꽤 괜찮아 보일 수 있으나 라이브러리 수준의 믹싱 방식은 데스크톱 환경에서 여전히 문제가 남아있었다. 라이브러리를 사용하면 믹싱 할 수 있지만 단일 응용 프로그램 만 오디오를 출력 할 수 있다. 그리고 정확히 이 제한은 소위 "사운드 서버"의 등장으로 이어진다.
사운드 서버의 개념
최신 데스크톱에서 발생한 가장 큰 문제는 여러 응용 프로그램이 사운드를 병렬로 출력해야 한다는 것이다. 위에서 설명한 것처럼 이것은 일반 ALSA로는 불가능했다. 그래서 사운드 서버가 등장했다. 사운드 서버는 기본적으로 컴퓨터의 백그라운드에서 지속적으로 실행되는 서비스 즉, 데몬이다.
사운드 서버는 오디오를 스피커로 출력해야 하는 모든 애플리케이션에 믹서 슬롯을 제공한다. 응용 프로그램은 다양한 프로토콜을 통해 이 사운드 서버에 연결하고 다양한 형식의 오디오를 병렬로 스트리밍 할 수 있다. 그런 다음 사운드 서버는 들어오는 모든 오디오 슬롯을 함께 믹싱하고 이를 다시 ALSA로 전달한다 (따라서 이는 마스터 채널과 비슷해짐).
마침내 다양한 소스의 오디오를 병렬로 출력 할 수 있게 되었고, 이 개념은 애플리케이션 별 볼륨 제어 및 기타 효과와 같은 다른 기능도 함께 얻을 수 있었다.
리눅스 시스템…
리눅스 배포판의 대부분이 이 계층구조를 사용하기 때문에 이것을 아는 것은 큰의미가 있다.
PulseAudio
PulseAudio는 거의 모든 Linux 배포판을 위한 사실상의 표준 사운드 서버다. PulseAudio는 거의 모든 오디오 관련 시나리오를 처리 할 수 있다. 일반적인 소스/싱크 접근 방식을 사용하여 설계를 이해하기 쉽고 또 확장 할 수 있다. 따라서 PulseAudio는 대부분의 사용자에게 가장 적합한 솔루션이 된다 (PulseAudio의 풍부한 기능은 오디오 지연 시간이 길어 지므로 지연 시간이 짧은 오디오를 요구하는 전문가에게는 적절하지 않을 수 있음).
따라서 PulseAudio에 대해 좀 더 익숙해질 필요가 있다. 위의 그림에서 PulseAudio가 사운드카드와 상호 작용할 수 있음을 알 수 있다 (여기서 Soundcard는 PC에 연결하는 방법에 관계없이 오디오를 녹음하거나 재생할 수 있는 모든 장치의 일반적인 용어다).
Bluetooth 헤드셋으로 오디오를 출력하려면?
BlueZ5-Bluetooth-Stack과 직접 상호 작용할 수있는 Bluetooth의 A2DP (Advanced Audio Distribution) 프로파일 용 PulseAudio 싱크가 있다.
HDMI를 통해 TV / 모니터로 오디오를 출력하려면?
기본 ALSA 모듈에서 지원되지 않는 경우 PulseAudio에는 다양한 그래픽 카드에 대한 싱크도 있다.
녹음 된 오디오를 별도의 시스템으로 보내려면?
PulseAudio는 뛰어난 네트워크 기능을 갖추고 있으며 RTP를 통해 다른 SoundServer로 오디오를 스트리밍 할 수 있다. RTP는 실시간 전송 프로토콜이다. IP를 통해 오디오 및 비디오 데이터를 전송하는 잘 알려진 프로토콜이다.
https://blog.rtrace.io/2019/08/11/the-linux-audio-stack-demystified/