WP7アプリで音楽を鳴らす

Windows Phone 7デバイスに入れた好きな音楽をアプリケーションで演奏する方法を紹介します。

XNAフレームワークを使って簡単に実現できます。
アプリケーションプロジェクトの参照設定に、Microsoft.XNA.Frameworkアセンブリを追加します。
アプリケーション内で、デバイスに登録されているメディアコンテンツのリストを取得します。

 var mediaLibrary = new Microsoft.Xna.Framework.Media.MediaLibrary();

mediaLibraryのSongsというプロパティで、デバイスに入っている楽曲それぞれにアクセスが可能です。例えば、3曲目なら、Sogs[3]、こんな感じ。
型はMicrosoft.XNA.Framework名前空間のSongクラス。NameやAlbum、Artistなどといったプロパティが用意されており、曲名やアーチスト、アルバム名を参照可能です。

そして、以下の様なコードを書けば、その曲を鳴らせます。

 Microsoft.Xna.Framework.Media.MediaPlayer.Play(mediaLibrary.Songs[3]);

 演奏をやめたい時は、Stop()メソッドをコールします。MediaPlayerクラスには、Stateというプロパティも用意されていて、そのプロパティを参照すれば現在MediaPlayerが演奏中かそうでないかを判別できます。

以上、WP7の小ネタでした。

 ・・・と、Silverlightアプリでやってみると動かない!!

ってことに気がつきました。MediaPlayerは、Xna Frameworkのクラスで、こういった連続的に動作するようなクラスは、ちゃんとディスパッチループを回さないと駄目なんですね。マイクロフォンの場合と同じに。
てな訳で、MediaPlayerのPlayメソッドをコールする遥か以前のページを表示した後一回だけコールされる場所(OnNavigateToとかLoadedとか)で、以下のコードを書いて回しておきます。

            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(50);
            timer.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
            timer.Start();

timerは、System.Windows.Threading.DispatcherTimerクラスです。ページが閉じる時、このtimerのStopメソッドをコールしましょうね。それから、MediaPlayerの停止も忘れずに。