最近在看ALSA 的driver,嘗試了在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頭文件,在這個頭文件中寫如以下內容
#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工具終於編譯成功了
在編譯過程中,有個網址還是值得去瀏覽的:http://gitorious.org/rowboat/external-alsa-utils/trees/master
以上就是我在編譯過程中的遇到的問題