2011-08-15 96 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中,我不能說與XNA的SL 5。 –

+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

以這種方式播放的所有聲音都是相互獨立的。這意味着你可以同時播放一個,兩個或十個聲音。 – alf

0

你的問題是,你的計時器也許不是打響了第一跳和FrameworkDispatcher.Update()不跑了。然後Play將拋出System.InvalidOperationException

更好地在應用程序中調度XNA Events。

完整指南:XNAAsyncDispatcher

+0

我給你的鏈接指南去 – Burf2000