1. 程式人生 > >嵌入式Linux下ALSA音訊架構ALSA-lib移植與編譯心得

嵌入式Linux下ALSA音訊架構ALSA-lib移植與編譯心得

***************************************************************************************************************************
作者: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-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庫移植總結

      在移植過程中出現過很多狀況,不過這也是一個學習的機會,不過好在問題都全部找到並解決啦。