編譯alsa
A. linux alsa可以做什麼
好了言歸正轉。 1.下載驅動你可以到這里下載ALSA的驅動: 你需要下載以下幾個包: alsa-driver-1.0.10.tar.bz2 alsa-lib-1.0.10.tar.bz2 alsa-utils-1.0.10.tar.bz2 2.分別解壓: #tar jxvf alsa-driver-1.0.10.tar.bz2 #tar jxvf alsa-lib-1.0.10.tar.bz2 #tar jxvf alsa-utils-1.0.10.tar.bz2 3.先進入alsa-driver,然後是,alsa-lib,最後是alsa-utils文件夾進行編譯: #./configure#make#make install 最後一步再次進入alsa-driver文件夾運行再編譯請輸入: #./snddevices 等幾分鍾後編譯完成,到此驅動總算安裝完了,但是如果你馬上重啟動的話你的音效卡還是不能工作,why?很簡單你還得修改你的模塊文件/etc/moles.conf #vi /etc/moles.conf並在最後加入以入幾行:
B. 新人求教,編譯一個最簡單的Android程序,提示下面的錯誤咋解決
1、32位系統下的編譯
如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改
首先修改build/core/main.mk,修改的內容如下所示:
-ifneq (64,$(findstring 64,$(build_arch)))
+ifneq
(i686,$(findstring i686,$(build_arch)))
$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)
$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
其次修改如下四個文件:
external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止
從編譯規則上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
endif
在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾
3、AIDL 編譯報couldn't find import for class原因
「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
實現 android.os.Parcelable介面的類。需要導入(import)。
其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。
修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api
4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
表現方式。
更改jdk版本為1.6即可
5、編譯alsa-lib庫錯誤
android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
C. 3. 如何安裝 ALSA 音效驅動程式
3.1 您需要什麽一套能動的 Linux 系統(如 Slackware 發行套件), 並有安裝開發工具套件(像 gcc, make 等).)支援的音效卡一些Linux 的知識(您總要曉得 "ls", "cd", "tar" 等怎麽用. )root 帳號 如果您有 PnP 卡, 您也需要: isapnptools 軟體套件 在驅程式目錄中的 INSTALL 檔內文提到對有些卡驅動程式內已經能處理 PnP 的支援. 我也從 Jaroslav 那兒得到一樣的論點. 如果我將來得到更多資訊, 我會將它們加進本 mini-HOWTO. (原文是 The INSTALL text in the driver directory suggests that for some cards, PnP support is native. I also received a suggestion from Jaroslav about this. When I get further information about this topic I will add it to this mini-HOWTO. }
請注意如果您想使用 ALSA 驅動程式, 那麽您不應該先載入任何其它音效驅動程式. 如果您的核心中內含音效驅動程式, 那麽有必要重編譯核心. 如果您正在使用舊的 sound.o 模組, 您必須解除它. 如果您使用 kerneld, 這可能就是要您刪去 /lib/moles//misc 目錄下的 sound.o. 新的 RedHat 系統的音效驅動程式組織方式不太一樣, 要載入好幾個模組, 這種情況您需要解除全部的模組. 2.2 版核心對音效則採用了新的方式. 您應該要包含音效的支援! 是的, 沒有說錯, 您在核心中加入了對音效的支援, 但沒有包含任何音效卡的部份. 然後重編譯及安裝核心, 接著編譯 ALSA 驅動程式. 3.2 取得驅動程式ALSA 驅動程式可在 ftp://ftp.alsa-project.org/pub 找到, 並且在 ftp://linux.a2000.nl/alsa 有一份鏡射(mirror). 要安裝 ALSA 的完整功能, 您需要驅動程式, 函式庫及一些公用程式; 也就是說如果您由鏡射站抓您應該 ftp://linux.a2000.nl/alsa/driver/alsa-driver-0.3.0-pre4.tar.gz, ftp://linux.a2000.nl/alsa/lib/alsa-lib-0.3.0pre4.tar.gz, 還有 ftp://linux.a2000.nl/alsa/utils/alsa-utils-0.3.0-pre4.tar.gz. (喔, 上面的不是完整的連結, 您最好到原地點看看有沒有新版, 並抓最新的.) 3.3 解開驅動程式用合理的命令像 tar -zxf 解開驅動程式. 以下的是寫給新手或常忘記的人: (You extract the drivers by some reasonable command, like the all-time tar -zxf . For newbies and for those with amnesia:) cd /usr/src tar -zxf ~/alsa-driver-0.3.0-pre4.tar.gz (如果成功了, 您可能一直使用 root 身份進系統, 這是不對的, 停下來並讀一下 DOS/Win95-to-Linux-HOWTO. 不是這樣的話, 您已經知道這是關於系統管理(administrative)的事, 您需要 superuser/root 許可權. 所以, 您需要 root 許可權, 輸入 su 以及密碼. tar -zxf ~/alsa-lib-0.3.0pre4.tar.gz tar -zxf ~/alsa-utils-0.3.0-pre4.tar.gz 下這樣的命令也可以, 且更有趣: find ~ -name alsa* -exec tar -zxf {} \; (孩子, 不要在家試這個, 這只是個□例而已. )注意如果您使用 Netscape 下載驅動程式, 您可能抓下的是解開過的, 但延伸檔名還是 .tgz. 如果 tar 抱怨檔案格式不對, 把 tar 命令中的 "z" 選項去掉, 可以得到較好的結果. 3.4 編譯在您可以編譯及使用函式庫以前, 您需要先有驅動程式. 而有了函式庫後才可以編譯使用公用程式. 所以我們開始吧: cd alsa-driver-0.3.0-pre4 (給那些不太有經驗的: 在 "alsa-d" 後接著按 ("tab" 鍵). 這樣就會叫出 命令列自動補完(command line completion).) (譯注: 有更好的翻法嗎?) ./configure make 現在您需要用 root 身份安裝東東(可能您已經是 root 了) make install 如果它回應像 "version.h" 檔找不到之類的, 您可能沒有妥善安裝核心原始碼. 要編譯 ALSA 驅動程式需要核心原始碼中的一些檔案, 所以您把想用的 linux-2.x.y.tar.gz 在 /usr/src 下解開, 並下 make menuconfig 命令. (實際上, make symlinks 可能就夠了). 現在編譯函式庫: cd ../alsa-lib-0.3.0-pre4 ./configure make make install OK, 您已經成功了, 再來是公用程式: cd ../alsa-utils-0.3.0-pre4 ./configure make make install 注意: 在第一次編譯公用程式時可先不打 "make install". 甚至您可以先不要動函式庫及公用程式, 只檢查一下確定驅動程式能不能用. 3.5 准備設備檔在驅動程式目錄下有個命令稿(script)可以把 ALSA 的音效設備檔安裝進 /dev 目錄. 在驅動程式目錄下打入 ./snddevices 如此應該有 /dev/snd 子目錄了(先看看有沒有. 如果您甚至連 "ls" 命令都不熟, 請考慮先讀別的 HOWTO. 在安裝本驅動程式前您應該有些基本的 Linux 知識才對.) 現在您可以安插驅動程式了. 請跳到下一段吧.
D. ubuntu 音效卡載入問題 alsa都安裝了 怎麼沒有alsaconf命令
我用的5.04
確實沒有alsaconf
,不過一般機器都可以正確檢測不會出問題。alsa不能用估計是預設安裝的是esd
我的解決辦法是安裝
libesd-alsa0
我還安裝了
alsa-oss
重啟,在首選項-多媒體系統選擇器中選擇ALSA。
(如果要自己編譯alsa程序還要apt
alsa-headers)
E. 如何在android 中編譯alsa-utils工具
首先我從ALSA 官方網上下載了alsa-utils-1.0.23版本的工具,因為我android 的alsa-lib
也是1.023版本的,防止版本不一樣出現問題,我就選擇了版本一樣,我們的alsa-lib放的路徑是在android_source/external/alsa-lib目錄下面,我們下載的alsa-utils-1.023工具包也下載放在裡面。
接下來我們需要完成以下幾個動作:
1、在alsa-utils下面創建一個Android.mk寫的內容是:
ifeq ($(strip $(BOARD_USES_ALSA_AUDIO)),true)
LOCAL_PATH:= $(call my-dir)
#
# Build aplay command
#
include $(CLEAR_VARS)
LOCAL_CFLAGS := \
-fPIC -D_POSIX_SOURCE \
-DALSA_CONFIG_DIR=\"/system/usr/share/alsa\" \
-DALSA_PLUGIN_DIR=\"/system/usr/lib/alsa-lib\" \
-DALSA_DEVICE_DIRECTORY=\"/dev/snd/\"
LOCAL_C_INCLUDES:= \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/android \
external/alsa-lib/include
LOCAL_SRC_FILES := \
aplay/aplay.c
LOCAL_MODULE_TAGS := debug
LOCAL_MODULE := alsa_aplay
LOCAL_SHARED_LIBRARIES := \
libasound \
libc
include $(BUILD_EXECUTABLE)
上面我只寫了個編譯aplay工具的代碼,別的工具也是一樣的寫法
2、接下來進入alsa-utils工具包裡面進行創建sys目錄和aconfig.h文件,在aconfig.h文件裡面編寫以下內容
#define DATADIR "/system/usr/share/alsa"
#define rindex strrchr
#define open64 open
#undef __swab16
#define __swab16(x) __arch__swab16((x))
#undef __swab32
#define __swab32(x) __arch__swab32((x))
3、進入第2步中創建的sys目錄,在sys目錄中創建signal.h頭文件,在這個頭文件中寫如以下內容
[plain] view plainprint?
01.#include <signal.h>
#include <signal.h>4、接下來你直接編譯android 就可以了,在編譯過程中可能出現以下 錯誤「
4.1:kernel/common/linux/un.h:18: error: expected specifier-qualifier-list
before 'sa_family_t
那是因為我們在alsa-utils/alsactl/init_parse.c裡面在include un.h之前沒有#include
<sys/socket.h>,你只要在這之前include這個頭文件就解決了
4.2:還有可能遇到這個錯誤:在aplay.c裡面會提示報錯'S_IRGRP' undeclared (first use in this
function,你只要在在aplay.c裡面添加一個頭文件:#include <sys/stat.h>,這樣就解決了
4.3:接下來可能語言到這樣的錯誤:speaker-test.c裡面報wav_file_dir沒有定義,這個值是用來定義你的wav文件存放在pad中的位置的,你隨便放在哪裡,我定義的路徑
就是在/sdcard目錄下面
經過上面的種種修改,alsa-utils工具終於編譯成功了
轉載
F. Linux編譯時報錯fatal error: alsa/asoundlib.h: No such file or directory
你需要自己編譯alsa-lib的arm版本,然後安裝(make install)到預先定義的目標文件夾$prefix。編譯music.c時在編譯選項中加入-I$(prefix)/include -L$(prefix)/lib即可。
G. 如何安裝ALSA驅動
1.下載驅動
你可以到這里下載ALSA的驅動:
你需要下載以下幾個包:
alsa-driver-1.0.10.tar.bz2
alsa-lib-1.0.10.tar.bz2
alsa-utils-1.0.10.tar.bz2
2.分別解壓:
#tar jxvf alsa-driver-1.0.10.tar.bz2
#tar jxvf alsa-lib-1.0.10.tar.bz2
#tar jxvf alsa-utils-1.0.10.tar.bz2
3.先進入alsa-driver,然後是,alsa-lib,最後是alsa-utils文件夾進行編譯:
#./configure
#make
#make install
最後一步再次進入alsa-driver文件夾運行再編譯請輸入:
#./snddevices
等幾分鍾後編譯完成,到此驅動總算安裝完了,但是如果你馬上重啟動的話你的音效卡還是不能工作,why?很簡單你還得修改你的模塊文件/etc/moles.conf
#vi /etc/moles.conf
並在最後加入以入幾行:
#====== added those lines =============
alias char-major-116 snd
options snd major=116 cards_limit=1
#--- Intel 8x0 and SiS 7012 ----------
alias snd-card-0 snd-intel8x0
options snd-intel8x0 index=0 id="ICH"
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
#====
然後保存退出重啟。這就完成了,還不發聲 ?不要緊我也遇到,打開音量控制器,你會發現所有的音量都是0, 接下來就不用我教了吧,調好音量後,先不要關控制器,直接測試音效卡。能聽到聲音嗎?還沒有?那就把電腦砸了。
二、安裝ALSA音效卡驅動程序
1.到http://www.heihei.com/下載下面四個軟體包:
alsa-driver-0.5.9.tar.bz2
alsaconf-0.4.3b.tar.gz
alsa-lib-0.5.9.tar.bz2
alsa-utils-0.5.9.tar.bz2
2.先安裝alsa-driver-0.5.9.tar.bz2這個文件:
(1)cp alsa-driver-0.5.9.tar.bz2 /tmp
將alsa-driver-0.5.9.tar.bz2 拷到/tmp目錄下。
(2)bunzip2 alsa-driver-0.5.9.tar.bz2
解壓縮這個文件,會在/tmp目錄下生成一個文件叫做alsa-driver-0.5.9.tar。
(3)tar xvf alsa-driver-0.5.9.tar
將會在/tmp目錄下產生一個子目錄叫做alsa-driver-0.5.9,alsa的所有文件就存放在這個目錄下。
(4)cd alsa-driver-0.5.9
進入alsa的驅動程序所存放的目錄,准備配置和編譯它。這時你可以看一下目錄下的INSTALL文件來了解安裝的步驟和注意事項。
(5)依次運行下面三個命令:
./configure
make install
./snddevices
3.編輯/etc/ moles.conf文件
這個文件的配置雖然比較麻煩,但用alsaconf-0.4.3b.tar.gz也可以配好它,運行命令:
(1)cp alsaconf-0.4.3b.tar.gz /tmp
將alsaconf-0.4.3b.tar.gz 拷到/tmp目錄下。
(2)tar zxvf alsaconf-0.4.3b.tar.gz
解壓縮這個文件,會在/tmp目錄下生成一個子目錄叫做alsaconf-0.4.3b。
(3)./alsaconf
會出現一個窗口叫你選擇音效卡,像SoundBlaster及ESS1868、S3_SonicVibes_PCI、Ensoniq_AudioPCI_ES1370 1371等,很多目前的kernel還不支持的音效卡它都可以支持了。
選好音效卡之後系統會問你一些問題,都回答OK,然後會回到第一個畫面問你要不要繼續設第二張音效卡,選「No_more_cards」退出即可。完成這個步驟之後,/etc/moles.conf這個文件就基本上自動配置好了,重新啟動電腦後音效卡就可以發聲了。
4.如果還不行,那麼你就還需要安裝alsa-lib和alsa-utils,安裝方法和alsa-driver一樣,注意要先安裝alsa-lib,再安裝alsa-utils。將文件拷到/tmp目錄,解壓縮,然後運行命令make和make install,具體請參照上面alsa-driver的安裝步驟。
安裝後到alsa-utils(解開alsa-utils-0.5.9.tar.bz2會產生該目錄)目錄下的alsamixer子目錄執行
./alsamixer
好了,你的音效卡應該能發聲了。
H. Y450,ubuntu10.10,編譯音效卡(ALC269)驅動(alsa)之後無聲音,aplay -l提示無音效卡,lspci -v命令找到顯卡
如果沒有編譯經驗最好不好自己搞。ubuntu默認的驅動都是和系統匹配的,而你自己搞得就很有可能不匹配ubuntu的聲音系統。
I. ALSA 編譯問題~我用這個snd_pcm_close(handle)關閉音效卡後,再打開音效卡用於回放,可是實際上沒有關閉
你是怎麼做的 是錄製成文件還是存在buf里? playback的handle與record的handle需要設成兩個 他倆不是公用的 open的時候可以一起打開 都需要初始化,如果你只初始化了record沒初始化playback當然沒有聲音