2014-04-01 45 views
0

我正在做一個應用程序,它顯示A0001計數器1等屏幕上的標記。每個標記「A」,「0」,「0」,「 0「,」0「」計數器「」1「有wav文件保存在我的項目中的文件夾英語在A.wav,0.wav,0.wav等現在我使用wmplib.dll並運行vs 2012 Win 7 64位。我嘗試使用單線程,如WAV文件在Windows Media Player中排隊的項目在C#時不能正確播放

new System.Threading.Thread(() => { 
//my code here 
}).Start(); 
Thread.Sleep(700); //I know this is not a good way to use threads. 

此代碼完美工作在Win 7 64位。現在,當我嘗試在XP 32位上使用它時,音頻有時會重疊,有時無法播放。所以我使用了backgroundworker線程的另一種方法。代碼如下。

與此問題是,排隊的項目,即。像C:\project path\ENGLISH\A.wav,C:\project path\ENGLISH\0.wav等文件的URL排隊到隊列中,然後添加到Windows Media播放器播放列表中。但他們沒有按順序打球,有時不同步。

public void playAudiofile(String counter_prefix, String counter_name, String token_number) 
     { 
      String[] token_langs = Config.getTokenLanguages(token_number); 

      /*BUZZER*/ 
      audio_annoucements.Enqueue(audio_file_dir + "buzzer.wav"); 

      foreach (String tlang in token_langs) 
      { 
       String lang = tlang.Trim().ToUpper(); 
       try 
       { 
        if (lang != "NONE") 
        { 
         /*TOKEN*/ 
         audio_annoucements.Enqueue(audio_file_dir + "Token.wav"); 

         /*TOKEN NO*/ 
         token_number = token_number.ToUpper(); 
         char[] tokens = token_number.ToCharArray(); 
         foreach (char token in tokens) 
         { 
          if (Char.IsLetter(token)) 
          { 
           audio_annoucements.Enqueue(audio_file_dir + token + ".wav"); 
          } 
          else 
          { 
           audio_annoucements.Enqueue(audio_file_dir + token + ".wav"); 
          } 
         } 
         /*COUNTER*/ 
         counter_prefix = counter_prefix.ToUpper(); 
         audio_annoucements.Enqueue(audio_file_dir + "COUNTER.wav"); 
         /*COUNTER NAME*/ 
         counter_name = counter_name.ToUpper(); 
         char[] counters = counter_name.ToCharArray(); 
         foreach (char counter in counters) 
         { 
          if (Char.IsLetter(counter)) 
          { 
           audio_annoucements.Enqueue(audio_file_dir + counter + ".wav"); 
          } 
          else 
          { 
           audio_annoucements.Enqueue(audio_file_dir+ counter + ".wav"); 
          } 
         } 
        } 
       } 
       catch (Exception) { } 
       if (!backgroundWorker1.IsBusy) 
       { 
        timer1.Stop();// i turn off the timer so that backgroundworker can run properly without issues. I turn it on later. 
        backgroundWorker1.RunWorkerAsync(); 
       } 
      } 
     } 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
       String tmpPlaylist = "tmpPlaylist"; 
       WMPLib.IWMPPlaylist pls; 
       WMPLib.IWMPPlaylistArray plItems; 
       WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer(); 
       plItems = mediaPlayer.playlistCollection.getByName(tmpPlaylist); 
       if (plItems.count == 0) 
       { 
        pls = mediaPlayer.playlistCollection.newPlaylist(tmpPlaylist); 
       } 
       else 
       { 
        pls = plItems.Item(0); 
        pls.clear(); 
       } 

       while (audio_annoucements.Count > 0) 
       { 
        WMPLib.IWMPMedia m1 = mediaPlayer.newMedia(audio_annoucements.Dequeue().ToString()); 
        pls.appendItem(m1); 
       } 
       mediaPlayer.currentPlaylist = pls; 
       mediaPlayer.controls.play(); 

     } 

     private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      timer1.Start();// theres a 1 second timer in the form that checks db entries 
     }   
+0

添加問題,並記下試圖運行你的代碼可以幫助尋找解決方案時,什麼不順心。 – Alexey

+0

這個問題和說明都存在。到目前爲止,後臺處理程序需要排隊,因爲多次按鍵會導致媒體播放器的聲音一次播放而不是順序播放。 – user3484406

回答

0

如果要執行每700毫秒嘗試:

System.Timers.Timer t = new System.Timers.Timer(700); 
t.Start() 
t.Elapsed += (object s1, System.Timers.ElapsedEventArgs e1) => { 
       new System.Threading.Thread(() => { 
       //my code here 
       }).Start(); 
      }; 
相關問題