Android関連で使ったときにバージョンバップしているのに気づいたのと、
前にアップしたのが消えてしまっているので再アップです。
oggvorbis 1.0.0
-
D言語でOgg vorbis
2011年03月16日 19時47分comment (0) -
VIVID Runtimeはじめました Ogg vorbis編
2011年03月07日 23時00分VIVID Runtimeは音声再生にOpenALとOpenSL ESがありますが、
公式にはOpenSL ESの方をプッシュしてきます。
だったら最初から片方だけにしとけばいいんじゃとか思わないでもないですが、
複雑な事情があるのでしょう。
私は素直な人間なので、お勧めされるがままにOpenSL ESを使いました。
しかしこのOpenSL ESですが、全く普及している気配がありません。
私などは今回初めてこの単語を目にしたくらいです。
ネット上を調べてみても情報がさっぱり出てきません。
一応Kronos公式ドキュメントがSDKに含まれるので
なんとかなるといえばなるのですが・・・
たまに実装とドキュメントが違うこともあるので気が抜けません。
今回ゲームのBGMにOgg vorbisを使えないかという相談を受けました。
しかしOpenSL ESは対応していないようです。
どうもOpenSL ES 1.1ならば対応している気配があるのですが、
VIVID Runtime SDKに含まれるのは1.0です。
1.0でもMP3ならば再生出来るのですが、MP3だとライセンス料が半端ないので使いにくいです。
もしかしたらVIVID Runtime側でライセンス処理をしてるかもしれませんが、その辺り不明です。
そこで今回はVIVID Runtime上で頑張ってOgg vorbisを再生してみます。
そもそもWaveの再生はあるのです。
SDKのサンプルにplaystreamというのがあり、これがメモリ上のWaveデータを再生しています。
ということは、vorbisデータをデコードして
このバッファにぶち込んでやれば再生出来るということになります。
そこで早速libogg-1.2.2とlibvorbis-1.3.2を入手しました。
私は未だにconfigureとかmakeとかよくわからんのですが、
要はCコードをVIVID Runtime SDKに含まれるクロスコンパイル環境でコンパイルしてやればいいと思うのです。
例えばoggならばこんな感じです。"C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 src\framing.c -o framing.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 src\bitwise.c -o bitwise.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-ar.exe" rcs libogg.a framing.o bitwise.o
※config_types.hにconfigureでOS判定して埋め込む部分があったのでそこだけは手動で解決しています。
同じ感じでvorbisの方も作成します。
作成したライブラリとヘッダを次のフォルダに配置します。$VIVID_RUNTIME_SDK\tools\gcc_toolchain\arm-runtime-eabi\usr
※$VIVID_RUNTIME_SDKはVIVID Runtime SDKを展開したフォルダ
こうするとビルド時に参照することが出来ます。
あとはサンプルのコードにvorbisのデコード処理を入れて完了です。
で、実行してみたのですが、デコードが追いつきません。
エミュレータとはいえ、Phenom II 3GHzで足りないという状態です。
中でどんな処理してるんだろう・・・
これはもう少しなんとかならんかと調べてみたのですが、
Tremorという整数演算で高速デコードするバージョンがありました。
しかもARM用に最適化してあったりします。
これをチェックアウトしてきておりゃおりゃっとビルドします。"C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 mdct.c -o mdct.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 block.c -o block.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 window.c -o window.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 synthesis.c -o synthesis.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 info.c -o info.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 floor1.c -o floor1.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 floor0.c -o floor0.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 vorbisfile.c -o vorbisfile.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 res012.c -o res012.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 mapping0.c -o mapping0.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 registry.c -o registry.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 codebook.c -o codebook.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-gcc.exe" -I include -c -fpic -mno-thumb-interwork -Wall -O3 sharedbook.c -o sharedbook.o "C:\vivid_runtime_sdk_1_1\tools\gcc_toolchain\bin\arm-runtime-eabi-ar.exe" rcs libvorbisidec.a mdct.o block.o window.o synthesis.o info.o floor1.o floor0.o vorbisfile.o res012.o mapping0.o registry.o codebook.o sharedbook.o
※os.hのエンディアンの設定がよろしくないので調整しています。
出来たlibvorbisidec.aでデコードしてみたところなんとか再生できました。
本当になんとか・・・といった感じで、稀にデコードが追いついていません。
あとはFPUを使って最適化でなんとかならんかなと思うのですが、
ARMのFPUを使ったデコーダは見つけられませんでした。
さすがに自分で書く気も起きません。
エミュレータで厳しくても実機ならいけるんじゃないか?と思わなくもないのですが、
今は手元に実機がないんですよねぇ・・・。Xperia arcでも買おうかしら。
今回使ったファイル