ななしさんからIMA ADPCMのmanaged decoderを提供していただいたので、csvorbisと同様にカスタムMediaStreamSourceとして実装してみました。ソースはgithub上に、テストページはこちらに置いておきます。ソースからのビルドにはmono/mcs/moonのtrunk版が必要です。monodevelopのソリューションファイルもありますが、Moonlightアドインでのビルドは出来ないと思います。が、VS2008のプロジェクトを自作してビルドすることもおそらく可能でしょう。
ちなみに、こうやってサンプルを出してはいますが、サンプルコード自体はproof of conceptでしかないので、本格的なものが必要な時は、あんまし参考にしないでください(たとえばGetSampleAsync()は非同期呼び出しを実行して直ちに戻るべきで、同期でコーディングすべきではないはずです。1)。
あとわたくしADPCMデータなんてもう全然お目にかかっていないので(拡張子ppcとかで試せばいいんでしょうか?w)、提供していただいたサンプルでの確認しかしていません。他のADPCMとの違いも分かってなかったりして。
コメント
n7shi — 03/29/2009 20:55:30
コードを提供した七誌です。早速の実装ありがとうございます。残念ながらテストページが以下のエラーで動きません。(IE8+SL3β)
メッセージ: Unhandled Error in Silverlight 2 Application
Code: 2028
Category: ParserError
Message: 名前が既にツリーに存在します: AdpcmMediaStreamSourceTest。
File:
Line: 0
Position: 0
ソースを取得して VWD 2008 Express でビルドしてみたところ、上記のエラーは解消しましたが、メディアを開くと例外も出さずに強制終了してしまいます。MoonVorbisをVWD2008EEでビルドしてみたところ正常動作しました。比較してみた所、以下の修正で動くようになりました。
// AdpcmMediaStreamSource.csの110〜112行目
wfx.BlockAlign = (short)(this.source.Channels * 2);
wfx.BitsPerSample = 16;
wfx.AverageBytesPerSecond = wfx.SamplesPerSec * wfx.Channels * 2;
それからIMA ADPCMのコードですが、私のミスでヘッダの読み込み部分でスキップが抜けていて、開くときに大変重くなっていました。修正箇所は以下の通りです。
http://pastebin.com/pastebin.php?diff=f51bd6a0
atsushienoさんの修正を取り込んだIMA_ADPCM.csの最新版は以下の通りです。
http://pastebin.com/f71c36986
これらの修正を全て取り込んでVWD2008EEでビルドできるようにしたAdpcmMediaStreamSourceを以下に置いておきます。
http://cid-fb45e1f8ce8b532e.skydrive.live.com/self.aspx/.Public/Others/IMA%7C\_ADPCM-20090329.zip
atsushieno — 03/29/2009 23:07:10
おお、そうなのですか。修正版ありがとうございます。moonlightだと許されるパッケージングのパターンがどうもあるみたいですね…。修正版は後ほどgithubにチェックインさせていただきます。
Footnotes
-
ってもたかだか音声だしな…。ちなみにネタ元のMSのmp3サンプルの構造がこれ。 ↩