Wav-файлы в проигрывателе Windows Media помещают в очередь элементы, которые не воспроизводятся время от времени с C#

Я делаю приложение, которое показывает токены на экране, как A0001 Counter 1. Каждый из токенов "A","0","0","0","0" "Counter" "1" имеет файлы WAV, хранящиеся в папка АНГЛИЙСКИЙ в моем проекте как A.wav, 0.wav,0.wav и т. д. Теперь я использую wmplib.dll и запускаю vs 2012 на Win 7 64 бит. Я пытался использовать один поток, как

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 bit. Теперь, когда я пытаюсь использовать его в XP 32-битной версии, звук иногда перекрывается, а иногда не воспроизводится. Поэтому я использовал альтернативный способ, используя фоновый поток. Код как ниже.

Проблема с этим заключается в том, что элементы в очереди, т.е. URL файлов, таких как C:\project path\ENGLISH\A.wav, C:\project path\ENGLISH\0.wav и т. д. помещаются в очередь и затем добавляются в плейлист проигрывателя 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
        }        

1 ответ

Если вы хотите выполнять каждые 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();
            };  
Другие вопросы по тегам