C#.NET で音楽再生をしようと思うと、サードパーティー製のコントロールを使う方法などいくつかあるようだが、俺が今作っている「別所畑盆踊り大会専用プレーヤー Born Audrey(ボーン・オードリー)」では WindowsMediaPlayer コントロールを使っている。
インスタンスを作って、controls.play()メソッドで再生を始め、controls.stop()メソッドで再生をやめる。実に簡単。
しかし、困ったことに、WindowsMediaPlayer コントロールには「再生終了」のイベントがない。
MediaPlayer クラスで組めば MediaEnded イベントで再生終了後の処理が書ける。
状況が変化したら、MediaChange イベントが発生するので、そこでステータスが終了かどうかを見ることができる・・・という噂も聞いたが、これは本当かどうか確認してない(笑)
まあ、どちらにしても、MediaPlayer クラスで組めば再生終了は捉えることができるのである。
・・・が、悲しいことに、上に書いたように WindowsMediaPlayer コントロールを使うと「再生終了」のイベントはないので、自力でチェックするしかないのである。
どうするかというと、再生開始時にタイマーを使った定期的な監視処理をスタートさせ、終了のステータスを拾うしかない。
gTimer が Timer のインスタンスで、gWmp が WindowsMediaPlayer のインスタンスだとすると、
gTimer1.Interval = 1000; // 1秒ごとに処理を行うgTimer1.Elapsed += Timer_Elapsed; // Elapsedイベントハンドラーを設定
とタイマーを設定し、ボタンが押されるなどして再生が開始されるとき、
gWmp.settings.volume = 20; // ボリュームを 20に
gWmp.URL = filepath.Text; // MP3ファイルのパスを設定gWmp.controls.play(); // 再生開始gTimer1.Start(); // タイマーを開始
という具合に、1秒毎に Timer_Elapsed を実行する。そして、Timer_Elapsed の中で、
private void Timer_Elapsed(object sender, ElapsedEventArgs e){if (gWmp.playState == WMPPlayState.wmppsStopped) { // WMP のステータスが「終了」?gTimer1.Stop(); // タイマーを終了<再生終了時の処理>}}
これで、プレイリストに沿って連続で曲を再生する処理が書けるね。