書くことないです。

ayamadoriが独り言を呟く日記。

MIDPなOggプレーヤーは作れるか?

まともでSymbian SignedなOggプレーヤーがない*1んで、702NK時代に作ったOggライブラリが705NKでは再生できない。
で、Ogg VorbisデコーダからすべてMIDPで作れないかって話。
結論から言えば、現状では残念ながら無理なようだ。

いろいろ調べてみると、Tor-Einar JarnbjoさんがJ2SE向けに公開しているJ-OggJ2ME用に移植したというのを某所で発見。そこで、ご本人にメールしたところ*2開発中のJ2MEOggデコーダ(通称MEOgg)をいただけたので、試してみた。
現状、大きく見て問題点は2点。

デコード速度が遅い。

具体的には、OggファイルをWAVEにリアルタイムでデコードしつつ、それをJ2ME上のPlayerで再生することになる。
CD音源のWAVEファイルは16bit、44100Hz、2chだから、転送速度は16*2*44100=1411.2Kbps=176.4KB/s。
デコードはこれより速くないといけないんだが、現状いただいたMEOggをそのまま実行すると70KB/s程度。おかげで音が伸びる(笑)自前でリングバッファを実装すると120KB/s程度までは高速化できたけど、今度は音が途切れる。
ちなみにこれはPC*3上のエミュレータでの話。それでこの程度なんだから、ARM220MHzしかない705NKでは到底実用にならないだろう。

J2MEのPlayerがCD音源のWAVEを再生できない。

エミュレータではなく、実機705NKでの話。
MIDPのPlayerインスタンスはパス指定、InpueStream、DataSource*4から作れる。が、テストアプリ*5で実験してみると、パス指定以外でWAVEファイルを利用するとPlayerがPREFETCHEDにならず、そのうち例外を吐く。MEOggで試してみると『処理できない例外が発生しました。アプリケーションを終了しますか?』となる。つまるところ、デコード速度が上がったところで、この仕様が改善されないと再生は無理だということだ。


というわけで、結構がんばったつもり*6だけど、かなり時間の無駄だったっぽい。
まあ、キューやリングバッファ、ストリームのバッファリングのアルゴリズムが勉強できたことなど、個人的に収穫はあったから、良しとしよう。
誰かまともでSymbian SignedなOggプレーヤー作ってくれー(他力本願)

【追記】と思ったらSymbianコーデック作ってた
が、Symbian OS v9.4以上じゃないといけないから、v9.1である705NKには入れられない(´・ω・`)

*1:Pocket Oggは音がプチプチ切れる

*2:英語が通じたのはちょっとうれしい

*3:CPUはPentium4 2.4GHz、メモリ512MB

*4:MMAPI対応機種のみ

*5:HiisiさんのTonttu Playerを改造したもの

*6:人からもらったソースをいじっただけなのに?