WindowsPhoneに内部リソースの音声ファイルを再生しよう!

WP7向けプログラミングTips 第2弾。飽きる前にガンガン書いてきましょう。

前回から作ってる美声時計の音声再生部 RefreshSound() の中身です。

private void RefreshSound()
{
//現在時刻取得
string uriTime = DateTime.Now.ToString("HHmm");
string uriSound = "sounds/"+ uriTime +".wav";
SoundEffect bisei = SoundEffect.FromStream(TitleContainer.OpenStream(uriSound));
FrameworkDispatcher.Update();
bisei.Play();
}

現在時刻は値渡せばいいんですが、ここだけ読む人用にきっちり取得して、それに対応する時刻読み上げの音声ファイルの相対パスを作成。んで、ここからが肝ですね。

現状のオーディオ再生方法はいくつかありますが、基本的なSilverlightのオーディオ再生はミュージックプレイヤー的イメージできっちり鳴らす方向っぽいようで、よくわかってないXAMLも関わってきますし、今回はスルー。代わりに、ゲーム作成側のXNAからオーディオ周りの機能を引っ張ってきて効果音として鳴らします。

まずはMicrosoft.Xna.FrameworkとMicrosoft.Xna.Framework.Audioの参照を追加して、SoundEffectクラスを使います。

んで、ゲーム周りを使わずにXNAのイベントを有効化するために、おまじないでFrameworkDispatcher.Update()

あとは再生するだけです。厳密にはCompositionTarget.Renderingでタイミングを制御してやるべきらしいですが、ゲームじゃないので適当で大丈夫でしょう。

さて、ここまで書きましたが、実はクリアできてない問題があります。この方法ではMP3が再生できません。

SoundEffectInstanceが効果音用のクラスなので処理の重い圧縮音源は対応しないんでしょうかね? MSDN読んでもよくわかんないけど、XNAの基本はXACTらしいのでそっち使えって事ですかね? 何かわかりましたら追記します。