第04回 ランダムに再生する

前回「第03回 フォルダ内のファイルを順番に再生する作成したものは、指定したフォルダ内のmp3/m4aファイルを順番に再生するものでした。
今回はランダム再生に変更します。

ランダムにするのは再生したい曲のインデックスをRandom.Nextで決めるだけの単純な処理です。
ついでに曲再生部分のコードが重複していたので整理がてらPlay()を作成してまとめました。

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保存フォルダを指定
			//以下を削除
			//if (_liststrFiles.Count > 0)
			//	_nCurrentIndex = 0;

			_timer.Interval = 300;			//300msecごとに処理を実行
			_timer.Tick += delegate
			{
				//止まっていたら再び再生
				if (_mediaPlayer.playState == WMPPlayState.wmppsStopped)
				{
					//以下を変更
					Play();
				}
			};
			_timer.Start();

			_mediaPlayer.settings.volume = 20;
			//以下を変更
			Play();
		}


		//以下を追加
		/// <summary>
		/// 曲を再生する
		/// </summary>
		void Play()
		{
			if (_liststrFiles.Count == 0)
				return;

			_nCurrentIndex = GetNextIndex();
			_mediaPlayer.URL = _liststrFiles[_nCurrentIndex];			//最初の再生曲をセット
			_mediaPlayer.controls.play();
		}



		//以下を追加
		/// <summary>
		/// 次の再生曲インデックスを決める
		/// </summary>
		int GetNextIndex()
		{
			if (_liststrFiles.Count == 0)
				return -1;

			int nIndex;
			Random rnd = new Random(Environment.TickCount);

			while (true)
			{
				//ランダムで曲を決定
				nIndex = rnd.Next(0, _liststrFiles.Count);

				//同じ曲は連続で演奏しない
				if (nIndex == _nCurrentIndex)
					continue;

				break;
			}

			return nIndex;
		}



		/// <summary>
		/// フォルダ内のファイルを一覧して返す
		/// </summary>
		List<string> EnumFiles(string strFolder)
		{
			List<string> ret = new List<string>();

			//指定フォルダ以下の全子フォルダから全ファイルを抜き出す
			IEnumerable<string> listFiles = Directory.EnumerateFiles(strFolder, "*.*", SearchOption.AllDirectories);

			foreach (string strFile in listFiles)
			{
				//見つかったファイルの拡張子を取り出し
				string strExt = Path.GetExtension(strFile).ToLower();
				if (strExt == "")
					continue;

				//mp3/m4a以外なら無視
				if (strExt != ".mp3" && strExt != ".m4a")
					continue;

				ret.Add(strFile);
			}

			return ret;
		}

	}
}

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


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