펄스오디오
1. 개요
펄스오디오(PulseAudio)는 하나 이상의 소스에서 사운드 입력을 받아 하나 이상의 싱크로 전달하는 사운드 서버 역할을 하는 백그라운드 프로세스이다. 모든 사운드 스트림을 펄스오디오를 통해 라우팅하여 하드웨어에 직접 접근하려는 프로세스를 포함한 모든 소리가 펄스오디오를 거치도록 하는 것을 목표로 한다. 펄스오디오는 ALSA와 같은 다른 오디오 시스템을 사용하는 응용 프로그램에 어댑터를 제공하며, 리눅스, 윈도우, 다양한 모바일 장치에서 지원된다. 펄스오디오는 응용 프로그램별 볼륨 조절, 플러그인 아키텍처, 여러 오디오 소스 및 싱크 지원 등 다양한 기능을 제공한다.
| 종류 | 사운드 서버 |
|---|---|
| 개발자 | 레나트 포터링, 피에르 오스만, 샤흠스 E. 킹, 타누 카스키넨, 콜린 거스리, 아룬 라가반, 데이비드 헤닝손 |
| 최초 릴리스 | 2004년 7월 17일 |
| 최신 버전 | 17.0 |
| 최신 릴리스 날짜 | 2024년 1월 12일 |
| 저장소 | https://gitlab.freedesktop.org/pulseaudio/pulseaudio |
| 프로그래밍 언어 | C |
| 지원 운영 체제 | FreeBSD, NetBSD, OpenBSD, 리눅스, Illumos, 솔라리스, macOS, 마이크로소프트 윈도우 (유지 관리되지 않음) |
| 지원 플랫폼 | ARM, PowerPC, x86 / IA-32, x86-64, MIPS |
| 라이선스 | LGPL-2.1-or-later |
| 웹사이트 | https://www.freedesktop.org/wiki/Software/PulseAudio/ |
| 지원 오디오 형식 | https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/SupportedAudioFormats/ |
|---|
-
오디오 라이브러리 -
ASIO
ASIO는 독일 스타인버그에서 개발한 오디오 입출력 API 규격으로, 낮은 지연 시간과 멀티 채널 I/O를 지원하며 윈도우 운영체제에서 주로 사용된다. -
오디오 라이브러리 -
FFmpeg
FFmpeg은 오디오 및 비디오 데이터를 다루는 자유 소프트웨어 프로젝트로, 다양한 코덱과 형식을 지원하며 멀티미디어 응용 프로그램에 활용되고 2011년 Libav로 포크되기도 했으나 통합 과정을 거쳤다. -
LGPL 라이선스 소프트웨어 -
Qt (소프트웨어)
Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다. -
LGPL 라이선스 소프트웨어 -
GTK
GTK는 GIMP를 위해 개발된 크로스 플랫폼 GUI 툴킷으로, 다양한 운영체제와 프로그래밍 언어를 지원하며 여러 데스크톱 환경 및 애플리케이션에서 활용된다. -
C로 작성된 자유 소프트웨어 -
PostgreSQL
PostgreSQL은 캘리포니아 대학교 버클리 분교의 Ingres 프로젝트에서 시작되어 전 세계 개발자들의 협력을 통해 발전해온 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이다. -
C로 작성된 자유 소프트웨어 -
김프
김프(GIMP)는 GNU 프로젝트에서 개발된 크로스 플랫폼 기반의 무료 오픈소스 래스터 그래픽 편집기로, 다양한 운영체제를 지원하며 풍부한 기능을 제공하지만 사용자 인터페이스에 대한 비판과 일부 기능의 부족함에 대한 평가도 존재한다.
2. 소프트웨어 구조
펄스오디오는 사운드 서버 역할을 하며, 백그라운드 프로세스를 통해 여러 소스(프로세스, 캡처 장치 등)로부터 소리 입력을 받아 여러 싱크(사운드 카드, 원격 네트워크 펄스오디오 서버, 다른 프로세스)로 전달한다.
펄스오디오의 주요 목표 중 하나는 하드웨어에 직접 접근하는 프로세스(예: 레거시 오픈 사운드 시스템 애플리케이션)를 포함한 모든 소리 스트림이 펄스오디오를 거치도록 하는 것이다. 이를 위해 펄스오디오는 aRts, 인라이튼드 사운드 데몬 등 다른 오디오 시스템을 사용하는 애플리케이션에 어댑터를 제공한다.
일반적인 리눅스 설치 환경에서 사용자는 ALSA가 펄스오디오에서 제공하는 가상 장치를 사용하도록 설정한다. 따라서 ALSA를 사용하는 애플리케이션은 펄스오디오로 사운드를 출력하고, 펄스오디오는 다시 ALSA를 통해 실제 사운드 카드에 접근한다. 또한 펄스오디오는 자체 네이티브 인터페이스와 ESD 애플리케이션을 위한 레거시 인터페이스를 제공하여 ESD를 대체할 수 있다.
OSS 애플리케이션을 위해 펄스오디오는 `padsp` 유틸리티를 제공한다. 이 유틸리티는 `/dev/dsp`와 같은 장치 파일을 대체하여 애플리케이션이 사운드 카드를 독점적으로 제어한다고 착각하게 만든다. 실제로는 애플리케이션의 출력이 펄스오디오를 통해 전달된다.
2.1. libcanberra
libcanberra는 데스크톱 이벤트 소리를 위한 추상 API로서, "펄스오디오 샘플 캐시 API"를 완전히 대체한다.
* https://www.freedesktop.org/wiki/Specifications/sound-theme-spec/ XDG 사운드 테마 및 명명 사양을 준수한다.
* 이벤트 소리를 재생하기 위한 단순 추상 인터페이스를 정의한다.
* libasound를 통해 ALSA와 통신한다.
* 펄스오디오의 백엔드를 포함한다.
2.2. libSydney
libSydney는 펄스오디오 스트리밍 API를 완전히 대체하며, 궁극적으로 펄스오디오에서 사용되는 유일한 오디오 API가 되도록 계획되어 있다.
3. 주요 기능
* 응용 프로그램별 볼륨 조절
* 로드 가능한 모듈을 지원하는 확장 가능한 플러그인 아키텍처
* 많은 인기 있는 오디오 응용 프로그램과의 호환성
* 여러 오디오 소스 및 싱크 지원
* 프로세서 리소스 효율성을 위한 제로 카피 메모리 아키텍처
* 로컬 네트워크에서 펄스오디오를 사용하는 다른 컴퓨터를 검색하여 스피커를 통해 직접 소리를 재생하는 기능
* 소리가 재생되는 동안 응용 프로그램에서 소리를 재생하는 데 사용하는 출력 장치를 변경하는 기능 (응용 프로그램이 이를 지원할 필요는 없으며 펄스오디오는 응용 프로그램에서 해당 사항을 감지하지 못하게 하면서 이를 수행할 수 있음)
* 스크립팅 기능을 갖춘 명령줄 인터페이스
* 명령줄 재구성 기능이 있는 사운드 데몬
* 내장 샘플 변환 및 재샘플링 기능
* 여러 개의 사운드 카드를 하나로 결합하는 기능
* 여러 재생 스트림을 동기화하는 기능
* 동적 감지 기능을 갖춘 블루투스 오디오 장치 지원
* 시스템 전체의 이퀄라이제이션을 활성화하는 기능
* 지연량 측정 지원
4. 애플리케이션과의 관계
펄스오디오는 백그라운드에서 동작하는 사운드 서버로, 하나 이상의 소스(프로세스나 캡처 장치)로부터 소리 입력을 받아 하나 이상의 싱크(사운드 카드, 원격 네트워크 펄스오디오 서버, 기타 프로세스)로 소리 데이터를 전달한다.
펄스오디오의 목표 중 하나는 OSS 응용 프로그램들처럼 하드웨어에 직접 접근하는 프로세스들을 포함하여 모든 소리가 펄스오디오를 경유하도록 하는 것이다. 펄스오디오는 aRts, ESD와 같은 다른 오디오 시스템을 사용하는 응용 프로그램들에 어댑터를 제공함으로써 이를 수행한다.
리눅스 환경에서는 일반적으로 펄스오디오가 제공하는 가상 장치를 ALSA가 사용하도록 설정한다. ALSA를 사용하는 애플리케이션은 펄스오디오로 데이터를 보내게 되고, 펄스오디오는 ALSA를 사용하여 사운드 카드에 데이터가 전송된다. 펄스오디오를 직접 지원하려는 애플리케이션에 대해서는, ESD 애플리케이션용 구식 인터페이스뿐만 아니라, ESD를 대체하는 네이티브 인터페이스도 제공한다.
OSS 애플리케이션에 대해서는 `padsp` 유틸리티를 제공한다. 이를 통해 `/dev/dsp` 등의 장치를 대체하여, 애플리케이션은 마치 독점적으로 사운드 카드를 제어하는 것처럼 보이지만, 실제 출력은 펄스오디오를 통해 이루어진다.
5. 운영체제 지원
펄스오디오는 다양한 운영체제에서 사용할 수 있다. 페도라 리눅스를 시작으로 우분투, 데비안, 만드리바 리눅스, openSUSE 등 주요 리눅스 배포판에서 널리 채택되었다. GNOME, KDE 데스크톱 환경과 OpenIndiana, MATE에서도 지원된다. 노키아 N900, 노키아 N9, 팜 프리와 같은 리눅스 기반 모바일 장치와 타이젠 운영체제에서도 사용된다.
5.1. 리눅스
펄스오디오는 버전 8부터 페도라 리눅스에서 일반 사용자를 위해 처음 등장했으며, 이후 우분투, 데비안, 만드리바 리눅스, openSUSE와 같은 주요 리눅스 배포판에서 채택되었다. GNOME 프로젝트와 KDE에서도 펄스오디오를 지원하며, Plasma Workspaces에 통합되어 Phonon (KDE 멀티미디어 프레임워크) 및 KMix (통합 믹서 애플리케이션)에 대한 지원을 추가하고, 멀티 채널 스피커 구성을 돕는 "스피커 설정" GUI도 제공한다. 펄스오디오는 또한 Illumos 배포판인 OpenIndiana에서도 사용할 수 있으며, MATE 데스크톱 환경에서 기본적으로 활성화되어 있다.
노키아 N900, 노키아 N9, 팜 프리를 포함한 다양한 리눅스 기반 모바일 장치에서도 펄스오디오를 사용한다.
리눅스 재단의 프로젝트이며 인텔과 삼성전자로 구성된 기술 운영 그룹(TSG)이 관리하는 오픈 소스 모바일 운영 체제인 타이젠도 펄스오디오를 사용한다.
PulseAudio는 백그라운드에서 동작하는 사운드 서버로, 하나 또는 여러 개의 음성 입력 (프로세스 또는 녹음 장치 등)으로부터 데이터를 받아 하나 또는 여러 개의 음성 출력 (사운드 카드 또는 네트워크상의 PulseAudio 서버, 다른 프로세스 등)으로 보낸다.
PulseAudio의 목표 중 하나는, 구식 OSS를 사용하는 애플리케이션 등처럼 하드웨어에 직접 접근하는 대신, 모든 음성 스트림을 PulseAudio를 통해 처리하도록 하는 것이다. 그 때문에, aRts나 ESD 등 다른 오디오 시스템을 사용하는 애플리케이션에 어댑터를 제공한다.
리눅스 환경에서는 일반적으로 PulseAudio가 제공하는 가상 장치를 ALSA가 사용하도록 설정한다. 이렇게 하면 ALSA를 사용하는 애플리케이션은 PulseAudio로 데이터를 보내게 되고, PulseAudio에서는 ALSA를 사용하여 사운드 카드에 데이터가 전송된다. 또한, PulseAudio를 직접 지원하려는 애플리케이션에 대해서는, ESD 애플리케이션용 구식 인터페이스뿐만 아니라, ESD를 대체하는 위치에 있는 네이티브 인터페이스도 제공한다.
OSS 애플리케이션에 대해서는 padsp 유틸리티를 제공한다. 이를 통해 /dev/dsp 등의 장치를 대체한 경우, 애플리케이션 측에서는 독점적으로 사운드 카드를 제어하는 것처럼 보이지만, 실제 출력은 PulseAudio를 통해 이루어진다.
5.2. 윈도우
마이크로소프트 윈도우에서 펄스오디오는 윈도우 하위 시스템 for Linux에서 실행된다.
과거에는 NT 커널이 MinGW ( GCC 및 binutils와 같은 다양한 도구를 포함하는 GNU 툴체인의 구현)를 통해 지원되었다. 그러나 NT 커널 포트는 2011년 이후 업데이트되지 않았다.
5.3. 기타
펄스오디오는 버전 8부터 페도라 리눅스에서 일반 사용자를 위해 처음 등장했으며, 이후 우분투, 데비안, 만드리바 리눅스, openSUSE와 같은 주요 리눅스 배포판에서 채택되었다. GNOME 프로젝트와 KDE에서도 펄스오디오를 지원하며, Plasma Workspaces에 통합되어 Phonon (KDE 멀티미디어 프레임워크) 및 KMix (통합 믹서 애플리케이션)에 대한 지원을 추가하고, 멀티 채널 스피커 구성을 돕는 "스피커 설정" GUI도 제공한다. 펄스오디오는 또한 Illumos 배포판인 OpenIndiana에서도 사용할 수 있으며, MATE 데스크톱 환경에서 기본적으로 활성화되어 있다.
노키아 N900, 노키아 N9, 팜 프리를 포함한 다양한 리눅스 기반 모바일 장치에서도 펄스오디오를 사용한다.
리눅스 재단의 프로젝트이며 인텔과 삼성전자로 구성된 기술 운영 그룹(TSG)이 관리하는 오픈 소스 모바일 운영 체제인 타이젠도 펄스오디오를 사용한다.
6. 도입 과정의 문제점
PortAudio API는 펄스오디오의 설계와 호환되지 않아 수정이 필요했다. OSS를 사용하는 거의 모든 패키지와 ALSA를 사용하는 많은 패키지가 펄스오디오를 지원하도록 수정해야 했다. 글리치 없는 오디오 기능의 추가 개발에는 펄스오디오 코어의 완전한 재작성이 필요했으며, ALSA API 및 내부 구조 변경도 필요했다.
배포판에서 처음 채택되었을 때, 펄스오디오 개발자 레나트 포테링(systemd의 제작자)은 이를 "현재 오디오를 망치는 소프트웨어"라고 묘사했다. 포테링은 나중에 "우분투가 펄스오디오를 채택하는 데 훌륭한 일을 하지 못했다. 그들은 숙제를 제대로 하지 않았다"고 주장했다. 이는 우분투 "Hardy Heron" (8.04)에서 발생한 문제였으며, 이후 우분투 릴리스에서 개선되었다. 그러나 2009년 10월, 포테링은 여전히 우분투의 펄스오디오 통합에 만족하지 않는다고 보고했다.
어도비 플래시와 같은 특정 프로그램은 펄스오디오에서 불안정성을 유발했다. 새로운 플래시 플러그인 구현은 충돌하는 요소를 필요로 하지 않으며, 그 결과 플래시와 펄스오디오는 현재 호환된다.
이전 버전의 펄스오디오는 버퍼 오버/언더런을 잘못 처리하여 처리된 오디오를 왜곡하기 시작하는 경우가 있었다.
헤드폰 사용자의 경우, 잘못 작동하는 응용 프로그램으로 인해 매우 큰 볼륨으로 인해 소음성 난청이 발생할 가능성이 있다.
7. 관련 소프트웨어
libcanberra는 데스크톱 이벤트 소리를 위한 추상화 API로서, "펄스오디오 샘플 캐시 API"를 완전히 대체한다. https://www.freedesktop.org/wiki/Specifications/sound-theme-spec/ XDG Sound Theme and Naming Specifications와 함께 컴파일되며, 이벤트 소리 재생을 위한 단순 추상화 인터페이스를 정의한다. libasound를 통해 ALSA와 통신하며, 펄스오디오의 백엔드를 포함한다.
libsydney는 "펄스오디오 스트리밍 API"를 완전히 대체한다.
리눅스 환경에서 펄스오디오와 함께 사용되거나 펄스오디오를 대체하는 주요 소프트웨어는 다음과 같다.
* [[ALSA]]: 펄스오디오는 ALSA를 사용하여 사운드 카드에 데이터를 전송한다. ALSA를 사용하는 애플리케이션은 펄스오디오가 제공하는 가상 장치를 통해 펄스오디오로 데이터를 보낸다.
* [[오픈 사운드 시스템|OSS]]: 구식 OSS 애플리케이션을 위해 펄스오디오는 `padsp` 유틸리티를 제공한다. 이 유틸리티는 `/dev/dsp` 장치를 대체하여, 애플리케이션이 사운드 카드를 독점 제어하는 것처럼 보이게 하지만, 실제 출력은 펄스오디오를 통해 이루어진다.
* [[Enlightened Sound Daemon|ESD]]: 펄스오디오는 ESD를 대체하는 네이티브 인터페이스와 ESD 애플리케이션용 구식 인터페이스를 제공한다.
* [[aRts]]: 펄스오디오는 aRts를 사용하는 애플리케이션에 어댑터를 제공한다.
7.1. 사운드 서버
펄스오디오는 하나 이상의 소스(프로세스나 캡처 장치)로부터 소리 입력을 받아들이고 하나 이상의 싱크(사운드 카드, 원격 네트워크 펄스오디오 서버, 기타 프로세스)로 넘겨주는 백그라운드 프로세스인 사운드 서버이다.
펄스오디오의 목표 가운데 하나는 (레거시 OSS 응용 프로그램들처럼) 하드웨어에 직접 접근하려는 프로세스들을 포함하여 모든 소리가 펄스오디오를 경유하는 것이다. 펄스오디오는 aRts, ESD와 같은 다른 오디오 시스템을 사용하는 응용 프로그램들에 어댑터를 제공함으로써 이를 수행한다.
펄스오디오는 백그라운드에서 동작하는 사운드 서버로, 하나 또는 여러 개의 음성 입력 (프로세스 또는 녹음 장치 등)으로부터 데이터를 받아 하나 또는 여러 개의 음성 출력 (사운드 카드 또는 네트워크상의 펄스오디오 서버, 다른 프로세스 등)으로 보낸다.
펄스오디오의 목표 중 하나는, 구식 OSS를 사용하는 애플리케이션 등처럼 하드웨어에 직접 접근하는 대신, 모든 음성 스트림을 펄스오디오를 통해 처리하도록 하는 것이다. 그 때문에, aRts나 ESD 등 다른 오디오 시스템을 사용하는 애플리케이션에 어댑터를 제공한다.
리눅스 환경에서는 일반적으로 펄스오디오가 제공하는 가상 장치를 ALSA가 사용하도록 설정한다. 이렇게 하면 ALSA를 사용하는 애플리케이션은 펄스오디오로 데이터를 보내게 되고, 펄스오디오에서는 ALSA를 사용하여 사운드 카드에 데이터가 전송된다. 또한, 펄스오디오를 직접 지원하려는 애플리케이션에 대해서는, ESD 애플리케이션용 구식 인터페이스뿐만 아니라, ESD를 대체하는 위치에 있는 네이티브 인터페이스도 제공한다.
OSS 애플리케이션에 대해서는 `padsp` 유틸리티를 제공한다. 이를 통해 `/dev/dsp` 등의 장치를 대체한 경우, 애플리케이션 측에서는 독점적으로 사운드 카드를 제어하는 것처럼 보이지만, 실제 출력은 펄스오디오를 통해 이루어진다.
7.2. 오디오 인프라
펄스오디오는 하나 이상의 소스(프로세스나 캡처 장치)로부터 소리 입력을 받아들이고 하나 이상의 싱크(사운드 카드, 원격 네트워크 펄스오디오 서버, 기타 프로세스)로 넘겨주는 백그라운드 프로세스인 사운드 서버를 실행한다.
펄스오디오의 목표 가운데 하나는 (레거시 OSS 응용 프로그램처럼) 하드웨어에 직접 접근하려는 프로세스를 포함하여 모든 소리가 펄스오디오를 경유하는 것이다. 펄스오디오는 aRts, ESD와 같은 다른 오디오 시스템을 사용하는 응용 프로그램에 어댑터를 제공함으로써 이를 수행한다.
광범위하게 말해 어드밴스드 리눅스 사운드 아키텍처는 사운드 하드웨어 드라이버를 제공하는 커널 서브시스템이고, 펄스오디오는 애플리케이션과 ALSA 간의 인터페이스 엔진이다. 하지만 사용이 필수는 아니며, 펄스오디오 없이도 오디오를 재생하고 함께 믹싱할 수 있다.
펄스오디오는 사운드 서버 역할을 하며, 하나 이상의 소스(프로세스, 캡처 장치 등)로부터 사운드 입력을 받아들이는 백그라운드 프로세스가 생성된다. 그런 다음 백그라운드 프로세스는 이러한 사운드 소스를 하나 이상의 싱크(사운드 카드, 원격 네트워크 펄스오디오 서버 또는 다른 프로세스)로 리디렉션한다.
리눅스에서 일반적인 설치 시나리오에서 사용자는 펄스오디오에서 제공하는 가상 장치를 사용하도록 ALSA를 구성한다. 따라서 ALSA를 사용하는 애플리케이션은 펄스오디오로 사운드를 출력하고, 펄스오디오는 자체적으로 ALSA를 사용하여 실제 사운드 카드에 접근한다. 펄스오디오는 또한 펄스오디오를 직접 지원하려는 애플리케이션을 위한 고유한 네이티브 인터페이스와 ESD 애플리케이션을 위한 레거시 인터페이스를 제공하여 ESD를 대체하는 데 적합하게 만든다.
OSS 애플리케이션의 경우 펄스오디오는 `padsp` 유틸리티를 제공하며, 이 유틸리티는 `/dev/dsp`와 같은 장치 파일을 대체하여 애플리케이션이 사운드 카드를 독점적으로 제어할 수 있다고 믿도록 속인다. 실제로는 해당 출력이 펄스오디오를 통해 리디렉션된다.
과거 JACK과 펄스오디오 이전에는, 이러한 시스템에서 소리는 다목적 통합 오디오 솔루션에 의해 관리되었다. 이러한 솔루션은 믹싱 및 사운드 스트리밍 프로세스를 완전히 다루지는 않지만, JACK과 펄스오디오에서 최종 오디오 스트림을 사운드 카드로 전송하기 위해 여전히 사용된다.
* ALSA는 dmix라는 소프트웨어 믹서를 제공하며, 이는 펄스오디오 이전에 개발되었다. 이는 거의 모든 리눅스 배포판에서 사용할 수 있으며, 더 간단한 PCM 오디오 믹싱 솔루션이다. 펄스오디오의 고급 기능(타이머 기반 스케줄링 및 네트워크 오디오 등)을 제공하지는 않는다. 반면 ALSA는, 해당하는 사운드 카드 및 소프트웨어와 결합하면 낮은 지연 시간을 제공한다.
* OSS는 리눅스 및 기타 유닉스 운영 체제에서 사용되던 최초의 사운드 시스템이었지만, 리눅스 커널 2.5 이후 더 이상 사용되지 않았다. 독점적인 개발은 4Front Technologies에 의해 계속되었으며, 2007년 7월 CDDL-1.0 하에 OpenSolaris용 OSS 소스 코드를, 그리고 GPL-2.0-only 하에 리눅스용 OSS 소스 코드를 공개했다. 현대적인 구현인 Open Sound System v4는 응용 프로그램별 소프트웨어 믹싱, 리샘플링 및 볼륨 변경을 제공한다. 펄스오디오와 달리, 이러한 기능은 커널 내에서 구현된다. OpenIndiana 및 기타 illumos 배포판에서 펄스오디오 지원은 커널 내 OSS 구현("Boomer")에 의존한다.