***************************************************************************************************************************
作者:EasyWave 時間:2014.10.25
類別:Linux應用-ALSA音頻架構ALSA-lib的移植於編譯 聲明:轉載。請保留鏈接
注意:如有錯誤。歡迎指正。這些是我學習的日志文章......
***************************************************************************************************************************
一:ALSA音頻架構簡單介紹
ALSA是Advanced Linux Sound Architecture,高級Linux聲音架構的簡稱,它在Linux操作系統上提供了音頻和MIDI(Musical Instrument Digital Interface,音樂設備數字化接口)的支持。在2.6系列內核中,ALSA已經成為默認的聲音子系統,用來替換2.4系列內核中的OSS(Open Sound System。開放聲音系統)。ALSA的主要特性包含:高效地支持從消費類入門級聲卡到專業級音頻設備全部類型的音頻接口,全然模塊化的設計。 支持對稱多處理(SMP)和線程安全。對OSS的向后兼容,以及提供了用戶空間的alsa-lib庫來簡化應用程序的開發。
ALSA是一個全然開放源碼的音頻驅動程序集,除了像OSS那樣提供了一組內核驅動程序模塊之外,ALSA還專門為簡化應用程序的編寫提供了對應的函數庫,與OSS提供的基於ioctl的原始編程接口相比。ALSA函數庫使用起來要更加方便一些。利用該函數庫,開發人員能夠方便快捷的開發出自己的應用程序,細節則留給函數庫內部處理。當然 ALSA也提供了類似於OSS的系統接口,只是ALSA的開發人員建議應用程序開發人員使用音頻函數庫而不是驅動程序的API。
二:ALSA官方站點
開源ALSA架構的站點例如以下所看到的:http://www.alsa-project.org/main/index.php/Main_Page
我這里下載的不是最新版本號的alsa-lib-1.0.28,而是alsa-lib-1.0.26。其主要原因當然是為了版本號的穩定性才選擇低一點版本號。
而ALSA-lib的文件架構例如以下所看到的:
三:ALSA移植和編譯
在ALSA-lib的移植其中,還是出現過非常多奇怪的問題,當然這個跟我當前全部的uClibc的版本號有關,對於低於uClibc-0.9.23的版本號地uClibc,須要對ALSA的庫源代碼進行更新,否則會出現編譯失敗的問題,這個我一一道來。
1):'versionsort' undeclared的錯誤
'versionsort' undeclared錯誤的提示信息例如以下所看到的:

這個是由於uClibc假設低於0.9.23的話,就會出現這個問題,由於在uClibc-0.9.32下面的版本號沒有versionsort函數導致的。這個能夠在uClibc的源代碼中看到的。在uClibc-0.9.32的版本號里就有versionsort函數。例如以下所看到的:

低於這個版本號uClibc的就沒有這個函數和文件的,那么就須要下載一個補丁包,而且將其移植到ALSA-lib中去。假設你的uClibc本身的版本號就比這個高的話。能夠跳過這個部分。
其補丁包文件例如以下所看到的:

將這個補丁打上。採用例如以下命令,例如以下所看到的:

這個僅僅是第一步,假設僅僅是這樣打下補丁,還是會出現'versionsort' undeclared錯誤的提示,只是不是在parse.c文件里,而是在conf.c文件里,例如以下所看到的:

這樣就不能採用上面的方法再來打補丁的方式來解決,否則會出現versionsort反復定義的錯誤。怎么辦呢,那就僅僅能將versionsort移植到alsa-lib庫中去。
首先從alsa-lib/src/ucm/parse.c中復制出versionsort的那部分函數代碼。又一次新建一個versionsort.c文件在alsa-lib/src/下,例如以下所看到的:

同一時候改動上圖中的Makefile.am文件,加上這個文件,例如以下所看到的:

還須要在alsa-lib/include/local.h文件里增加一行代碼,例如以下所看到的:

又一次改動編譯腳本build.sh文件,加上一行代碼:autoreconf -ivf,例如以下所看到的:

又一次編譯整個alsa-lib庫。
2):' atomic_add'之類的反復定義的錯誤
假設在編譯中遇到這個問題的話。就須要改動configure和configure.ac文件,假設沒有這類錯誤就不須要改動。例如以下所看到的:


就須要將-D__arm__拿掉,之后又一次編譯整個alsa-lib庫...
3):--with-versioned的問題
這個問題是最難找的問題,只是不加--with-versioned=no的話,會出現靜態庫調用snd_pcm_hw_params_get_buffer_size(x,x)能夠正確的返回buffer_size的大小,而動態庫卻無法正確返回。總是返回0。
這個地方我整整查了兩天,才找到是這里導致的問題。
四:ALSAlib庫移植總結
在移植過程中出現過非常多狀況。只是這也是一個學習的機會,只是好在問題都所有找到並解決啦。


