TAG: linux, alsa, oss, pulseaudio, esd, aRts
DATE: 2013-08-13
Linux聲音系統有些混亂,它有三套音頻驅動: OSS (Open Sound System), 商業版的OSS,和ALSA (Advanced Linux Sound Architechture)。 所以底層驅動有OSS和ALSA兩套API。
一、聲卡的工作原理
音頻驅動的主要作用是驅動聲卡工作,所以也叫聲卡驅動。 聲卡的主要作用是完成數模轉換。 當電腦播放聲音時,將數字數據送到聲卡,由聲卡轉換成模擬數據給揚聲器等外放設備。 當錄音時,聲卡將從麥克風送來的模擬數據采樣成數字數據,送給計算機處理。
二、Linux音頻驅動
早期的Linux音頻驅動是OSS (Open Sound System), 但ALSA (Advanced Linux Sound Architechture)后來居上, 大有完全取代OSS的趨勢。
Linux都是通過設備文件訪問外部設備, ALSA和OSS有不同的設備文件。
+----------+--------------+--------------------+---------+
|設備類型 | OSS | ALSA | 備注 |
+----------+--------------+--------------------+---------+
|聲音采樣 | /dev/dsp0 | /dev/snd/pcmC0D0 | |
+----------+--------------+--------------------+---------+
| 混音器 | /dev/mixer0 | /dev/snd/mixerC0D0 | 控制音量|
+----------+--------------+--------------------+---------+
|高層音序器| /dev/music0 | N/A | MIDI支持|
+----------+--------------+--------------------+---------+
|低層音序器| /dev/midi0 | N/A | MIDI支持|
+----------+--------------+--------------------+---------+
|聲音狀態 | /dev/sndstat| N/A | |
+----------+--------------+--------------------+---------+
|控制文件 | N/A | /dev/snd/controlC0 | |
+----------+--------------+--------------------+---------+
ALSA提供了和OSS不同的API,因此如果你使用ALSA做音頻驅動, 一些通過OSS操作聲音的程序將不能正常發聲。
為了解決這一問題,ALSA提供了兼容OSS的庫, 因此,如果你使用 ALSA 驅動聲卡,也安裝了兼容OSS的庫, 那些使用OSS API的程序也能正常工作。
三、應用程序和聲卡驅動的交互方式
直接和底層聲音驅動打交道
有一些應用程序直接和最底層的聲音驅動(OSS或ALSA)打交道, 程序內部直接調用 OSS 或 ALSA 的API。
通過聲音服務器
聲音服務器介於應用程序和聲卡驅動之間。 當不同的應用調用聲音服務器的API來播放聲音時,它們把音頻數據送到服務器, 服務器將一個以上的播放請求混音后,再發送給底層的聲卡驅動(ALSA或OSS)。 由ALSA或OSS來驅動聲卡播放混音后的數據。 基於ESD開發音頻程序的好處有:(1)簡化開發。(2)即使底層驅動不支持多線程, 通過聲音服務器也能實現多個應用程序同時發聲。(3)有更好的音效。
- ESD
ESD 一直是 Gnome 桌面環境的聲音服務器, Gnome 應用多是通過 ESD 處理聲音的。 - aRts
和 ESD 對應,aRts 是 KDE 桌面環境的聲音服務器, 底層通過 ALSA 驅動聲卡。KDE 應用多通過 aRts 處理聲音。 - PulseAudio
PulseAudio是新一代聲音服務器,能提供更好的音效, 已經有越來越多的應用通過PulseAudio處理聲音。 為了讓使用ESD的程序能繼續在PulseAudio 上工作, PulseAudio 提供了 ESD 的兼容層。 Gnome 未來將采用PulseAudio取代ESD。
通過其它庫
除了聲音服務器,為了簡化開發,還出現了其它的一些聲音庫。 這些聲音庫有的和聲音服務器打交道,有的直接和最底層的聲音驅動(OSS或ALSA)打交道。 比如游戲程序使用的SDL庫,就是直接和聲音驅動打交道。
四、總結
Linux從應用程序到聲音驅動的結構如下圖所示。
+-------+ +------+ +-----+ +-----+ +----+
| Apps | | Apps | |Apps | |Apps | |Apps|
+---+---+ +---+--+ +--+--+ +--+--+ +-+--+
| | | | |
+---+---+ +---+------+ +-+--+ +--+--+ |
| ESD | |PulseAudio| |aRts| |Other| |
| Gnome | |ESD compat| |KDE | | SDL | |
+---+---+ +----+-----+ +-+--+ +--+--+ |
| | | | |
+---+-----------+----------+--------+------+---+
| ALSA (Advanced Linux Sound Architechture) |
| OSS (Open Sound System) |
+----------------------------------------------+