2011-12-27 35 views
1

我有播放存储在一个ArrayList音符下面的播放方法:C#设定时间段和播放声音存储在一个ArrayList连续

public void Play(Duration d){ 


      int duration = 1; 

      if (d == Duration.SemiBreve) 
      { 
       duration = 16; 
      } 

      else if (d == Duration.DotMin) 
      { 
       duration = 10; 
      } 

      else if (d == Duration.minim) 
      { 
       duration = 8; 
      } 

      else if (d == Duration.Crotchet) 
      { 
       duration = 4; 
      } 

      else if (d == Duration.Quaver) 
      { 
       duration = 2; 
      } 

      else if (d == Duration.SemiQuaver) 
      { 
       duration = 1; 
      } 

      player = new SoundPlayer(); 

      player.SoundLocation = "pathToLocation"; 


      //set timer 
      time = new Timer(); 
      time.Tick += new EventHandler(clockTick); 
      time.Interval = duration * 150; 
      player.Play(); 
      time.Start(); 

     } 

当我打电话的一个按钮的方法:

private void PlayButton_Click(object sender, EventArgs e) 

{ 

     //Loops through the collection and plays each note one after the other 
     foreach (MusicNote music in this.staff.Notes) 
     { 
      music.Play(music.Dur) 

     } 
    } 

只有最后一个音符被播放。使用PlaySync()播放所有音符,但持续时间无法识别。我也尝试使用这样的线程:

foreach (MusicNote music in this.staff.Notes) 
      { 
       Thread t = new Thread(playMethod=>music.Play(music.Dur)); 
       t.Start(); 
       t.Join(); 

      } 

但它也不起作用。有关如何让文件像PlaySync一样连续播放,但使用其设定的时间长度的任何建议?

+0

您必须添加一些逻辑来一次播放一个音符。尝试让它工作,以便在点击按钮后播放一个音符。然后添加计时器。 – CodingBarfield 2011-12-27 10:55:00

回答

3

你不等待任何地方的计时器。所以实际上所有音符几乎同时播放,导致最后一个音符被有效地听到。


更新:使用System.Timers.Timer类的路要走被注册为Elapsed事件的处理程序,一个接一个的事件处理程序播放的音符。这样你可以避免冻结用户界面。

另一种选择是在后台线程中播放和使用Thread.Sleep等待。在这里你必须确保线程根据UI的状态停止(即使用关闭当前对话等)。

在这两种情况下,为了避免竞争条件,您必须解决并发访问staff.Notes或为了播放而制作副本。

+0

所以我猜我必须等待按钮方法中的计时器,而不是music.Play方法?你如何等待计时器,所以你使用timer.Elapsed?谢谢,并请原谅这些问题,如果他们很简单,但我从来没有使用计时器课,并作为我去研究 – Matt 2011-12-27 11:26:51

+0

我设法修复它在一个非常简单的方法,我设置主线睡觉的同时每个音符的计时器间隔(直到声音结束播放)。这可以满足我的特殊需求,但是由于整个程序被阻止,您能否提出一个更好的方法?无论哪种方式,您的答案导致我的解决方案,谢谢。 – Matt 2011-12-27 12:22:32