ALSA庫

一.聲音參數(shù)基本概念:

聲音是連續(xù)模擬量参滴,計(jì)算機(jī)將它離散化之后用數(shù)字表示匈仗,就有了以下幾個(gè)名詞術(shù)語算利。

樣本長度(sample)樣本是記錄音頻數(shù)據(jù)最基本的單位污筷,計(jì)算機(jī)對(duì)每個(gè)通道采樣量化時(shí)數(shù)字比特位數(shù),常見的有8位和16位桥氏。

通道數(shù)(channel)該參數(shù)為1表示單聲道折联,2則是立體聲。

(frame)幀記錄了一個(gè)聲音單元识颊,其長度為樣本長度與通道數(shù)的乘積诚镰,一段音頻數(shù)據(jù)就是由苦干幀組成的。

采樣率(rate)每秒鐘采樣次數(shù)祥款,該次數(shù)是針對(duì)幀而言清笨,常用的采樣率如8KHz的人聲,44.1KHz的mp3音樂, 96Khz的藍(lán)光音頻刃跛。

周期(period)音頻設(shè)備一次處理所需要的楨數(shù)抠艾,對(duì)于音頻設(shè)備的數(shù)據(jù)訪問以及音頻數(shù)據(jù)的存儲(chǔ),都是以此為單位桨昙。

交錯(cuò)模式(interleaved)是一種音頻數(shù)據(jù)的記錄方式

在交錯(cuò)模式下检号,數(shù)據(jù)以連續(xù)楨的形式存放,即首先記錄完楨1的左聲道樣本和右聲道樣本(假設(shè)為立體聲格式)蛙酪,再開始楨2的記錄齐苛。

而在非交錯(cuò)模式下,首先記錄的是一個(gè)周期內(nèi)所有楨的左聲道樣本桂塞,再記錄右聲道樣本凹蜂,數(shù)據(jù)是以連續(xù)通道的方式存儲(chǔ)。

不過多數(shù)情況下阁危,我們只需要使用交錯(cuò)模式就可以了玛痊。

period(周期):硬件中中斷間的間隔時(shí)間。它表示輸入延時(shí)狂打。

比特率(Bits

Per Second):比特率表示每秒的比特?cái)?shù)擂煞,比特率=采樣率×通道數(shù)×樣本長度

二.ALSA介紹

1.ALSA簡介

ALSA表示高級(jí)Linux聲音體系結(jié)構(gòu)(Advanced Linux Sound Architecture)。ALSA是一個(gè)完全開放源代碼的音頻驅(qū)動(dòng)程序集趴乡,除了像OSS那樣提供了一組內(nèi)核驅(qū)動(dòng)程序模塊之外对省,ALSA還專門為簡化應(yīng)用程序的編寫提供了相應(yīng)的函數(shù)庫,與OSS提供的基于ioctl的原始編程接口相比浙宜,ALSA函數(shù)庫使用起來要更加方便一些官辽。利用該函數(shù)庫,開發(fā)人員可以方便快捷的開發(fā)出自己的應(yīng)用程序粟瞬,細(xì)節(jié)則留給函數(shù)庫內(nèi)部處理。當(dāng)然ALSA也提供了類似于OSS的系統(tǒng)接口萤捆,不過ALSA的開發(fā)者建議應(yīng)用程序開發(fā)者使用音頻函數(shù)庫而不是驅(qū)動(dòng)程序的API裙品。

2.ALSA版本支持

Linux內(nèi)核2.5在開發(fā)過程中俗批,ALSA被合并到了官方的源碼樹中。在發(fā)布內(nèi)核2.6后市怎,ALSA已經(jīng)內(nèi)建在穩(wěn)定的內(nèi)核版本中并將廣泛地使用岁忘。在內(nèi)核設(shè)備驅(qū)動(dòng)層,ALSA提供了alsa-driver区匠,同時(shí)在應(yīng)用層干像,ALSA為我們提供了alsa-lib,應(yīng)用程序只要調(diào)用alsa-lib提供的API驰弄,即可以完成對(duì)底層音頻硬件的控制麻汰。

3.ALSA基礎(chǔ)

ALSA由許多聲卡的聲卡驅(qū)動(dòng)程序組成,同時(shí)它也提供一個(gè)稱為libasound的API庫戚篙。應(yīng)用程序開發(fā)者應(yīng)該使用libasound而不是內(nèi)核中的ALSA接口五鲫。因?yàn)閘ibasound提供最高級(jí)并且編程方便的編程接口。并且提供一個(gè)設(shè)備邏輯命名功能岔擂,這樣開發(fā)者甚至不需要知道類似設(shè)備文件這樣的低層接口位喂。

用戶空間的alsa-lib對(duì)應(yīng)用程序提供統(tǒng)一的API接口,這樣可以隱藏了驅(qū)動(dòng)層的實(shí)現(xiàn)細(xì)節(jié)乱灵,簡化了應(yīng)用程序的實(shí)現(xiàn)難度塑崖。內(nèi)核空間中,alsa-soc其實(shí)是對(duì)alsa-driver的進(jìn)一步封裝痛倚,他針對(duì)嵌入式設(shè)備提供了一些列增強(qiáng)的功能弃舒。

4.ALSA體系結(jié)構(gòu):

ALSA API可以分解成以下幾個(gè)主要的接口:

1控制接口:提供管理聲卡注冊(cè)和請(qǐng)求可用設(shè)備的通用功能

2 PCM接口:管理數(shù)字音頻回放(playback)和錄音(capture)的接口。它是開發(fā)數(shù)字音頻程序最常用到的接口状原。

3 Raw MIDI接口:支持MIDI(Musical Instrument Digital Interface),標(biāo)準(zhǔn)的電子樂器聋呢。這些API提供對(duì)聲卡上MIDI總線的訪問。這個(gè)原始接口基于MIDI事件工作颠区,由程序員負(fù)責(zé)管理協(xié)議以及時(shí)間處理削锰。

4定時(shí)器(Timer)接口:為同步音頻事件提供對(duì)聲卡上時(shí)間處理硬件的訪問。

5時(shí)序器(Sequencer)接口

6混音器(Mixer)接口設(shè)備命名API庫使用邏輯設(shè)備名而不是設(shè)備文件毕莱。

5.偽代碼

一個(gè)典型的聲音程序使用PCM的程序通常類似下面的偽代碼:

1.打開回放或錄音接口

2.設(shè)置硬件參數(shù)(訪問模式器贩,數(shù)據(jù)格式,信道數(shù)朋截,采樣率蛹稍,等等)

2.while有數(shù)據(jù)要被處理:讀PCM數(shù)據(jù)(錄音)或?qū)慞CM數(shù)據(jù)(回放)

3.關(guān)閉接口

三.ALSA編譯安裝

1.ALSA相關(guān)庫下載

官方主頁http://www.alsa-project.org/

主要跟編程相關(guān)是

·alsa-lib. ALSA應(yīng)用庫(最常用)

·ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.22.tar.bz2

·alsa-driver一些常見芯片的ALSA驅(qū)動(dòng)代碼,一般內(nèi)核會(huì)集成.

·ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.22.1.tar.bz2

·alsa-firmware一些DSP或ASIC的專用的微碼(運(yùn)在芯片之上,啟動(dòng)時(shí)由LINUX裝入到硬件中).

·ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.0.20.tar.bz2

·alsa-utils一般ALSA小的測試工具.如aplay/arecord播放和錄音小程序.

·ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.22.tar.bz2

·alsa-oss用alsa接口模擬舊的oss接口.

·ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-1.0.17.tar.bz2

其中alsa-driver,alsa-firwware是內(nèi)核開發(fā)者所接觸的東西,對(duì)于已經(jīng)正常運(yùn)行硬件,通常意味著這一部分已經(jīng)整合到內(nèi)核當(dāng)中,無需修改.

而alsa-utils主要是測試一些小工具.

因此對(duì)于一個(gè)應(yīng)用程序開發(fā)者,或者嵌入式應(yīng)用開發(fā)者,接觸到主要是alsa-lib編譯出來的庫libasound.

2.ALSA驅(qū)動(dòng)測試

cat

/proc/asound/devices驅(qū)動(dòng)測試

ls -l/dev/snd設(shè)備測試

aplay –h工具alsa-utils測試

3.嵌入式linuxALSA移植

·ALSA driver移植

·ALSA lib移植.

解壓tar xvjf alsa-lib-1.0.22.tar.bz2

cd alsa-lib-1.0.22

生成Makefile

./configure --host=arm-linux? --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared?? --disable-python? --with-configdir=/usr/local/share? --with-plugindir=/usr/local/lib/alsa_lib

在這里要注意--with--configdir的選項(xiàng).它將影響include/config.h中的ALSA_CONFIG_DIR目錄.

它默認(rèn)是你的--prefix目錄.這樣在嵌入式交叉編譯將是一個(gè)桌面機(jī)的路徑,在libasoud.so運(yùn)行.會(huì)提示,如果出來這個(gè)提示,一般都是ALSA_CONFIG_DIR路徑錯(cuò)誤造成的.

ALSA? lib pcm.c:2145:(snd_pcm_open_noupdate) Unknown PCM default

aplay:? main:546:?audio open error: No such file or directory

--with-plugindir也是同樣道理了.它是設(shè)為ALSA_PLUGIN_DIR宏.

編譯make

安裝make install

開發(fā)板發(fā)布注意:

在開發(fā)板上發(fā)布alsa庫.除了libasound.so庫以外,必須還要把a(bǔ)lsa.conf發(fā)布到板上--with-configdir所指向目錄下的alsa目錄,否則還是會(huì)報(bào)"audio open error: No such file ordirectory".

這個(gè)文件可以在make install后在你安裝目錄下的share找到alsa目錄,把這個(gè)目錄整個(gè)拷貝到開發(fā)板即可.

·ALSA utils移植

解壓:tar xvjf alsa-utils-1.0.22.tar.bz2

cdalsa-utils-1.0.22

生成Makefile

./configure --host=arm-linux? --prefix=$PWD/../../output/arm-linux --enable-static? --enable-shared??? --with-configdir=/usr/local/share? --with-libiconv-prefix=$PWD/../../output/arm-linux? CFLAGS="-I$PWD/../../output/arm-linux/include"? LDFLAGS="-L$PWD/../../output/arm-linux/lib -lasound -liconv"?? --disable-alsamixer --disable-xmlto

注意這里L(fēng)DFLAGS是必須,否則會(huì)找不到libasound.另外alsamixer是一個(gè)ncurses程序,基本上在嵌入式終端上很難移植.所以這里取消掉.--disable-xmlto也是因?yàn)檎也坏綆?

編譯make

安裝make install

四.ALSA錄音demo

#include

#include

#include

main (int argc, char *argv[])

{

int i;

int err;

short buf[128];

snd_pcm_t *capture_handle; // PCM設(shè)備句柄

snd_pcm_hw_params_t *hw_params;//硬件信息和PCM流配置

//1.打開PCM,最后一個(gè)參數(shù)0為標(biāo)準(zhǔn)配置

if ((err = snd_pcm_open (&capture_handle,argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) {

fprintf (stderr, "cannot open audiodevice %s (%s)\n",

argv[1],

snd_strerror (err));

exit (1);

}

//2.分配snd_pcm_hw_params_t結(jié)構(gòu)體

if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {

fprintf (stderr, "cannot allocatehardware parameter structure (%s)\n",

snd_strerror (err));

exit (1);

}

//3.初始化hw_paraws

if ((err = snd_pcm_hw_params_any (capture_handle,hw_params)) < 0) {

fprintf (stderr, "cannot initializehardware parameter structure (%s)\n",

snd_strerror (err));

exit (1);

}

//4.初始化訪問權(quán)限

if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {

fprintf (stderr, "cannot set accesstype (%s)\n",

snd_strerror (err));

exit (1);

}

//5.初始化采樣格式SND_PCM_FORMAT_U8,16位

if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {

fprintf (stderr, "cannot set sampleformat (%s)\n",

snd_strerror (err));

exit (1);

}

1.//6.設(shè)置采樣率部服,如果硬件不支持我們?cè)O(shè)置的采樣率唆姐,將使用最接近的

2.//val?=?44100,有些錄音采樣頻率固定為8KHz

if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, 44100, 0)) < 0) {

fprintf (stderr, "cannot set samplerate (%s)\n",

snd_strerror (err));

exit (1);

}

//7.設(shè)置通道數(shù)量

if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params, 2)) < 0) {

fprintf (stderr, "cannot set channelcount (%s)\n",

snd_strerror (err));

exit (1);

}

//8.設(shè)置hw_params

if ((err = snd_pcm_hw_params (capture_handle,hw_params)) < 0) {

fprintf (stderr, "cannot setparameters (%s)\n",

snd_strerror (err));

exit (1);

}

snd_pcm_hw_params_free (hw_params);

if ((err = snd_pcm_prepare (capture_handle)) <0) {

fprintf (stderr, "cannot prepareaudio interface for use (%s)\n",

snd_strerror (err));

exit (1);

}

//讀取數(shù)據(jù)

for (i = 0; i < 10; ++i) {

if ((err = snd_pcm_readi (capture_handle,buf, 128)) != 128) {

fprintf (stderr, "read fromaudio interface failed (%s)\n",

snd_strerror (err));

exit (1);

}

}

//10.關(guān)閉PCM設(shè)備句柄

snd_pcm_close (capture_handle);

exit (0);

}

Alsa編譯安裝:http://blog.csdn.net/liu_chunhai/article/details/6582090

http://blog.csdn.net/shui1025701856/article/details/7646197

http://www.cnblogs.com/cslunatic/p/3677729.html

http://blog.csdn.net/zd394071264/article/details/8300045

http://blog.csdn.net/ropenyuan/article/details/9344299

slsa編譯

http://blog.chinaunix.net/uid-23065002-id-3884658.html

https://www.oschina.net/news/72059/alsa-lib-1-1-1

http://www.360doc.com/content/11/0613/13/168576_126609790.shtml

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市廓八,隨后出現(xiàn)的幾起案子奉芦,更是在濱河造成了極大的恐慌赵抢,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声功,死亡現(xiàn)場離奇詭異烦却,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)先巴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門其爵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伸蚯,你說我怎么就攤上這事摩渺。” “怎么了朝卒?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵证逻,是天一觀的道長。 經(jīng)常有香客問我抗斤,道長囚企,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任瑞眼,我火速辦了婚禮龙宏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伤疙。我一直安慰自己银酗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布徒像。 她就那樣靜靜地躺著黍特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锯蛀。 梳的紋絲不亂的頭發(fā)上灭衷,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音旁涤,去河邊找鬼翔曲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劈愚,可吹牛的內(nèi)容都是我干的瞳遍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菌羽,長吁一口氣:“原來是場噩夢啊……” “哼掠械!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤份蝴,失蹤者是張志新(化名)和其女友劉穎犁功,沒想到半個(gè)月后氓轰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婚夫,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年署鸡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了案糙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靴庆,死狀恐怖时捌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炉抒,我是刑警寧澤奢讨,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站焰薄,受9級(jí)特大地震影響拿诸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塞茅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一亩码、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野瘦,春花似錦描沟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惰许,卻和暖如春席覆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啡省。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工娜睛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卦睹。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓畦戒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親结序。 傳聞我的和親對(duì)象是個(gè)殘疾皇子障斋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容