嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
***************************************************************************************************************************
作者:EasyWave ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 時間:2014.10.25
類別:Linux應(yīng)用-ALSA音頻架構(gòu)ALSA-lib的移植于編譯 ? ? ?聲明:轉(zhuǎn)載,請保留鏈接
注意:如有錯誤,歡迎指正。這些是我學(xué)習(xí)的日志文章......
***************************************************************************************************************************
一:ALSA音頻架構(gòu)簡介
ALSA是Advanced Linux Sound Architecture,高級Linux聲音架構(gòu)的簡稱,它在Linux操作系統(tǒng)上提供了音頻和MIDI(Musical Instrument Digital Interface,音樂設(shè)備數(shù)字化接口)的支持。在2.6系列內(nèi)核中,ALSA已經(jīng)成為默認(rèn)的聲音子系統(tǒng),用來替換2.4系列內(nèi)核中的OSS(Open Sound System,開放聲音系統(tǒng))。ALSA的主要特性包括:高效地支持從消費(fèi)類入門級聲卡到專業(yè)級音頻設(shè)備所有類型的音頻接口,完全模塊化的設(shè)計(jì),
支持對稱多處理(SMP)和線程安全,對OSS的向后兼容,以及提供了用戶空間的alsa-lib庫來簡化應(yīng)用程序的開發(fā)。
ALSA是一個完全開放源代碼的音頻驅(qū)動程序集,除了像OSS那樣提供了一組內(nèi)核驅(qū)動程序模塊之外,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ū)動程序的API。
二:ALSA官方網(wǎng)站
我這里下載的不是最新版本的alsa-lib-1.0.28,而是alsa-lib-1.0.26,其主要原因當(dāng)然是為了版本的穩(wěn)定性才選擇低一點(diǎn)版本。而ALSA-lib的文件架構(gòu)如下所示:
三:ALSA移植和編譯
在ALSA-lib的移植當(dāng)中,還是出現(xiàn)過很多奇怪的問題,當(dāng)然這個跟我當(dāng)前所有的uClibc的版本有關(guān),對于低于uClibc-0.9.23的版本地uClibc,需要對ALSA的庫源碼進(jìn)行更新,否則會出現(xiàn)編譯失敗的問題,這個我一一道來。
1):‘versionsort‘ undeclared的錯誤
‘versionsort‘ undeclared錯誤的提示信息如下所示:
這個是由于uClibc如果低于0.9.23的話,就會出現(xiàn)這個問題,因?yàn)樵趗Clibc-0.9.32以下的版本沒有versionsort函數(shù)導(dǎo)致的,這個可以在uClibc的源碼中看到的,在uClibc-0.9.32的版本里就有versionsort函數(shù),如下所示:
低于這個版本uClibc的就沒有這個函數(shù)和文件的,那么就需要下載一個補(bǔ)丁包,并且將其移植到ALSA-lib中去。如果你的uClibc本身的版本就比這個高的話,可以跳過這個部分。其補(bǔ)丁包文件如下所示:
將這個補(bǔ)丁打上,采用如下命令,如下所示:
這個只是第一步,如果只是這樣打下補(bǔ)丁,還是會出現(xiàn)‘versionsort‘ undeclared錯誤的提示,不過不是在parse.c文件中,而是在conf.c文件中,如下所示:
這樣就不能采用上面的方法再來打補(bǔ)丁的方式來解決,否則會出現(xiàn)versionsort重復(fù)定義的錯誤,怎么辦呢,那就只能將versionsort移植到alsa-lib庫中去。首先從alsa-lib/src/ucm/parse.c中復(fù)制出versionsort的那部分函數(shù)代碼,重新新建一個versionsort.c文件在alsa-lib/src/下,如下所示:
同時修改上圖中的Makefile.am文件,加上這個文件,如下所示:
還需要在alsa-lib/include/local.h文件中加入一行代碼,如下所示:
重新修改編譯腳本build.sh文件,加上一行代碼:autoreconf -ivf,如下所示:
重新編譯整個alsa-lib庫。
2):‘?atomic_add‘之類的重復(fù)定義的錯誤
如果在編譯中遇到這個問題的話,就需要修改configure和configure.ac文件,如果沒有這類錯誤就不需要修改。如下所示:
就需要將-D__arm__拿掉,之后重新編譯整個alsa-lib庫...
3):--with-versioned的問題
這個問題是最難找的問題,不過不加--with-versioned=no的話,會出現(xiàn)靜態(tài)庫調(diào)用snd_pcm_hw_params_get_buffer_size(x,x)可以正確的返回buffer_size的大小,而動態(tài)庫卻無法正確返回,總是返回0。這個地方我整整查了兩天,才找到是這里導(dǎo)致的問題。
四:ALSAlib庫移植總結(jié)
在移植過程中出現(xiàn)過很多狀況,不過這也是一個學(xué)習(xí)的機(jī)會,不過好在問題都全部找到并解決啦。
原文:http://blog.csdn.net/wavemcu/article/details/40453235
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吹小号的天鹅作者是谁啊?
- 下一篇: linux源码安装浏览器,Linux系统