Android NDK-r5 OpenALでサウンド再生 1

表題の通り、AndroidNDKのネイティブソースコード内で
OpenALを使ってサウンドの制御をしましょう、という話。


ちなみに、AndroidOS2.3以降ならこれから書くようなことをしなくても
簡単にサウンドを利用できるみたいだけど、
さすがに2.3はまだ普及してませんので、以下に記載します。


コンパイル方法など、参考にさせて頂いたのは以下のページ
◆ Martin's Blog / OpenAL on Android
http://pielot.org/2010/12/14/openal-on-android/
(※英語です)


実際、ここのblogに書いてある通りには使っていないところもありますし
まだ実際に音声を鳴らすような扱い方はしていませんが、軽く和訳を以下に。
英語そんなに得意じゃないんで、多分誤訳は多分に含まれますよ。

                    • -

Android2.3からは3D Audioが標準でサポートされますが、このチュートリアルではOpenALAndroidで利用する方法を示します。
これを用いることで、あなたは2.2以前のバージョンであっても3Dサウンドを利用することが出来ます。
このコードは、Nexus One(2.2)とG1(1.6)で動作を確認しています。


Preparation(準備)
NDKリソースをコンパイルする方法を知っている必要があります。


このチュートリアルは、AndroidNDKを使ったコンパイルが必要です。私たちはネイティブな共有ライブラリにソースからOpenALコンパイルしなくてはいけません。
そして、動作させるためにJava Native Interfaceをつくる必要があります。
私が(Windows上の)NDKで動作させるために利用する技術は、以前のチュートリアルで解説しています。
SHARED OBJECTをコンパイルした後には、必ずF5を押すことを忘れないでください。 さもなければ、Eclipseは新しい.soファイルを利用しません。


Android用のOpenALコンパイル方法
まずはじめに、AndroidのためにOpenALコンパイルします。 ゴールは、Androidアプリで読み込める
Shared Object libraryである libopenal.so を生成することです。


OpenALソースコードをダウンロードします。
Martins Mozeiko と Chris RobinsonのおかげでAndroidプラットフォームに適したOpenALのバージョンが存在します。
http://repo.or.cz/w/openal-soft/android.git からOpenALソースコードの最新バージョンをダウンロードしてください。
このチュートリアルでは、ここからダウンロードできるバージョンを利用しています。
ダウンロードされたソースコードから、「android」フォルダを「openal」にリネームしてください。


config.hを作成します。
OpenALコンパイルするために、config.hを /openal/android/jni から /openal/include へコピーしてください。


Android.mkを作成します。
コンパイラコンパイルするファイルを教えるために、/jniにAndroid.mkを作成する必要があります。
ファイルには以下のように記述します。

TARGET_PLATFORM := android-3
ROOT_PATH := $(call my-dir)

########################################################################################################
include $(CLEAR_VARS)

LOCAL_MODULE     := openal
LOCAL_ARM_MODE   := arm
LOCAL_PATH       := $(ROOT_PATH)
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/../openal/include $(LOCAL_PATH)/../openal/OpenAL32/Include
LOCAL_SRC_FILES  := ../openal/OpenAL32/alAuxEffectSlot.c \
 ../openal/OpenAL32/alBuffer.c        \
 ../openal/OpenAL32/alDatabuffer.c    \
 ../openal/OpenAL32/alEffect.c        \
 ../openal/OpenAL32/alError.c         \
 ../openal/OpenAL32/alExtension.c     \
 ../openal/OpenAL32/alFilter.c        \
 ../openal/OpenAL32/alListener.c      \
 ../openal/OpenAL32/alSource.c        \
 ../openal/OpenAL32/alState.c         \
 ../openal/OpenAL32/alThunk.c         \
 ../openal/Alc/ALc.c                  \
 ../openal/Alc/alcConfig.c            \
 ../openal/Alc/alcEcho.c              \
 ../openal/Alc/alcModulator.c         \
 ../openal/Alc/alcReverb.c            \
 ../openal/Alc/alcRing.c              \
 ../openal/Alc/alcThread.c            \
 ../openal/Alc/ALu.c                  \
 ../openal/Alc/android.c              \
 ../openal/Alc/bs2b.c                 \
 ../openal/Alc/null.c                 \

LOCAL_CFLAGS     := -DAL_BUILD_LIBRARY -DAL_ALEXT_PROTOTYPES
LOCAL_LDLIBS     := -llog -Wl,-s

include $(BUILD_SHARED_LIBRARY)

########################################################################################################


あとはこれをndk-buildでコンパイルするわけですが、ここで注意点が。
というか私がこのステップで3時間くらいつまってたわけなんですが。


Android.mk」を作成するのは「/jni」になります。
つまりは、ここまでに作成した「openal」のフォルダと並列して「jni」のフォルダを「新規作成」し、
その上で「ndk-build」を実行する、ということになります。


これを階層の下のほうにあるjni付近でndk-buildしていたものだから全然コンパイル
通らずに苦労しました……。
とりあえずはここまで。 次はこの後で生成されたlibopenal.soを自分で使っているNDKプロジェクトに
組み込んで、NDKソースの中からlibopenalを操作して音声を鳴らしたいなぁ。