2011-08-15 24 views
0

私はWP7で簡単なゲームを構築しており、MediaPlayerを使用してバックグラウンドミュージックを追加しようとしています。問題はそれだけで爆弾ですWindows Phone 7:Silverlightと音楽再生

{ "予期しないエラーが発生しました。"} {のSystem.ExceptionのSystem.InvalidOperationException}

コード

try 
       { 
        MediaPlayer.Stop(); 
        // Timer to run the XNA internals (MediaPlayer is from XNA) 
        DispatcherTimer dt = new DispatcherTimer(); 
        dt.Interval = TimeSpan.FromMilliseconds(33); 
        dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; 
        dt.Start(); 

        Uri pathToFile = new Uri("Audio/music.m4a", UriKind.Relative); 
        Song playingSong = Song.FromUri("Music", pathToFile); 
        MediaPlayer.Play(playingSong); 
       } 
       catch (Exception e) 
       { 
        musicFailed = true; 
        Console.WriteLine("Exception: {0}", e.ToString()); 
        MessageBox.Show("Warning, music failed to play however you can still continue to play your game."); 
       } 
      } 

私は、ファイルを変換し、いくつかの調整を試してみましたmp3、異なるパスなどファイルは常にコピー用にマークされており、コンテンツタイプはです。ディスパッチャを削除しようとしています。

+0

、私はSilverlightが.WMAファイルを必要だと思います。編集:少なくともSilverlight 4では、私はSL 5のXNAと話すことはできません。 –

+0

デバッガが接続されているときにこれが起こりますか?これを試してみてくださいhttp://msdn.microsoft.com/en-us/library/gg180729%28v=vs.92%29.aspx –

+0

はい、デバッガが接続されています – Burf2000

答えて

1

あなたのオーディオファイルをWAV形式に変換することができます場合は、XNAとSoundEffectとSoundEffectInstanceクラス使用して試すことができます:これが機能する

SoundEffect se = SoundEffect.FromStream(isolatedStorageFileStream); 
SoundEffectInstance sei = se.CreateInstance(); 
sei.Play(); 

を、あなたはXNAライブラリを参照する必要があります(Microsoft.XNA .Framework)と、このようにフレームワークを初期化します。

App.xaml:

<Application> 
    <Application.ApplicationLifetimeObjects> 
     <local:XNAFrameworkDispatcherService /> 
     ... 
    </Application.ApplicationLifetimeObjects>  
</Application> 

を作成するとアプリの名前空間のどこかに、このクラス(この名前空間前のXAMLの参照で「ローカル」):

public class XNAFrameworkDispatcherService : IApplicationService 
{ 
    private DispatcherTimer frameworkDispatcherTimer; 
    public XNAFrameworkDispatcherService() 
    { 
     this.frameworkDispatcherTimer = new DispatcherTimer(); 
     this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333); 
     this.frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick; 
     FrameworkDispatcher.Update(); 
    } 
    void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); } 
    void IApplicationService.StartService(ApplicationServiceContext context) { this.frameworkDispatcherTimer.Start(); } 
    void IApplicationService.StopService() { this.frameworkDispatcherTimer.Stop(); } 
} 
+0

これは他のサウンドファイルに干渉しませんか? – Burf2000

+0

このようにして再生されるすべての音は、互いに独立しています。つまり、1,2、または10の音を同時に演奏させることができます。 – alf

0

あなたの問題は、あなたのタイマーが多分最初のダニを解雇しないとFrameworkDispatcher.Update()が走っていないということです。その後PlaySystem.InvalidOperationExceptionをスローします。

アプリケーションでXNAイベントをグローバルにディスパッチする方が効果的です。

コンプリートガイド:それは価値がある何のためXNAAsyncDispatcher

+0

私はあなたのリンクガイドを与える – Burf2000

関連する問題