このクラスを使用してSoundPlayer、WPFアプリケーションでWAVファイルを再生しています。ファイルは短く、アプリケーションの一部であり、プログラムで発生するイベントに応答して再生されます。ユーザーはどのサウンドを再生するかを制御できず、自分でサウンドを再生することを決定することはできません。WPFMediaPlayerコントロールも使用してみましたが、そのコントロールに問題がありました。はSoundPlayerうまく機能していますが、問題があります。
基本的に、私は音のキューを維持し、それらがキューに入れられるときに次々に音を再生する必要があります。状況によっては、再生中のサウンドを停止して、代わりに別のサウンドを再生する必要があります。SoundPlayerしたがって、コントロールと相互に排他的であることが判明した2つの要件があります。
- 私のコードは、サウンドの再生がいつ終了したかを知る必要があります。
- サウンドはバックグラウンドで再生する必要があります
これを実装するために、というクラスを作成しましたSoundController。これにはバックグラウンドスレッドがあり、Thread's Dispatcherを使用して、を使用してサウンドを再生するために使用するメソッドへの呼び出しをキューに入れますBeginInvoke。このメソッドは、サウンドを再生するSoundControllerために呼び出す前にイベントでイベントを発生させ、リターン後に別のイベントを発生させます。SoundPlayer.PlaySyncPlaySync
UIスレッドで、サウンドを停止する必要がある時点で、SoundControllerクラスのStopメソッドを呼び出します。SoundPlayerのStopメソッドを呼び出して、サウンドの再生を停止します。そして、ここで問題が発生します。SoundPlayer.Stop音が止まらないことがわかりますが、音が終わるのを待ってから戻ります。
これでGUIが機能しなくなります。非同期で呼び出すこともできますが、GUIは停止しませんが、サウンドも停止しません。
私が言ったように、WPF MediaPlayerは私たちのために機能せず、とにかくそれはやり過ぎでした。イベントを発生させ、バックグラウンドスレッドでサウンドを再生し、再生を停止する機能を提供するサウンドを再生するための他の代替手段はありますか?
2012年6月26日編集:
これは1か月以上ここにあり、応答がありません。SoundPlayerですから、コントロール に代わるものは他にないと思います。
問題に別の角度からやってくる新しい質問を投稿します。