第27回 レーティングに応じて再生する

今回は再生条件として設定できるレーティングを利用した再生スキップ処理を入れます。

Optionクラスに判定処理、Form1のGetNextIndex()にそれを呼び出す処理を追加するだけです。
再生条件が増えると条件にマッチした曲を見つけるのに時間がかかったり、見つからず無限ループになる可能性がありました。
そのためループ試行回数を最大200に変更しています。

■Option.csへ以下を追加
		//以下を追加
		/// <summary>
		/// 再生条件のチェック(内部用途)
		/// </summary>
		bool IsPlay(int nRating, int nPlayRatingStart, int nPlayRatingEnd)
		{
			//条件設定されていないならtrue
			if (nPlayRatingStart == 0 && nPlayRatingEnd == 5)
				return true;

			if (nPlayRatingStart > 0)
			{
				if (nRating < nPlayRatingStart)
					return false;
			}
			if (nPlayRatingEnd < 5)
			{
				if (nRating > nPlayRatingEnd)
					return false;
			}

			return true;
		}


		//以下を追加
		/// <summary>
		/// 曲レーティングのチェック
		/// 
		/// 曲レーティングが再生条件設定を満たしていればtrue
		/// </summary>
		public bool IsPlayRatingOK(AudioItem item)
		{
			//条件設定されていないならtrue
			if (_nPlayRatingStart == 0 && _nPlayRatingEnd == 5)
				return true;

			int nRating = GetRating(item);
			return IsPlay(nRating, _nPlayRatingStart, _nPlayRatingEnd);
		}

		//以下を追加
		/// <summary>
		/// アーティストレーティングのチェック
		/// 
		/// アーティストレーティングが再生条件設定を満たしていればtrue
		/// </summary>
		public bool IsPlayRatingArtistOK(string strArtist)
		{
			//条件設定されていないならtrue
			if (_nPlayRatingArtistStart == 0 && _nPlayRatingArtistEnd == 5)
				return true;

			int nRating = GetRatingArtist(strArtist);
			return IsPlay(nRating, _nPlayRatingArtistStart, _nPlayRatingArtistEnd);
		}

		//以下を追加
		/// <summary>
		/// 曲/アーティストレーティングのチェック
		/// 
		/// 曲レーティングもしくはアーティストレーティングのいずれかが再生条件設定を満たしていればtrue
		/// </summary>
		public bool IsPlayRatingAnyOK(AudioItem item, string strArtist)
		{
			//条件設定されていないならtrue
			if (_nPlayRatingAnyStart == 0 && _nPlayRatingAnyEnd == 5)
				return true;

			int nRating;
			bool ret;

			nRating = GetRating(item);
			ret = IsPlay(nRating, _nPlayRatingAnyStart, _nPlayRatingAnyEnd);
			if (ret)
				return true;

			nRating = GetRatingArtist(strArtist);
			ret = IsPlay(nRating, _nPlayRatingAnyStart, _nPlayRatingAnyEnd);

			return ret;
		}
■Form1.csのGetNextIndex()を変更
		/// <summary>
		/// 次の再生曲インデックスを決める
		/// </summary>
		int GetNextIndex()
		{
			if (_listFiles.Count == 0)
				return -1;

			int nIndex = 0;				//変更
			Random rnd = new Random(Environment.TickCount);

			bool bFound = false;		//追加

			for (int i = 0; i < 200; i++)		//200回曲検索試行		//変更
			{
				if (_listPlayNext.Count == 0)
				{
					//未来の曲リストが空ならランダムで曲を決定
					nIndex = rnd.Next(0, _listFiles.Count);
				}
				else
				{
					//未来の曲リストから次の曲を決定
					nIndex = _listPlayNext[0];
					_listPlayNext.RemoveAt(0);
				}

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

				//NGファイル指定されていないかチェック
				if (_option.IsNGFile(_listFiles[nIndex]))
					continue;

				//mp3情報を取得
				string strTitle;
				string strArtist;
				string strAlbum;
				MP3Info.GetMp3Info(_listFiles[nIndex], out strTitle, out strArtist, out strAlbum);

				//アーティストがNG指定されていないかチェック
				if (_option.IsNGArtist(strArtist))
					continue;

				//曲名がNGワードを含まないかチェック
				if (_option.IsNGWord(strTitle))
					continue;

				//ファイル追加日時が再生条件を満たすかチェック
				if (_option.IsPlayDayTermOK(_listFiles[nIndex]) == false)
					continue;

				//追加
				//曲レーティングが再生条件を満たすかチェック
				if (_option.IsPlayRatingOK(_listFiles[nIndex]) == false)
					continue;

				//追加
				//アーティストレーティングが再生条件を満たすかチェック
				if (_option.IsPlayRatingArtistOK(strArtist) == false)
					continue;

				//追加
				//いずれかのレーティングが再生条件を満たすかチェック
				if (_option.IsPlayRatingAnyOK(_listFiles[nIndex], strArtist) == false)
					continue;

				bFound = true;
				break;
			}

			//追加
			if (bFound == false)
			{
				//次の再生曲を決定できなかった
				//過去の曲もしくはインデックスゼロを再生
				if (_listPlayHistory.Count > 0)
				{
					//過去の曲からランダムに決定
					nIndex = rnd.Next(0, _listPlayHistory.Count);
				}
				else
				{
					nIndex = 0;
				}
			}

			return nIndex;
		}

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


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