2011-01-14 2 views
0

Я хочу играть в wav-файл синхронно по потоку gui, но мой звонок в PlaySync возвращается раньше (и преждевременно останавливает воспроизведение). Файл wav составляет 2-3 минуты.SoundPlayer.PlaySync останавливается преждевременно

Вот что мой код выглядит следующим образом:

 //in gui code (event handler) 
     //play first audio file 
     JE_SP.playSound("example1.wav"); 

     //do a few other statements 
     doSomethingUnrelated(); 

     //play another audio file 
     JE_SP.playSound("example2.wav"); 

    //library method written by me, called in gui code, but located in another assembly 
    public static int playSound(string wavFile, bool synchronous = true, 
     bool debug = true, string logFile = "", int loadTimeout = FIVE_MINUTES_IN_MS) 
    { 
     SoundPlayer sp = new SoundPlayer(); 
     sp.LoadTimeout = loadTimeout; 
     sp.SoundLocation = wavFile; 
     sp.Load(); 

     switch (synchronous) 
     { 
      case true: 
       sp.PlaySync(); 
       break; 
      case false: 
       sp.Play(); 
       break; 
     } 

     if (debug) 
     { 
      string writeMe = "JE_SP: \r\n\tSoundLocation = " + sp.SoundLocation 
       + "\r\n\t" + "Synchronous = " + synchronous.ToString(); 
      JE_Log.logMessage(writeMe); 
     } 

     sp.Dispose(); 
     sp = null; 

     return 0; 
    } 

Некоторые вещи, которые я думал, являются таймаут загрузки и воспроизведения аудио в другом потоке, а затем вручную «заморозить» на графический интерфейс, заставляя графический интерфейс нить для ожидания продолжительности звукового файла. Я попытался удлинить таймаут загрузки, но ничего не сделал.

Я не совсем уверен, что лучший способ получить продолжительность wav-файла - это не использовать код, написанный кем-то, кто не я/Microsoft. Я предполагаю, что это можно вычислить, так как я знаю размер файла, и все свойства кодирования (битрейт, частота дискретизации, размер выборки и т. Д.) Согласованы во всех файлах, которые я намерен воспроизвести. Может ли кто-нибудь выяснить, как рассчитать продолжительность wav-файла, используя эту информацию? То есть, если никто не знает, почему PlaySync возвращается раньше.

редактирует:

Из Примечание: Я столкнулся с аналогичной проблемой в VB 6 некоторое время назад, но это было вызвано тайм-аут, который я не подозреваю, что проблема здесь. Короче (< 1min) файлы кажутся прекрасными, поэтому я могу решить вручную отредактировать более длинные файлы, а затем воспроизвести их отдельно с несколькими вызовами.

Дополнительная информация: Я заметил, что один и тот же файл одновременно останавливается. Файлы были созданы с использованием Audacity. Возможно ли, что PlaySync ожидает некоторую кодировку файлов, отличающихся от того, что я создал Audacity?

+0

Почему вы хотите использовать 'PlaySync' вместо' Play'? Не было бы лучше не блокировать поток пользовательского интерфейса? – AShelly

+0

Если вы просматриваете свой код в отладчике, выполняется ли фактически выполнение на 'PlaySync'? –

+0

@ В самом деле, в моем случае действительно желательно блокировать поток gui. (Я знаю, странно.) – JeffE

ответ

0

Только в случае, если кто-либо сталкивается с проблемами с игрой большого файла WAV синхронно, вот метод, который я написал, который использует WMP в качестве альтернативы:

public static int playSoundWMP(string soundFile, bool synchronous = true) 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     wmp.URL = soundFile; 
     wmp.controls.play(); 

     Thread.Yield(); 

     while (wmp.playState == WMPLib.WMPPlayState.wmppsTransitioning) 
     { 
      Application.DoEvents(); 
      Thread.Yield(); 
     } 

     int duration = Convert.ToInt32(wmp.currentMedia.duration * 1000); 
     double waitTime = wmp.currentMedia.duration; 

     if (synchronous) 
     { 
      Thread.Sleep(duration); 
     } 

     long elapsed = sw.ElapsedMilliseconds; 
     sw.Stop(); 
     sw = null; 

     return (int) wmp.currentMedia.duration * 1000; 
    } 

Этот метод использует WMP для воспроизведения звукового файла вместо из класса SoundPlayer, поэтому он может более надежно воспроизводить более крупные файлы wav ...