아이폰 시리의 스피치 코덱으로도 사용되고 있는 오픈 소스 기반의 Speex 코덱은 다양한 플랫폼에서 사용되는 만큼 바다에서도 비교적 간편하게 빌드된다. 아직 configure 를 통한 바다 빌드는 공식적으로 제공되지 않고, Visual Studio 에서 사용되는 방식처럼 bada IDE 에서 Source Import 하여 몇가지 설정 및 코드 추가로 bada static library 생성이 가능하다.
PREPARATION
현재 기준 최신버전인 speex-1.2rc1 소스를 이용하였고, bada IDE 에 추가될 소스 디렉토리는 include, libspeex 두개로 편의상 따로 복사하여 include 디렉토리는 inc 로 이름을 변경 해 두자. (inc 로 디렉토리 네임 변경 이유는, bada 프로젝트 생성 시 inc 디렉토리 네임은 디폴트로 환경설정에 추가되어 있다. 이름을 그대로 유지하고 싶다면 설정에서 해당 디렉토리(include) 를 추가 시켜 줘야 한다.)
CREATE PROJECT
File → New → bada C++/Flash Application Project.
Project type: bada static library 선택 → 'Finish'.
Import → General / File System → 'Next'.
'Browse' → Speex 소스폴더 선택 → 'Select All' → 'Finish'.
Project Explorer 에서 비어있는 src 폴더 삭제.
※ src 폴더를 삭제하지 않고 빌드하면 버그인지 Eclipse 컨셉인지 모르겠으나, 나머지 폴더의 소스들을 빌드하지 않는다.
BUILD SPEEX
프로젝트 구성 후, 최초 빌드시 다음과 같은 에러가 발생한다.
configure 를 수행하면 해당 플랫폼에 맞게끔 헤더 및 태그가 설정되지만, bada IDE 에서 소스만 Import 하였기 때문에 해당 구성을 IDE 에서 해줘야 한다.
- config.h 파일 생성
몇몇 빌드에 필요한 태그 설정을 위하여, inc 폴더 아래에 config.h 파일을 생성 하고, 아래 코드를 추가해 준다.
FLOATING_POINT 옵션의 경우, 모바일 단말에서 얼마만큼의 성능을 뽑아낼지 모르겠지만, 실제 단말에서 성능 테스트를 수행하여 최적을 적용하여야 겠다. Fourier Transform 구현도 USE_KISS_FFT 와 USE_SMALLFT 중에 선택 가능하다.
EXPORT 는 bada 에서 지원하지 않기 때문에, 컴파일 에러 수정을 위해 디파인.
#ifndef CONFIG_H_ #define CONFIG_H_ #define FIXED_POINT #define USE_KISS_FFT #define EXPORT #endif /* CONFIG_H_ */
- Symbol 추가
Properties (ALT+ENTER) → C/C++ General / Paths and Symbols → 'Add'.
Name: HAVE_CONFIG_H
'Check' Add to all configurations.
'Check' Add to all languages.
'OK'.
※ HAVE_CONFIG_H 심볼을 추가하여, Speex 소스에서, 생성한 config.h 를 참조하게끔 한다.
- speex_types.h 수정
inc/speex/speex_types.h 에서 speex_config_types.h 파일을 참조 하지 못하는 에러는, 소스 내의 다른 플랫폼처럼 바다 플랫폼 태그를 지정하여 타입 지정해주자.
#elif defined(CONFIG_TI_C6X) typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #elif defined(SHP) // ADD typedef short spx_int16_t; typedef unsigned short spx_uint16_t; typedef int spx_int32_t; typedef unsigned int spx_uint32_t; #else # include <speex/speex_config_types.h> #endif
※ SHP (Samsung Handset Platform) : 디폴트 설정되어 있는 심볼로, 개인적으로는 바다용 심볼이 따로 나와줬음 하는 바람이다.
CONCLUSION
바다도 대중화가 된다면, 다양한 오픈소스 프로젝트들에서 바다용 템플릿이나 스크립트를 제공해줄텐데 아직 현실은 걸음마 수준이다. 타이젠과의 통합 관련 소식이 현재 없긴 하지만, 통합 이후에 드라이브가 걸리는 시점이 될 것 같다.
UPDATE : GitHub Repository 소스코드 등록 https://github.com/dev-life/speex_bada
댓글