私はSoundPlayer
クラスを使用して、自分のWPFアプリケーションでWAVファイルを再生しています。ファイルは短く、アプリケーションの一部であり、プログラム内で発生するイベントに応答して再生されます。ユーザは、どのサウンドが再生されるかを制御することはできず、自分自身でサウンドを再生することもできない。 WPF MediaPlayer
コントロールを使ってみましたが、そのコントロールに問題がありました。 SoundPlayer
はうまくいっていますが、問題があります。SoundPlayerの代替コンテンツ
本質的に、私は音のキューを維持し、それらが列に並ぶにつれて音を次々と再生する必要があります。状況によっては、再生中のサウンドを停止して別のサウンドを再生する必要があります。
- 私のコードは、サウンドの再生が終了したときに知っておく必要があります。だから私は
SoundPlayer
制御と相互に排他的であることが判明する二つの要求を持っています。 - 音はこれを実装するには、バックグラウンド
でプレイしている、私はSoundController
というクラスを作成しました。これはバックグラウンドスレッドを持ち、Thread
のDispatcher
を使用して、BeginInvoke
を使用して、サウンドの再生に使用するメソッドへの呼び出しをキューに入れます。このメソッドは、SoundPlayer.PlaySync
を呼び出してサウンドを再生する前に、SoundController
イベントのイベントを発生させ、その後、PlaySync
が返された後に別のイベントを発生させます。
私のUIスレッドでは、サウンドを停止する必要がある時点で、私はSoundController
クラスのStop
メソッドを呼び出します。これにより、SoundPlayer
のStop
メソッドが呼び出され、サウンドの再生が停止されます。そしてここで問題が起こるのです。 SoundPlayer.Stop
は音を止めませんが、サウンドが終了するのを待ってから戻ってきます。
これは私のGUIを停止させます。私は非同期に呼び出すことができますが、私のGUIは停止しませんが、サウンドは停止しません。
私が言ったように、WPF MediaPlayerは私たちのためには機能しませんでしたが、とにかくそれは残酷でした。イベントを発生させたり、バックグラウンドスレッドでサウンドを再生したり、再生を停止させたりするサウンドを再生する他の方法はありますか?
編集2012年6月26日:
これは、月を超えるためにここに出てきたと私は何の回答を得ませんしました。だから私はSoundPlayer
コントロールに他の選択肢がないと思います。
私は別の角度から問題に来る新しい質問を投稿します。
私はこの正確な問題をWPFではなくwinformsアプリで実行しましたが、このケースでは問題は疑問です。なぜ、/ 2番目のワーカースレッドを追加すると、ここで違いが出るのかが不明です( '.stop()'がクロススレッドで動作するかどうかは確かではありません)私はこの明日か月曜日に戻って、その周りに私の頭を包み込むようにするつもりですが、これについて詳述したり、スケルトンコードに入れたいと思う時間や動機があれば、私は非常に感謝しています:-) – DaveRandom
問題は、 'Play'メソッドを呼び出すスレッドがサウンドを再生中であるため、自分自身を中断できないことです。サウンドの再生が終了するまで「停止」の呼び出しを実行することはできませんが、それまでにはそれは遅すぎます。演奏中の音を止める唯一の方法は、別のスレッドから「停止」を呼び出すことです。だからこそ私はサウンドを演奏することに専念した別のスレッドを追加しました。私は私の答えを編集し、いくつかのスケルトンコードを追加します。 –
このアップデートではお世話になりましたが、午前中に遊びに行く予定です – DaveRandom