이지랑드로랑 - 7장. ALSA 드라이버 포함시키기

 

이전 장에서 리는 안드로이드의 전력 문제를 해결하고 어느정도 사용할 수 있도록 만들었습니다. (물론 Fake 지만...)

아무튼, 베터리도 없는 장비에서 안꺼지고 잘 돌아가게 한거면 1차적인 목적은 이룬거니까요.

이번에는 소리를 나도록 할 건데요, 이건 Fake로 하면 큰일납니다. (소리 안나요. ^^)

 

[그림7-1. 소리가 듣고 싶다!]

 

오늘 제목에 ALSA라는 것이 들어가 있네요.

앞에서 기억나실지 모르겠지만 보드설정에 HTC 오디오 드라이버란게 활성화 되어 있는거 기억나세요?

그런걸 말하는건데요, 우리는 HTC 휴대폰이 아니니까, 그 드라이버를 안쓰고 이지보드가 사용할 ALSA 를 사용할 거에요.

해피하죠?

Advanced Linux Sound Architecture (ALSA)

The Advanced Linux Sound Architecture (ALSA) provides audio and MIDI functionality to the Linux operating system. ALSA has the following significant features:

* Efficient support for all types of audio interfaces, from consumer sound cards to professional multichannel audio interfaces.
* Fully modularized sound drivers.
* SMP and thread-safe design.
* User space library (alsa-lib) to simplify application programming and provide higher level functionality.
* Support for the older Open Sound System (OSS) API, providing binary compatibility for most OSS programs.

 

일단 우리에게 필요한 ALSA 드라이버와 유틸리티 소스는 기본적으로 안드로이드에 들어있지 않습니다.

그렇다고 제공하지 않는 것은 아니고, GIT를 이용해서 직접 내려받고 빌드할 수 있도록 해 줘야 한다는 것 입니다.

자, 그럼 겁먹지 말고 찬찬히 따라해 봅시다.

 

Step1. ALSA 드라이버 내려받기

그럼 일단 GIT 서버에서 ALSA 드라이버와 유틸리티들을 다운로드 받아보도록 합시다.

# cd {Android_SRC}/external
# git clone git://android.git.kernel.org/platform/external/alsa-lib.git alsa-lib
# git clone git://android.git.kernel.org/platform/external/alsa-utils.git alsa-utils
# cd {Android_SRC}/hardware
# git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git alsa_sound
# cd {Android_SRC}     

자, 이제 드라이버와 유틸리티는 준비가 되었습니다.

그런데 그냥 막 빌드하면 아무런 변화도 없으니까 급하게 make 때리지 마시고, 소스를 좀 수정해 봐요.

소스 수정하는거, 이까이거 그냥 대~ 충~ 하면 금방 되니까 긴장 너무 하지 마시구요.

 

Step2. 빌드 옵션에 ALSA 추가하기

우리가 일반적으로 리눅스에서 프로그램 개발할 때 Makefile을 이용하게 되죠.

커널에도 많은 Makefile 들이 존재해서 옵션을 추가하고 빼고 할 수 있도록 스마트하게 만들어졌습니다.

안드로이드도 마찬가지로 Makefile 이 있어서 추가가 된 프로그램이나 드라이버를 빌드할 수 있도록 하고 있습니다.

그럼 BoardConfig.mk 파일을 수정해 봅시다.

# vi build/target/board/generic/BoardConfig.mk    
# The generic product target doesn't have any hardware-specific pieces.
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_NO_RADIOIMAGE := true
#HAVE_HTC_AUDIO_DRIVER := true
#BOARD_USES_GENERIC_AUDIO := true
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true

위에서 보이듯 BOARD_USES_ALSA_AUDIO 와 BUILD_WITH_ALSA_UTILS 옵션이 추가되었네요.

'아니, 저 옵션은 그대는 어떻게 안것인가! 천재인가?' '속이는게 무어냐, 진실을 말해라!' 이러시면서 저 옵션 이름들을 어떻게 알았는지 추궁하실 분들이 생길 것 같습니다.

네! 저는 다 알고 있습니다...

...

라고 하면 큰일나고, 저 옵션은 소스를 보면 알 수 있어요.

# vi external/alsa-utils/Android.mk    
ifeq ($(strip $(BOARD_USES_ALSA_AUDIO)),true)
ifeq ($(strip $(BUILD_WITH_ALSA_UTILS)),true)

Android.mk 란 파일이 각 소스그룹 별 Makefile 이라고 보시면 되는데요, 자! 열자마자 보이죠?

만약~ BOARD_USES_ALSA_AUDIO 가 true 라면~ 이런식으로 되어 있잖아요.

별거 없어요, 저것만 BoardConfig.mk 파일에 넣어주시면 되는거에요.

참~ 쉽죠? ^^

 

Step3. Init Process 수정하기

아직 끝난게 아닙니다!

할일이 더 남아있습니다. (정말 소리한번 듣기 힘드네요)

바로 Init 프로세스가 부팅을 하면서 ALSA 디바이스를 /dev 아래에 등록시켜 줄 수 있도록 수정해야 한다는 것 입니다.

프로세서의 조상격인 Init를 수정한다니! 정말 긴장되는군요.

사실 저도 잘 모르지만, 그래도 한번 해보도록 할께요.

# system/core/init/devices.c
static struct perms_ devperms[] = {
// ... 생략 ...
{ "/dev/eac",           0660,   AID_ROOT,       AID_AUDIO,      0 },
{ "/dev/snd/",          0664,   AID_SYSTEM,     AID_AUDIO,      1 },
// ... 생략 ...
};
static void handle_device_event(struct uevent *uevent)
{
// ... 생략 ...
        } else if(!strncmp(uevent->subsystem, "sound", 5)) {
            base = "/dev/snd/";
            mkdir(base, 0755);
// ... 생략 ...
}

perm_devperms 구조체와 handle_device_event 함수에서 제가 생략하지 않고 넣은 5줄!!!

이 5줄을 잘 추가합니다.

자! 그리고 빌드하세요.

 

Step4. conf 파일을 복사하기

빌드하자마자 기가막히게 RootFS 정리해서 보드에 올리면... 사실 소리가 안납니다. ㅡ_ㅡ;

'너, 나 놀리는거냐!' '여기서 이렇게 고생시키고 여기서 도망이냐!' 이런 분들이 계시면 제가 또 곤란합니다.

아직 끝났다는 소리는 안했습니다. (헉!)

그래도 너무 노여워 마시고, 이제 마지막 단계 입니다.

# cp ./external/bluez/utils/audio/asound.conf ./out/target/product/generic/system/etc/.

자, 이제 앞에서 배운것처럼 RootFS를 구축하고 보드에 올려보세요!

그럼 정말 사운드가 작동을 하는지 테스트를 해볼까요?

 

사운드 테스트 해보기

자! 그럼 이제 소리를 들어봅시다.

음악 재생 프로그램을 열고 노래를 열어보려고 했으나... ... 미디어를 찾을 수 없습니다;

허어어억!!! 안드로이드가 SD-Card 를 이용해서 각종 음악, 비디오, 사진 등을 제생하는데요, 이걸 제가 말씀 안드렸군요.

그런데 지금 우리는 SD 카드가 마운트가 안되잖아요!!! 망했으려나...;;; 가 아니라!

 

'결국은 사기였다!' '니가 하는게 다 그렇지 뭐~' 이런 비난이 여기저기서 쏟아지는 느낌입니다.

그렇지 않을꺼에요. 잘 될꺼란 말이죠.

일단 안드로이드가 미디어를 SD 카드를 통해서만 인지하니까... 이렇게 하도록 해요.

다음 시간에는 SD 카드를 안드로이드가 인지 할 수 있도록 하는 작업을 해 보아요.

소리는 날 꺼니까 걱정하지 맙시다. (선행자가 테스트 해음! ^^)

 

그럼 다음시간에 봐요~