• ベストアンサー

C#SundPlayerで同期再生が再生途中で停止

C#SoundPlayerクラスの同期再生PlaySyncメソッドで再生すると仕様と違って再生終了を待たずに曲の途中で停止してしまいます。何が原因なのか判断できずにとても困っております。ちなみに非同期再生のPlayメソッドでは上手く仕舞いまで再生できます。原因に心当たりの方がいらっしゃいましたら教えて頂けないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ソースも何も無いからどうやって処理しているのかわかりませんが… 一般的な要因として考えられるのは (1) データ読み込みがタイムアウトしていて途中までしか読み込まれていない。 確か、読み込み時間指定のプロパティがあったと思います。 (2) 再生中にメモリの再配置が発生してデータの連続性が途切れた。 再配置が起きないように読み込み先のメモリを固定する必要があります。 PlaySyncメソッドはPlayメソッドのように新しいスレッドを立てて動くのでなく、それまでの処理をしてるスレッドで動作します。したがって、この辺りの動作状況が異なってくる場合があります。

wumeda
質問者

お礼

ありがとうございました。演奏時間の長めの推定値を求め、その値を設定してもそれより短い時間で停止してしまうので、非同期再生で凌ぐことにしました。

wumeda
質問者

補足

早速のご回答ありがとうございました。以下に示すソースで実行しています。現在はコメント部を生かして凌いでいます。ご検討かたよろしくお願いもうしあげます。 System.Media.SoundPlayer player = null; ・ ・ try { player = new System.Media.SoundPlayer(waveFile); int time = player.LoadTimeout; //Console.WriteLine("player.LoadTimeout={0}", time); //以下は演奏時間の推測 //FileInfo finf = new FileInfo(waveFile); //double dln = (double)finf.Length; ; //time = (int)((dln / 55514000.0) * 311000.0 + 5000.0); //player.LoadTimeout = time + 100 ; //Console.WriteLine("player.LoadTimeout={0}", time); player.Load(); while (true){if(player.IsLoadCompleted){Console.WriteLine("player.Load completed", time);break;}} player.PlaySync(); //これを止めて以下の非同期再生にすると上手く終わる //player.Play(); //Thread.Sleep(time); } catch (Exception ex){Console.WriteLine("例外発生(SoundPlayComplete)" + ex.Message);}

関連するQ&A