1. 程式人生 > >ALSA安裝程式設計指南

ALSA安裝程式設計指南



ALSA全指南

一、什麼是ALSA

ALSAAdvanced Linux Sound Architecture,高階Linux聲音架構的簡稱,它在Linux作業系統上提供了音訊和MIDIMusicalInstrument Digital Interface,音樂裝置數字化介面)的支援。在2.6系列核心中,ALSA已經成為預設的聲音子系統,用來替換2.4系列核心中的OSSOpen Sound System,開放聲音系統)。

GNU/Linux系統下三大主流音效卡驅動程式集:OSS/Lite(也成OSS/free)OSS/full(商業軟體)ALSA(自由軟體)。

二、歷史

ALSA

專案發起的起因是Linux下的音效卡驅動(OSS/Free drivers)沒有得到積極的維護。並且落後於新的音效卡技術。Jaroslav Kysela早先寫了一個音效卡驅動,並由此開始了ALSA專案,隨便,更多的開發者加入到開發隊伍中,更多的音效卡得到支援,API的結構也得到了重組。

Linux核心2.5在開發過程中,ALSA被合併到了官方的原始碼樹中。在釋出核心2.6後,ALSA已經內建在穩定的核心版本中並將廣泛地使用。

在核心裝置驅動層,ALSA提供了alsa-driver,同時在應用層,ALSA為我們提供了alsa-lib,應用程式只要呼叫alsa-lib提供的API,即可以完成對底層音訊硬體的控制。

三、硬體基礎

通常常見的音效卡都可以抽象出幾個部分

  • 輸入裝置:比如麥克風(模擬/電子),從其他音響裝置結果來的LINE IN

  • ADC:模擬訊號到數字訊號轉換器;音效卡可以處理的訊號是數字訊號,當有輸入進入音效卡時,輸入通常是模擬訊號,比如傳統的麥克風給出的訊號就是模擬訊號,這是就需要ADC將模擬訊號轉換成聲音訊號;

  • 訊號處理和控制核心:這部分是音效卡的核心,一般由一個或者多個codec實現;

  • DAC:數字訊號到模擬訊號的轉換器;它的功能就是將處理好的數字訊號轉化成模擬訊號;

  • MIXER:俗稱混音器;這個裝置主要的功能是將不同輸入來源的聲音訊號混合起來並且轉發到不同的輸出裝置上去;比如,想象一下一邊聽音樂一邊音訊聊天的情景,混音器需要將從麥克風過來的語音內容和播放器傳說過來的音樂混合起來轉發到耳機上;而當耳機拔出脫離音效卡時,混音器需要將聲音訊號轉發的計算機的喇叭上去;等等;

  • 輸出裝置:喇叭,LINE OUT和麥克風都是輸出裝置;放大器也可以被看作輸出裝置,通常放大器不需要軟體控制,也就是不需要有驅動程式就可以動作;放大器的主要功能就是將聲音訊號放大,增加響度等等。

Audio Interface 

Audio Interface主要是指可以將聲音資料從計算機中傳入傳出的介面。常見的Audio InterfaceI2SAC97兩種。其中,I2S多用與嵌入式裝置上的聲音資料傳輸,而AC97介面則多見於傳統PC。這兩種介面有什麼不同呢?這裡暫且擱置不談。對聲音程式的開發者來說,跟重要的是理解Audio Inferface的概念而非細節。細節就留給硬體工程師和驅動開發者吧。

在計算機內部,聲音被表示成為位元組流(stream bit),與其他型別的資料並沒有差異。而在計算機的外部世界,通常,聲音可以被表示成為數字形式(一個或這多個位元組流)或者模擬形式(按照時間表示的電壓變化)。Audio Interface的主要任務就是將計算機內部外部世界的不同資料型別進行轉化。Audio Inferface的構成當然和它的功能有著必然的聯絡。當聲音通過Audio Inferface傳入計算機內部時,經過轉化的資料(位元組)將被暫時儲存在一個硬體上的緩衝區中,當緩衝區已滿,Audio Interface就會觸發一箇中斷,要求CPU協調將資料從緩衝區移動到適當的地方去,通常,這種資料移動都是以DMA的方式進行,而且,通常資料移動的目的地就是主存。

+---------------------------------+
|Audio+----------------+ |
Audio Signal ----|Interface-----+ HW BUFFER| |
|+----------------+ |
+---------------------------------+

將資料從計算機傳出的過程於此類似,只是方向正好相反,中斷觸發的時機也不同。Audio Interface會在硬體緩衝區被搬走後清空的情況下觸發終端,要求CPU協調傳送新的資料進入緩衝區。

從上面的描述就可以看出,Audio Interface有幾個要素需要開發者注意。

  • 資料轉換的格式;

  • 資料轉換的速率;

  • 需要多少資料/空閒空間來觸發中斷;

  • 硬體緩衝區的大小;

以上要素中,前兩個決定了聲音訊號/資料的質量,而後兩者決定了延遲。一般延遲有輸入延遲輸出延遲兩種。輸入延遲指的是資料開始傳輸進入硬體緩衝區的時刻和CPU得到完成資料移動的那個時刻之間的時間差;輸出延遲與次類似,方向相反。

四、ALSA程式的結構

ALSA程式的結構非常簡單。

open_the_device(); /* 開啟聲音輸入/輸出裝置 */
set_the_parameters_of_the_device(); /* 設定該裝置的引數,最終要的就是前文提到的四個引數 */
while(!done) {
/* one or both of these */
receive_audio_data_from_the_dev(); /* 從裝置接收資料 */
deliver_audio_data_to_the_dev(); /* 向裝置傳送資料 */
}
close_the_device(); /* 關閉聲音輸入輸出裝置 */

五、與ALSA相關的資源

ALSA專案的主頁

這裡是ALSA相關的所有內容的源頭,包括程式碼和文件,如果想要弄懂聲音如何在Linux中工作,狠狠扎進這一堆財富里面吧!

ALSA的體系結構

http://www.alsa-project.org/~tiwai/lk2k/archtect.gif

上圖之中,ControlPCM部分是理解ALSA如何工作的關鍵。

六、ALSA安裝

進行安裝:  

./configure;make;make install

安裝後ldconfig一下。安裝需要root許可權

七、使用與編譯

這一步很少有文章說,所以我也是找了好一會,才弄好的。

程式必須連結到alsalib庫,通過在編譯時需要加上-lasound選項。有些alsa庫函式使用dlopen函式以及浮點操作,所以您可能還需要加上-ldl,-lm選項。

可以採用下面的Makefile檔案編譯。(使用的時候注意makefile中命令前縮排是Tab)

CC=gcc
TARGET=test
SRC=$(wildcard *.c)
OBJECT= ${SRC:.c=.o}
INCLUDES=-I/usr/include/alsa
LDFLAGS=-lasound
all:$(TARGET)
$(OBJECT):$(SRC)

        $(CC)-c $(INCLUDES) $<
$(TARGET):$(OBJECT)

        $(CC)-o [email protected] $< $(LDFLAGS)
.PHONY:clean
clean:
        @rm-rf $(OBJECT) $(TARGET) *~

八、程式設計

這部分網上資料與ALSA專案主頁都有。

特別是A tutorial on using the ALSA Audio API裡也有很多例子