前書き(言い訳)
年末年始は、ぼちぼち実装を始めようと思っていた企画中のプロジェクトも思うように進める事ができず、生活リズムばかり崩れていました。明けてしまって残念です。このままの状態を続けると更に状況が悪くなる事は(「長い時間」という高い代償を払って)判り切っていますので、何かしら別の生産的な活動をしようと思い直しました。
それ程労力と時間がかからず、かつある程度の達成感があるものが良さそうです。という訳で白羽の矢が立ったのが、ライセンス関連の問題を調べるのが面倒で公開していなかった、各種のサウンドデコーダ。加えて、Managed DirectX用のライブラリです。前々から作ろうとしている(そしてその度に頓挫する)ゲームで使おうと思って作ったものの、未だろくに役に立っていないのですが、ウェブ上でざっと(かなりいーかげんに)調べてみると、それ程需要が無さそうでもない為、単独公開してみよう、というちょっとせこい理由からです。ついでに、オープンソースにしようと思っている企画中のプロジェクトでも使う予定がある為、これもオープンソースで公開してみてもいいんじゃないかな、と。
公開する予定のもの
まず、実際にデコードをするコードが含まれる、Win32のネイティブDLL群です。これらは、.NET Frameworkのプラットフォーム呼び出し(Platform Invoke)で扱えるように修正を加えたものです。そのままでも.NET言語から使えますが、扱いをより簡単にする為に、後述するデコーダのインターフェイスが用意されます。
次のリストに示す各フォーマットには、それぞれ専用のDLLが用意されます。これらのDLLとそのソースコードはライブラリの改変物であり、元のライブラリと同じライセンスで提供する予定です。
- Vorbis、特にOgg Vorbis。Xiph.Org Foundationのリファレンスデコーダ(修正BSDライセンス)を利用します。
- FLAC。Native FLAC、Ogg FLAC。同様にXiph.Org Foundationの管理するリファレンスデコーダ(修正BSDライセンス)を利用します。
- MP3。mpg123の一部であるlibmpg123(LGPL 2.1)を利用します。
- 勿論、RIFFコンテナに入った生のPCMデータを持つWaveファイルもサポートします(これには特別なDLLは要りません)。
次に、これらの扱いを容易にする為のC#によるインターフェイスの実装です。インターフェイスISoundDecoder
には、PCMデータを読み取る為のint ISoundDecoder.Read( Array data, int offset, int count )
メソッドだとか、(デコード後の)PCMデータのサンプル長を得る為のlong ISoundDecoder.Length { get; }
プロパティなどが用意されます(される予定です)。例えばOgg Vorbisの為のISoundDecoder
の実装は、前述のプラットフォーム呼び出し用のWin32 DLLの内、Ogg Vorbis用のDLLを利用しながら、このインターフェイスの実装に要求される機能を実現します。利用方法は(仕様が大きく変わらなければ)大体こんな感じになる予定です。
// Ogg Vorbisファイルsample.oggをデコードする場合 using ( ISoundDecoder decoder = new OggVorbisDecoder( File.OpenRead( "sample.ogg" ) ) ) { SoundFormat format = decoder.Format; byte[] data = new byte[ 1 * format.BytesPerSecond ]; // 先頭から1秒間のPCMデータを読み出す decoder.Read( data, 0, 1 * format.BytesPerSecond ); // ...... // dataを使った何らかの処理 // ...... }
最後に、ISoundDecoder
とManaged DirectXのDirectSoundを使ってすぐに音を再生できるようにする為のISound
インターフェイスと、その実装であるStaticSound
とStreamingSound
です。実際の所、MDXでDirectSoundを使うのはあまり良い選択肢ではないようですが、とりあえず殆どできあがっているものがあるのでひとまずこれを利用可能にする予定です。興味が移ればSlimDX経由でDirectSoundとか、いっそASIOやOpenAL用の実装を書くかも知れません。はい、予定は未定です。
ISoundDecoder
とその実装や、ISound
とその実装などは、C#で書かれ、元のライブラリからはソースコードとしてもバイナリ(あるいはアセンブリ)としても独立しており、恐らくLGPL的にも「ライブラリを利用するプログラム」扱いになると思うので(もしここをライセンスに詳しい方が読んでおられて、これが誤りだと気付いたら是非お教え願います)、条文が簡潔な修正BSDライセンスで提供するつもりです。LGPLはひとまずLGPL 2.1の参考訳から読んでみようかと思ったのですが、あまりの条文の長さの前に打ちのめされ、精読する気になりません......
公開予定時期
以前自分用に作ったものがあるので、殆ど同等の機能を有するライブラリは既にありますが、改めてちゃんとライセンスを読んだり、元になるライブラリの最新版を持ってきたり、汚い所をある程度書き直したりするつもりなので、若干時間を取って作業したいと思います。とは言えあまりこれに時間をかけすぎると目的の一つ(やる気回復)が失われるので、近い内にするつもりです。一月末には例のドタバタイベントがあるので、それより前に終わらなければ二月上旬を目処に公開できるよう努力します。
さあ、これで後には退けなくなった(のかどうかは、こんな僻地での宣言では知る由も無い)。