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

かなり格闘した上に、これで良いか自信が無い箇所もありますが
まぁ、音声の再生が行えるようになったので。


連携として、JavaからメインのNDKを呼び出して、なおかつその処理内で
OpenALを利用した音声の再生を行います。
例によって開発中のソースは色々誤魔化さないと……。


私の場合、構成は以下のようにしています。
環境によって色々調整してください。

assets...
jni ┬ openal ┬ Android.mk
  │    └ openal ─ (省略)
  ├ test  ┬ Android.mk
  │    └ ソースファイル
  ├ Application.mk    
  └ Android.mk
libs...

一番最上位に置くAndroid.mkには以下の一文だけ書いてあります。

include $(call all-subdir-makefiles)

今回はアルファベット順でopenalよりもtestの方が後になっているので
ビルドの順番は大丈夫でしたが、そうでない場合は
ちゃんとcallの指定をしてあげてください。


あとはtestにあたる部分のAndroid.mkに以下のように記述しています。

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../openal/openal/include
LOCAL_STATIC_LIBRARIES := libopenal

だいたいこれでコンパイルは通るかと思います。
中の処理などは、前回紹介したMartin's Blogさんの
Testing OpenAL以降を参考にすれば作成できるかと思います。


(サンプルコードを書かないのは、ちょっと仕事が結構ヤバイので
 サンプルコードを書いてる暇が無いとも言う……。
 私の場合、実際にはUtilityClassを作って管理しています)


サンプルコードを利用して実装した際に、wavファイルを読み込んで
鳴らそうとしてもreadWAV関数が失敗することがあるかもしれません。
結構私もハマってましたが、原因の一つと考えられるのは以下。

if (fread(header,sizeof(BasicWAVEHeader),1,file)){
if (!(//these things *must* be valid with this basic header
	memcmp("RIFF",header->riff,4) ||
	memcmp("WAVE",header->wave,4) ||
	memcmp("fmt ",header->fmt,4)  ||
	memcmp("data",header->data,4)
 )){

この箇所の判定となります。
物によってWAVファイルは「fmt」と「data」の間に拡張ヘッダが入る可能性があります。
私の場合は、「FLLR」という拡張ヘッダが入っていることがありましたので
汎用的に作成するためにはこれを解析してスキップする処理が必要です。


ですが、ちょっと時間がないので仕方なく、いや、本当に仕方なくですよ?
バイナリエディタでFLLRヘッダを削りました。


だいたい、FLLRから「data」の前まで全部削って、更に先頭から4バイト目から始まる
ファイル全体のサイズに「ファイルサイズ-8」の値を指定します。
これで再生できるんじゃないでしょうか?


……かなり手抜きエントリですね。すいません。
補足が必要でしたら言われたら回答します。 分かる範囲で。