2011-04-21 162 views
4

我正在創建一個WP7應用程序,需要在循環播放的背景音樂上播放各種音效(按下按鈕時)。背景音樂通過按下按鈕1啓動並循環播放。當我按下按鈕3(觸發聲音效果)時,首次按下後,音效就會疊加在背景音樂上。但是,當我再次按下按鈕3時,背景音樂停止。我無法弄清楚爲什麼會發生這種情況!?我已經粘貼了以下代碼的相關部分。將不勝感激任何幫助。同時播放兩個聲音c#

public partial class MainPage : PhoneApplicationPage 
{ 
    SoundEffect soundEffect; 
    Stream soundfile; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 



    static protected void LoopClip(SoundEffect soundEffect) 
    { 
     { 
     SoundEffectInstance instance = soundEffect.CreateInstance(); 
     instance.IsLooped = true; 
     FrameworkDispatcher.Update(); 
     instance.Play(); 
     } 
    } 

    public void PlaySound(string soundFile) 
    { 
     using (var stream = TitleContainer.OpenStream(soundFile)) 
     { 

      var effect = SoundEffect.FromStream(stream); 
      effect.Play(); 
     } 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     soundfile = TitleContainer.OpenStream("BackgroundMusic.wav"); 
     soundEffect = SoundEffect.FromStream(soundfile); 
     LoopClip(soundEffect); 
    } 


    private void button3_Click(object sender, RoutedEventArgs e) 
    { 
     PlaySound("sound3.wav"); 
    } 

} 

}

+0

您是否嘗試線程或後臺工作? – Marshal 2011-04-21 16:44:02

+0

這與Java中發生的事情完全相反...... – JavaAndCSharp 2011-05-23 18:47:17

回答

4

這應該工作,如果你總是用實例工作,所以你的代碼改成這樣,它應該清理的問題:

public partial class MainPage : PhoneApplicationPage 
{ 

    SoundEffectInstance loopedSound = null; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    static protected void LoopClip(SoundEffect soundEffect) 
    { 
     loopedSound = soundEffect.CreateInstance(); 
     loopedSound.IsLooped = true; 
     loopedSound.Play(); 
    } 

    public void PlaySound(string soundFile) 
    { 
     SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(soundFile, UriKind.Relative)).Stream); 
     SoundEffectInstance instance = sound.CreateInstance(); 
     instance.Play(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundMusic.wav", UriKind.Relative)).Stream); 
     LoopClip(sound); 
    } 


    private void button3_Click(object sender, RoutedEventArgs e) 
    { 
     PlaySound("sound3.wav"); 
    } 

} 

上面的例子假設你的聲音文件設置與生成操作=內容和位於頂級目錄中。

+0

非常感謝!不幸的是,我只是嘗試了你的代碼,我有相同的原始問題 - button3被點擊超過2次後,背景音樂停止(第一次點擊button3就可以正常工作..) – sv77 2011-04-21 20:49:35

+0

@ sv77你是對的。我跑了我的代碼,並重復你的問題。我已經更新了我的代碼,現在它應該適合你。關鍵是要保持循環的soundeffectinstance在它自己的變量中。 – theChrisKent 2011-04-21 21:00:49

+0

現在完美工作,很有意義。謝謝! – sv77 2011-04-21 21:32:18

0

你需要從一個單獨的線程發揮各自的聲音。

這裏似乎正在發生的是,不同的Play方法調用互相干擾,因爲它們在同一個線程中。

試着把背景音樂放在一個單獨的線程中,看看是否解決了你在問題中提到的問題。如果是這樣,也將其他人分開。

+0

謝謝。請給我一些關於如何開始一個新線程的更多細節?我以前沒有做過,似乎也無法讓它編譯。 [Thread backgroundThread = new Thread(new ThreadStart(LoopClip))]; – sv77 2011-04-21 17:47:37

+0

從你的評論中的代碼,你應該改用'Thread backgroundThread = new Thread(new ParameterizedThreadStart(LoopClip))'或類似的東西,並使用'ParameterizedThreadStart'提供的參數傳入參數('soundEffect')。 – 2011-04-21 19:13:35

+0

仍有問題:「LoopClip沒有與委託相匹配的過載。」我能夠使用ThreadStart調用一個非參數化的函數,然後調用LoopClip。然而,當程序運行時,我仍然有相同的原始問題。我應該在button1_Click或其他地方創建一個新線程嗎? – sv77 2011-04-21 20:19:28