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
}
添加問題,並記下試圖運行你的代碼可以幫助尋找解決方案時,什麼不順心。 – Alexey
這個問題和說明都存在。到目前爲止,後臺處理程序需要排隊,因爲多次按鍵會導致媒體播放器的聲音一次播放而不是順序播放。 – user3484406