硬件概覽 ?計(jì)算機(jī)中聲卡的設(shè)計(jì)幾乎從來(lái)沒(méi)有過(guò)統(tǒng)一標(biāo)準(zhǔn),所以,聲卡的自身的設(shè)計(jì)本身是變化多端的。但是,通常常見(jiàn)的聲卡都可以抽象出幾個(gè)部分:
Audio Interface ?Audio Interface主要是指可以將聲音數(shù)據(jù)從計(jì)算機(jī)中傳入傳出的接口。常見(jiàn)的Audio Interface有I2S和AC97兩種。其中,I2S多用與嵌入式設(shè)備上的聲音數(shù)據(jù)傳輸,而AC97接口則多見(jiàn)于傳統(tǒng)PC。這兩種接口有什么不同呢?這里暫且擱置不談。對(duì)聲音程序的開(kāi)發(fā)者來(lái)說(shuō),跟重要的是理解Audio Inferface的概念而非細(xì)節(jié)。細(xì)節(jié)就留給硬件工程師和驅(qū)動(dòng)開(kāi)發(fā)者吧。 在計(jì)算機(jī)內(nèi)部,聲音被表示成為字節(jié)流(stream bit),與其他類型的數(shù)據(jù)并沒(méi)有差異。而在計(jì)算機(jī)的外部世界,通常,聲音可以被表示成為數(shù)字形式(一個(gè)或這多個(gè)字節(jié)流)或者模擬形式(按照時(shí)間表示的電壓變化)。Audio Interface的主要任務(wù)就是將計(jì)算機(jī)內(nèi)部外部世界的不同數(shù)據(jù)類型進(jìn)行轉(zhuǎn)化。Audio Inferface的構(gòu)成當(dāng)然和它的功能有著必然的聯(lián)系。當(dāng)聲音通過(guò)Audio Inferface傳入計(jì)算機(jī)內(nèi)部時(shí),經(jīng)過(guò)轉(zhuǎn)化的數(shù)據(jù)(字節(jié))將被暫時(shí)存儲(chǔ)在一個(gè)硬件上的緩沖區(qū)中,當(dāng)緩沖區(qū)已滿,Audio Interface就會(huì)觸發(fā)一個(gè)中斷,要求CPU協(xié)調(diào)將數(shù)據(jù)從緩沖區(qū)移動(dòng)到適當(dāng)?shù)牡胤饺?,通常,這種數(shù)據(jù)移動(dòng)都是以DMA的方式進(jìn)行,而且,通常數(shù)據(jù)移動(dòng)的目的地就是主存。 +---------------------------------+ |Audio +----------------+ | Audio Signal ----|Interface-----+ HW BUFFER | | | +----------------+ | +---------------------------------+ 將數(shù)據(jù)從計(jì)算機(jī)傳出的過(guò)程于此類似,只是方向正好相反,中斷觸發(fā)的時(shí)機(jī)也不同。Audio Interface會(huì)在硬件緩沖區(qū)被搬走后清空的情況下觸發(fā)終端,要求CPU協(xié)調(diào)傳送新的數(shù)據(jù)進(jìn)入緩沖區(qū)。 從上面的描述就可以看出,Audio Interface有幾個(gè)要素需要開(kāi)發(fā)者注意。
以上要素中,前兩個(gè)決定了聲音信號(hào)/數(shù)據(jù)的質(zhì)量,而后兩者決定了“延遲”。一般延遲有“輸入延遲”和“輸出延遲”兩種。輸入延遲指的是數(shù)據(jù)開(kāi)始傳輸進(jìn)入硬件緩沖區(qū)的時(shí)刻和CPU得到完成數(shù)據(jù)移動(dòng)的那個(gè)時(shí)刻之間的時(shí)間差;輸出延遲與次類似,方向相反。 ALSA是什么? ?ALSA是Advanced Linux Sound Architecture的縮寫?;卮鹜戤?。 這樣答未免太無(wú)聊了,但畢竟有了一個(gè)給傻瓜寫的教科書(shū)一樣開(kāi)頭。ALSA是為L(zhǎng)inux并且不限于Linux操作系統(tǒng)而設(shè)計(jì)的一套軟件棧,它為聲音相關(guān)的硬件提供了硬件抽象;應(yīng)用程序可以通過(guò)一個(gè)統(tǒng)一的接口操作聲卡的硬件而不需要關(guān)系具體的細(xì)節(jié); ALSA程序的結(jié)構(gòu) ?ALSA程序的結(jié)構(gòu)非常簡(jiǎn)單。 open_the_device(); /* 打開(kāi)聲音輸入/輸出設(shè)備 */ set_the_parameters_of_the_device(); /* 設(shè)置該設(shè)備的參數(shù),最終要的就是前文提到的四個(gè)參數(shù) */ while(!done) { /* one or both of these */ receive_audio_data_from_the_dev(); /* 從設(shè)備接收數(shù)據(jù) */ deliver_audio_data_to_the_dev(); /* 向設(shè)備發(fā)送數(shù)據(jù) */ } close_the_device(); /* 關(guān)閉聲音輸入輸出設(shè)備 */ 與ALSA相關(guān)的資源 ?
http://www./main/index.php/Main_Page 這里是ALSA相關(guān)的所有內(nèi)容的源頭,包括代碼和文檔,如果想要弄懂聲音如何在Linux中工作,狠狠扎進(jìn)這一堆財(cái)富里面吧!
內(nèi)核源碼中的文檔也是相當(dāng)?shù)难院?jiǎn)意賅,這里要著重推薦。其中,推于嵌入式設(shè)備或者Android開(kāi)發(fā)者來(lái)說(shuō),soc目錄中的文檔堪稱字字珠璣。ASoC主要是由Wolfson公司的開(kāi)發(fā)人員推動(dòng)和撰寫的,這幾個(gè)文檔詳細(xì)講述了如何開(kāi)發(fā)ASoC驅(qū)動(dòng)的幾乎所有內(nèi)容。 這是用doxygen從代碼注釋中產(chǎn)生的ALSA用戶空間庫(kù)文檔,相當(dāng)?shù)南鑼?shí),建議加入收藏夾中。 ALSA的體系結(jié)構(gòu) ?上圖之中,Control和PCM部分是理解ALSA如何工作的關(guān)鍵。 PCM ?PCM是最常見(jiàn)的數(shù)字音頻信號(hào)形式之一,ALSA驅(qū)動(dòng)提供了一些對(duì)PCM進(jìn)行操作和配置的接口函數(shù);雖然PCM可以廣泛用于音頻信號(hào)傳輸以外的很多應(yīng)用上,在編寫ALSA驅(qū)動(dòng)和應(yīng)用時(shí),可以簡(jiǎn)單的認(rèn)為它就是依時(shí)間軸上不斷變化的聲音的樣本; 比如,下面這個(gè)典型的聲音信號(hào), 轉(zhuǎn)化成PCM之后變成了這樣: 很顯然,PCM上聲音的質(zhì)量取決于兩個(gè)方面,
Control接口 ?Control是ALSA為用戶空間應(yīng)用程序提供的控制聲卡的頻頻路徑(輸入輸出重定向),音量大小,輸入輸出設(shè)備選擇和配置的接口。ALSA控制接口可以控制的兩類主要元素是聲音的路徑和音量的大??;其中,在嵌入式設(shè)備上,聲音的路徑控制是通過(guò)驅(qū)動(dòng)程序提供的DAPM接口實(shí)現(xiàn)的;而音量控制,是通過(guò)接口控制MIXER做到的。 ALSA用戶空間C庫(kù)概覽 ?http://www./alsa-doc/alsa-lib/index.html PCM操作相關(guān) ?http://www./alsa-doc/alsa-lib/pcm.html Audio Clips ?Audio sample rate conversion (SRC) or audio resampling is the process of changing the audio sample rate without affecting the quality. Broadcast audio infrastructure equipment typically requires 48-kHz synchronous sampling rate audio signals. However, the audio inputs to the audio equipment can be from sources with different sampling rates. For example, CD audio signals have a sampling rate of 44.1 kHz, while other audio sources have sampling rates from 32 kHz to 192 kHz. |
|