2011-01-14 25 views
0

guiスレッドで同期してwavファイルを再生したいのですが、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; 
    } 

、およびGUIスレッドを強制的に「凍結」手動その後、GUIを別のスレッド上でオーディオを再生して:ここでは

は私のコードは次のようになります。サウンドファイルの長さを待つ。私はロードタイムアウトを長くしようとしましたが、それは何もしませんでした。

wavファイルの期間を取得する最良の方法が、私/ Microsoft以外の誰かが書いたコードを使用しないとどうなるのかよく分かりません。私は、ファイルサイズを知っているので、これを計算することができ、私が再生しようとするすべてのファイルにわたって、すべてのエンコードプロパティ(ビットレート、サンプルレート、サンプルサイズなど)が一貫していると仮定します。誰かがこの情報を使ってwavファイルの期間を計算する方法を詳しく説明できますか?つまり、PlaySyncがなぜ早く帰ってくるのかについてのアイデアが誰にもない場合です。

編集:ノートの

:私はしばらく前にVB 6で同様の問題が発生したが、それは私がここでの問題であることを疑わないんタイムアウト、によって引き起こされました。短い(< 1分)ファイルは正常に再生されているように見えるので、長いファイルを手動で編集して、複数回の呼び出しで個別に再生することにします。

追加情報:同じファイルが同時に一貫して停止することに気付きました。ファイルはAudacityを使用して作成されました。 PlaySyncはAudacity製作とは異なるファイルの特定のエンコーディングを期待している可能性はありますか?

+0

なぜ「再生」の代わりに「PlaySync」を使用しますか? UIスレッドをブロックしない方が良いでしょうか? – AShelly

+0

デバッガでコードを歩いていると、実際に 'PlaySync? 'で実行が停止しています –

+0

@AShellyは私の場合、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を使用していますこれにより、より大きなwavファイルをより確実に再生することができます。

関連する問題