第06回 再生位置をシークバーに表示する

前回「第05回 画面を作る」はメインウインドウにカタチだけシークバーとなるトラックバーコントロールなどを配置しました。
今回はそのシークバーの中身を実装します。

処理の流れは、タイマーで曲のどの辺を再生しているのかを取得し、それをトラックバーコントロールに適用します。
それだけでは人の操作によるシーク位置の設定ができませんが、それは次回以降に持ち越し。
今回はシーク位置の表示のみです。

曲の長さは_mediaPlayer.controls.currentItem.durationにdouble値で、
再生位置は_mediaPlayer.controls.currentPositionにdouble値で、
文字列としての再生位置は_mediaPlayer.controls.currentPositionStringにstring値で、
取得できるためそれらを利用しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WMPLib;

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();

		Timer _timer = new Timer();

		List<string> _liststrFiles;			//音楽ファイル一覧
		int _nCurrentIndex = -1;			//↑へのインデックス

		public Form1()
		{
			InitializeComponent();

			_liststrFiles = EnumFiles(@"G:\Desktop\mp3\");		//再生したいmp3保存フォルダを指定

			_timer.Interval = 300;			//300msecごとに処理を実行
			_timer.Tick += delegate
			{
				//以下を追加
				if (_mediaPlayer.playState == WMPPlayState.wmppsPlaying || _mediaPlayer.playState == WMPPlayState.wmppsPaused)
				{
					try
					{
						//シークバーに再生位置を表示
						//曲変更タイミングによっては例外出る可能性ある
						trackBarSeek.Maximum = (int)(_mediaPlayer.controls.currentItem.duration * 100);
						trackBarSeek.Value = (int)(_mediaPlayer.controls.currentPosition * 100);
					}
					catch(Exception)
					{
					}

					//再生時間の表示
					labelTime.Text = _mediaPlayer.controls.currentPositionString;
				}

				//止まっていたら再び再生
				if (_mediaPlayer.playState == WMPPlayState.wmppsStopped)
				{
					Play();
				}
			};
			_timer.Start();

			_mediaPlayer.settings.volume = 20;
			Play();
		}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー