いろいろなことがあって...というほどでもないけど、しばらくここに書いていなかった。とりあえず直近の話としては、また開発機を修理することになってしまい、来週1週間をmacbookで過ごさなくてはならなくなってしまった。仕事できるかどうかも不明な状態なのだけど、とりあえずWindowsやLinuxで使用していたソフトはある程度シームレスに使えるようになりたい。
最近はwine 1.2がリリースされて、それなりにWindowsアプリケーションがMac上でも動くようになったのだけど、ひとつ動いてほしかったのが某falcomのゲームから取り出した音楽...と言っても生のoggファイルなのだけど...を再生するツールだ。ただ再生するだけならoggなのでVLCなどでも出来るのだけど、oggファイル中に含まれているLOOPSTART, LOOPLENGTHを読み取って、永久ループで聴けるようにしたい。意外とこのニーズを満たすソフトで、Macでもちゃんと動作するものが見つからない。
仕方ないので、自分でC#で作ることにした。本当は前々からcsvorbisを使って作ってはみたかったのだけど、先送りにしていた。いろいろなアプローチが考えられたのだけど、とりあえず手近に見つかったものに、DragonOggという、OpenTK.OpenALを使ったアリモノのプレイヤーライブラリがあった。というわけで、今回はとりあえずこれを改造したものだ。
falcom-bgm-player-dragonogg-20100904.zip
これはDragonOggにプレイヤーのプロジェクトを追加しただけなので、プログラム本体はfalcom-bgm-player/bin/Debug/falcom-bgm-player.exeということになる。まだ実験レベルなので、コマンドラインにファイル名を渡さないといけない、不親切なツールだ。
プレイヤーライブラリにはループを処理してくれる機構が無かったので、少し手を加えてやってみようとしたのだけど、まだこのライブラリのバッファ処理のクセがわからないので、「LOOPSTARTまでThread.Sleep()して、それからLOOPLENGTHだけThread.Sleep()する。終わったらLOOPSTARTにseekする」というたいへんやっつけ仕様の実装になっている。
これではシーク部分で音がブツ切れになったりして、時としてたいへん望ましくないのだけど、とりあえずバッファの終端まで再生したら元に戻るという仕組みが実現できていないので(書きながら気づいたのだけど、バッファの終端まで処理してはいけない気がする)、とりあえずは妥協実装だ。これにそんなに長時間かけるわけにはいかない。
そのうち自前でOpenALや他のプラットフォーム別のライブラリに統合してアプリケーションとして配布できるようにしようと思う。といってもローカルファイルが自由に読めないiPhoneは論外だけど。