利用DirectShow开发C#版的MP3播放器(二)
???? 繼上一次利用DirectShow編寫了一個C#版的簡單MP3播放器之后,這兩天利用空余時間對其作了初步的完善,主要工作如下:
??? 1、對原有的代碼進行拆分,主要拆分成五個類,包括一個Form類FrmPlayer、一個播放核心類MediaPlayCore、一個媒體文件信息類MediaFileInfo、一個基礎類Utils(包含各種公共的靜態方法)、一個由多個枚舉類型組成的枚舉類。
??? 2、增加了以下功能:添加文件/文件夾、刪除所選/全部、播放模式(包括單曲播放、單曲循環、順序播放、循環播放和隨機播放)。
??? 3、修改了播放列表的顯示功能,可以顯示序號、標題、時長和大小。
??? 修改完善后的界面如下圖所示:
??? 根據修改后的功能,各個部分的主要代碼如下:
1、FrmPlayer.cs
// *************************************************************** //
// Project Name?? :? MyMp3Player
// Version??????? :? 1.0.1
// Author Name??? :? Simon Huang (http://blog.csdn.net/huangxinfeng)
// Creation Date? :? 2010-02-21
// Modified Date? :?
// Modified Disc? :
// Statement????? :? Some code of this project from open source.
// *************************************************************** //
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace MyMp3Player
{
??? public partial class FrmPlayer : Form
??? {
??????? private const int WM_APP = 0x8000;
??????? private const int WM_GRAPHNOTIFY = WM_APP + 1;
??????? private const int EC_COMPLETE = 0x01;
??????? private MediaPlayCore MediaPlay;
??????? private PlayMode m_currentPlayMode = PlayMode.Order; // 播放模式
??????? private string m_strFilePath;? // 文件路徑
??????? private bool m_blnAutoMove = true; // 播放完成后自動移動到下一曲(單曲播放/單曲循環模式除外)
??????? private bool m_blnNewPlay = true;? // 開始一次全新的播放
??????? private int m_incrementId = 0;
??????? private int m_lastPlayIndex = -1;
??????? private int m_currentPlayIndex = -1;
??????? private Dictionary<int, MediaFileInfo> m_mediaFileTable;
??????? public FrmPlayer()
??????? {
??????????? InitializeComponent();
??????? }
??????? /// <summary>
??????? /// 應用程序的主入口點。
??????? /// </summary>
??????? [STAThread]
??????? static void Main()
??????? {
??????????? Application.EnableVisualStyles();
??????????? Application.SetCompatibleTextRenderingDefault(false);
??????????? Application.Run(new FrmPlayer());
??????? }
??????? #region protected method, override WndProc method
??????? /// <summary>
??????? /// 重寫WndProc
??????? /// </summary>
??????? /// <param name="m"></param>
??????? protected override void WndProc(ref Message m)
??????? {
??????????? if (m.Msg == WM_GRAPHNOTIFY)
??????????? {
??????????????? int lEventCode;
??????????????? int lParam1, lParam2;
??????????????? while (true)
??????????????? {
??????????????????? try
??????????????????? {
??????????????????????? MediaPlay.MediaEventEx.GetEvent(out lEventCode, out lParam1, out lParam2, 0);
??????????????????????? MediaPlay.MediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2);
??????????????????????? if (lEventCode == EC_COMPLETE)
??????????????????????? {
??????????????????????????? m_blnAutoMove = true;
??????????????????????????? this.Next(); // 自動切換到下一曲
??????????????????????? }
??????????????????? }
??????????????????? catch (Exception)
??????????????????? {
??????????????????????? break;
??????????????????? }
??????????????? }
??????????? }
??????????? base.WndProc(ref m);
??????? }
??????? #endregion
??????? private void FrmPlayer_Load(object sender, EventArgs e)
??????? {
??????????? MediaPlay = new MediaPlayCore();
??????????? m_mediaFileTable = new Dictionary<int, MediaFileInfo>();
??????????? this.UpdatePlayTime();
??????????? this.UpdatePlayList();
??????????? this.UpdatePlayStatus();
??????? }
??????? private void FrmPlayer_FormClosing(object sender, FormClosingEventArgs e)
??????? {
??????????? if (MediaPlay != null)
??????????? {
??????????????? MediaPlay.CleanUp();
??????????? }
??????? }
??????? #region private methods
??????? /// <summary>
??????? /// 播放
??????? /// </summary>
??????? private void Play()
??????? {
??????????? if (m_blnNewPlay)? // 開始一次全新的播放
??????????? {
??????????????? this.FirstUpdateMediaPlayList(m_lastPlayIndex);
??????????????? MediaFileInfo mediaFileInfo = null;
??????????????? lock (m_mediaFileTable)
??????????????? {
??????????????????? if (m_mediaFileTable.ContainsKey(m_currentPlayIndex))
??????????????????? {
??????????????????????? mediaFileInfo = (MediaFileInfo)m_mediaFileTable[m_currentPlayIndex];
??????????????????? }
??????????????? }
??????????????? if (mediaFileInfo != null)
??????????????? {
??????????????????? m_strFilePath = mediaFileInfo.Path;
??????????????????? lblTitle.Text = mediaFileInfo.Title;
??????????????????? MediaPlay.CleanUp();
??????????????????? MediaPlay.InitMediaPlayer(m_strFilePath);
??????????????????? MediaPlay.MediaEventEx.SetNotifyWindow((int)this.Handle, WM_GRAPHNOTIFY, 0);
???????????????????
??????????????????? lblTotalTime.Text = Utils.ConvertTimeToString(MediaPlay.Duration);
??????????????????? this.SecondUpdateMediaPlayList(m_currentPlayIndex);
??????????????????? m_lastPlayIndex = m_currentPlayIndex;
??????????????? }
??????????? }
??????????? MediaPlay.Play();
??????????? this.UpdatePlayTime();
??????????? this.UpdatePlayStatus();
??????? }
??????? /// <summary>
??????? /// 暫停
??????? /// </summary>
??????? private void Pause()
??????? {
??????????? MediaPlay.Pause();
??????????? this.UpdatePlayTime();
??????????? this.UpdatePlayStatus();
??????? }
??????? /// <summary>
??????? /// 停止
??????? /// </summary>
??????? private void Stop()
??????? {
??????????? MediaPlay.Stop();
??????????? this.UpdatePlayStatus();
??????? }
??????? #region play previous media file
??????? /// <summary>
??????? /// 上一曲
??????? /// </summary>
??????? private void Previous()
??????? {
??????????? int currentIndex = 0;
??????????? switch (m_currentPlayMode)
??????????? {
??????????????? case PlayMode.Single:? // 單曲播放
??????????????? case PlayMode.SingleCycle:? // 單曲循環
??????????????? case PlayMode.Order:? // 順序播放
??????????????????? if (m_currentPlayIndex == 0)
??????????????????? {
??????????????????????? currentIndex = 0;? // 已移到最前面
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex -= 1;
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.Cycle:? // 循環播放
??????????????????? if (m_currentPlayIndex == 0)
??????????????????? {
??????????????????????? currentIndex = lsvPlayList.Items.Count - 1;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex -= 1;
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.Random:? // 隨機播放
??????????????????? Random random = new Random();
??????????????????? currentIndex = random.Next(lsvPlayList.Items.Count);
??????????????????? break;
??????????????? default:? // 默認順序播放
??????????????????? if (m_currentPlayIndex == 0)
??????????????????? {
??????????????????????? currentIndex = 0;? // 已移到最前面
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex -= 1;
??????????????????? }
??????????????????? break;
??????????? }
??????????? this.CancelItemSelected();
??????????? m_currentPlayIndex = currentIndex;
??????????? m_blnNewPlay = true;
??????????? this.Play();
??????? }
??????? #endregion
??????? #region play next media file
??????? /// <summary>
??????? /// 下一曲
??????? /// </summary>
??????? private void Next()
??????? {
??????????? int currentIndex = 0;
??????????? switch (m_currentPlayMode)
??????????? {
??????????????? case PlayMode.Single:? // 單曲播放
??????????????????? if (m_blnAutoMove)
??????????????????? {
??????????????????????? this.Stop();
??????????????????????? currentIndex = -1;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? if (m_currentPlayIndex == lsvPlayList.Items.Count - 1)
??????????????????????? {
??????????????????????????? currentIndex = lsvPlayList.Items.Count - 1; // 已移到最后面
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????????? currentIndex += 1;
??????????????????????? }
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.SingleCycle:? // 單曲循環
??????????????????? if (m_blnAutoMove)
??????????????????? {
??????????????????????? currentIndex = m_lastPlayIndex;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? if (m_currentPlayIndex == lsvPlayList.Items.Count - 1)
??????????????????????? {
??????????????????????????? currentIndex = lsvPlayList.Items.Count - 1; // 已移到最后面
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????????? currentIndex += 1;
??????????????????????? }
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.Order:? // 順序播放
??????????????????? if (m_currentPlayIndex == lsvPlayList.Items.Count - 1)
??????????????????? {
??????????????????????? currentIndex = lsvPlayList.Items.Count - 1; // 已移到最后面
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex += 1;
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.Cycle:? // 循環播放
??????????????????? if (m_currentPlayIndex == lsvPlayList.Items.Count - 1)
??????????????????? {
??????????????????????? currentIndex = 0;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex += 1;
??????????????????? }
??????????????????? break;
??????????????? case PlayMode.Random:? // 隨機播放
??????????????????? Random random = new Random();
??????????????????? currentIndex = random.Next(lsvPlayList.Items.Count);
??????????????????? break;
??????????????? default:? // 默認順序播放
??????????????????? if (m_currentPlayIndex == lsvPlayList.Items.Count - 1)
??????????????????? {
??????????????????????? currentIndex = lsvPlayList.Items.Count - 1; // 已移到最后面
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? currentIndex = this.FindListViewItemIndex(m_lastPlayIndex);
??????????????????????? currentIndex += 1;
??????????????????? }
??????????????????? break;
??????????? }
??????????? this.CancelItemSelected();
??????????? if (currentIndex != -1)
??????????? {
??????????????? m_currentPlayIndex = currentIndex;
??????????????? m_blnNewPlay = true;
??????????????? this.Play();
??????????? }??????
??????? }
??????? #endregion
??????? /// <summary>
??????? /// 打開文件
??????? /// </summary>
??????? private void AddOpenFiles()
??????? {
??????????? OpenFileDialog openFileDlg = new OpenFileDialog();
??????????? openFileDlg.Filter = "MP3文件(*.mp3)|*.mp3";
??????????? openFileDlg.Multiselect = true;
??????????? if (DialogResult.OK == openFileDlg.ShowDialog())
??????????? {
??????????????? string[] fileNames = openFileDlg.FileNames;
??????????????? if (fileNames != null)
??????????????? {
??????????????????? this.InitFileInfoAndPlay(fileNames);
??????????????? }
??????????? }
??????? }
??????? /// <summary>
??????? /// 打開文件夾
??????? /// </summary>
??????? private void AddOpenFolder()
??????? {
??????????? FolderBrowserDialog folderBrowserDlg = new FolderBrowserDialog();
??????????? folderBrowserDlg.Description = "請選擇一個文件夾:";
??????????? folderBrowserDlg.ShowNewFolderButton = false;
??????????? if (DialogResult.OK == folderBrowserDlg.ShowDialog())
??????????? {
??????????????? string folderName = folderBrowserDlg.SelectedPath;
??????????????? string[] fileNames = Directory.GetFiles(folderName, "*.mp3");
??????????????? if (fileNames != null)
??????????????? {
??????????????????? this.InitFileInfoAndPlay(fileNames);
??????????????? }
??????????? }
??????? }
??????? /// <summary>
??????? /// 刪除所選文件
??????? /// </summary>
??????? private void DeleteSelected()
??????? {
??????????? if (lsvPlayList.SelectedItems.Count == 0)
??????????? {
??????????????? MessageBox.Show("請選擇要刪除的文件!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
??????????? }
??????????? else
??????????? {
??????????????? this.RemoveItemsFormMediaPlayList();
??????????? }
??????? }
??????? /// <summary>
??????? /// 刪除所有文件
??????? /// </summary>
??????? private void DeleteAll()
??????? {
??????????? if (m_mediaFileTable != null)
??????????? {
??????????????? m_mediaFileTable.Clear();
??????????? }
??????????? if (lsvPlayList.Items.Count > 0)
??????????? {
??????????????? lsvPlayList.Items.Clear();
??????????? }
??????????? m_incrementId = 0;
??????????? m_lastPlayIndex = -1;
??????????? m_currentPlayIndex = -1;
??????? }
??????? /// <summary>
??????? /// 獲取文件信息并添加到播放列表,然后開始播放
??????? /// </summary>
??????? /// <param name="fileNames"></param>
??????? private void InitFileInfoAndPlay(string[] fileNames)
??????? {
??????????? foreach (string fileName in fileNames)
??????????? {
??????????????? MediaFileInfo mediaFileInfo = new MediaFileInfo();
??????????????? FileInfo fi = new FileInfo(fileName);
??????????????? mediaFileInfo.ID = m_incrementId;
??????????????? mediaFileInfo.Title = Utils.GetFileName(fi.Name);
??????????????? mediaFileInfo.Length = Utils.ConvertTimeToString(MediaPlay.GetDuration(fileName));
??????????????? mediaFileInfo.Size = Utils.GetSizeInfo(fi.Length);
??????????????? mediaFileInfo.Path = fileName;
??????????????? m_mediaFileTable.Add(m_incrementId, mediaFileInfo);
??????????????? this.AddToMediaPlayList(mediaFileInfo);
??????????????? m_incrementId++;
??????????? }
??????????? if (m_currentPlayIndex == -1) // 添加前播放列表為空
??????????? {
??????????????? // 選中第一個文件并進行播放
??????????????? lsvPlayList.Select();
??????????????? lsvPlayList.Items[0].Selected = true;
??????????????? m_lastPlayIndex = m_currentPlayIndex = 0;
??????????????? this.Play();
??????????? }
??????????? this.UpdatePlayList();
??????? }
??????? /// <summary>
??????? /// 添加文件到播放列表
??????? /// </summary>
??????? /// <param name="fileInfo"></param>
??????? private void AddToMediaPlayList(MediaFileInfo fileInfo)
??????? {
??????????? lsvPlayList.BeginUpdate();
??????????? ListViewItem lvi;
??????????? lvi = new ListViewItem((fileInfo.ID +1).ToString());
??????????? lvi.SubItems.Add(fileInfo.Title);
??????????? lvi.SubItems.Add(fileInfo.Length);
??????????? lvi.SubItems.Add(fileInfo.Size);
??????????? lsvPlayList.Items.Add(lvi);
??????????? lsvPlayList.EndUpdate();
??????? }
??????? /// <summary>
??????? /// 第一次更新播放列表
??????? /// </summary>
??????? /// <param name="id"></param>
??????? private void FirstUpdateMediaPlayList(int id)
??????? {
??????????? ListViewItem lvi = lsvPlayList.FindItemWithText((id + 1).ToString());
??????????? if (lvi != null)
??????????? {
??????????????? lvi.ForeColor = Color.Black;
??????????? }
??????? }
??????? /// <summary>
??????? /// 第二次更新播放列表
??????? /// </summary>
??????? /// <param name="id"></param>
??????? private void SecondUpdateMediaPlayList(int id)
??????? {
??????????? ListViewItem lvi = lsvPlayList.FindItemWithText((id + 1).ToString());
??????????? if (lvi != null)
??????????? {
??????????????? lvi.ForeColor = Color.Green;
??????????? }
??????? }
??????? /// <summary>
??????? /// 取消已選擇項的狀態
??????? /// </summary>
??????? private void CancelItemSelected()
??????? {
??????????? foreach (ListViewItem lvi in lsvPlayList.SelectedItems)
??????????? {
??????????????? lvi.Selected = false;
??????????? }
??????? }
??????? /// <summary>
??????? /// 從播放列表移除選中的文件
??????? /// </summary>
??????? private void RemoveItemsFormMediaPlayList()
??????? {
??????????? foreach (ListViewItem lvi in lsvPlayList.SelectedItems)
??????????? {
??????????????? int playId = Utils.StringToInteger(lvi.Text) - 1;
??????????????? lock (m_mediaFileTable)
??????????????? {
??????????????????? if (m_mediaFileTable.ContainsKey(playId))
??????????????????? {
??????????????????????? m_mediaFileTable.Remove(playId);
??????????????????? }
??????????????? }
??????????????? lvi.Remove();
??????????? }
??????? }
??????? //private void UpdatePlayIndex(int playId)
??????? //{
??????? //??? MediaFileInfo mediaFileInfo = null;
??????? //??? lock (m_mediaFileTable)
??????? //??? {
??????? //??????? foreach (int id in m_mediaFileTable.Keys)
??????? //??????? {
??????? //??????????? if (id > playId)
??????? //??????????? {
??????? //??????????????? if (m_mediaFileTable.ContainsKey(id))
??????? //??????????????? {
??????? //??????????????????? mediaFileInfo = (MediaFileInfo)m_mediaFileTable[id];
??????? //??????????????? }
??????? //??????????????? if (mediaFileInfo != null)
??????? //??????????????? {
??????? //??????????????????? mediaFileInfo.ID = id - 1;
??????? //??????????????? }
??????? //??????????? }
??????? //??????? }
??????? //??? }
??????? //}
??????? /// <summary>
??????? /// 查找并返回指定項的索引
??????? /// </summary>
??????? /// <param name="id"></param>
??????? /// <returns></returns>
??????? private int FindListViewItemIndex(int id)
??????? {
??????????? ListViewItem lvi = lsvPlayList.FindItemWithText((id + 1).ToString());
??????????? if (lvi != null)
??????????? {
??????????????? return lvi.Index;
??????????? }
??????????? else
??????????? {
??????????????? return 0;
??????????? }
??????? }
??????? #endregion
??????? #region update control status
??????? /// <summary>
??????? /// 更新播放時間及播放進度
??????? /// </summary>
??????? private void UpdatePlayTime()
??????? {
??????????? if (MediaPlay != null)
??????????? {
??????????????? lblCurrentTime.Text = Utils.ConvertTimeToString(MediaPlay.CurrentPosition);
??????????????? trackBarPlay.Value = (int)(100 * (MediaPlay.CurrentPosition / MediaPlay.Duration));
??????????? }
??????????? else
??????????? {
??????????????? lblTotalTime.Text = "00:00";
??????????????? lblCurrentTime.Text = "00:00";
??????????? }
??????? }
??????? /// <summary>
??????? /// 根據播放列表狀態更新相應按鈕狀態
??????? /// </summary>
??????? private void UpdatePlayList()
??????? {
??????????? if (lsvPlayList.Items.Count > 0)
??????????? {
??????????????? picPrevious.Enabled = true;
??????????????? picNext.Enabled = true;
??????????????? picPrevious.Image = global::MyMp3Player.Properties.Resources.previous_normal;
??????????????? picNext.Image = global::MyMp3Player.Properties.Resources.next_normal;
??????????? }
??????????? else
??????????? {
??????????????? picPrevious.Enabled = false;
??????????????? picNext.Enabled = false;
??????????????? picPrevious.Image = global::MyMp3Player.Properties.Resources.previous_disabled;
??????????????? picNext.Image = global::MyMp3Player.Properties.Resources.next_disabled;
??????????? }
??????? }
??????? /// <summary>
??????? /// 更新播放按鈕狀態
??????? /// </summary>
??????? private void UpdatePlayStatus()
??????? {
??????????? switch (MediaPlay.CurrentStatus)
??????????? {
??????????????? case MediaStatus.None:
??????????????????? picPlayPause.Enabled = false;
??????????????????? picStop.Enabled = false;
??????????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_disabled;
??????????????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_disabled;
??????????????????? lblCurrentTime.Text = "00:00";
??????????????????? lblTotalTime.Text = "00:00";
??????????????????? trackBarPlay.Value = 0;
??????????????????? break;
??????????????? case MediaStatus.Paused:
??????????????????? picPlayPause.Enabled = true;
??????????????????? picStop.Enabled = true;
??????????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_normal;
??????????????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_normal;
??????????????????? break;
??????????????? case MediaStatus.Running:
??????????????????? picPlayPause.Enabled = true;
??????????????????? picStop.Enabled = true;
??????????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.pause_normal;
??????????????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_normal;
??????????????????? break;
??????????????? case MediaStatus.Stopped:
??????????????????? picPlayPause.Enabled = true;
??????????????????? picStop.Enabled = false;
??????????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_normal;
??????????????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_disabled;
??????????????????? lblCurrentTime.Text = "00:00";
??????????????????? lblTotalTime.Text = "00:00";
??????????????????? trackBarPlay.Value = 0;
??????????????????? break;
??????????? }
??????? }
??????? /// <summary>
??????? /// 更新播放模式的菜單選中狀態
??????? /// </summary>
??????? private void UpdatePlayModeMenuStatus()
??????? {
??????????? switch (m_currentPlayMode)
??????????? {
??????????????? case PlayMode.Single:
??????????????????? menuModeSingle.Checked = true;
??????????????????? menuModeSingleCycle.Checked = false;
??????????????????? menuModeOrder.Checked = false;
??????????????????? menuModeCycle.Checked = false;
??????????????????? menuModeRandom.Checked = false;
??????????????????? break;
??????????????? case PlayMode.SingleCycle:
??????????????????? menuModeSingle.Checked = false;
??????????????????? menuModeSingleCycle.Checked = true;
??????????????????? menuModeOrder.Checked = false;
??????????????????? menuModeCycle.Checked = false;
??????????????????? menuModeRandom.Checked = false;
??????????????????? break;
??????????????? case PlayMode.Order:
??????????????????? menuModeSingle.Checked = false;
??????????????????? menuModeSingleCycle.Checked = false;
??????????????????? menuModeOrder.Checked = true;
??????????????????? menuModeCycle.Checked = false;
??????????????????? menuModeRandom.Checked = false;
??????????????????? break;
??????????????? case PlayMode.Cycle:
??????????????????? menuModeSingle.Checked = false;
??????????????????? menuModeSingleCycle.Checked = false;
??????????????????? menuModeOrder.Checked = false;
??????????????????? menuModeCycle.Checked = true;
??????????????????? menuModeRandom.Checked = false;
??????????????????? break;
??????????????? case PlayMode.Random:
??????????????????? menuModeSingle.Checked = false;
??????????????????? menuModeSingleCycle.Checked = false;
??????????????????? menuModeOrder.Checked = false;
??????????????????? menuModeCycle.Checked = false;
??????????????????? menuModeRandom.Checked = true;
??????????????????? break;
??????????????? default:
??????????????????? menuModeSingle.Checked = true;
??????????????????? menuModeSingleCycle.Checked = false;
??????????????????? menuModeOrder.Checked = false;
??????????????????? menuModeCycle.Checked = false;
??????????????????? menuModeRandom.Checked = false;
??????????????????? break;
??????????? }
??????? }
??????? #endregion
??????? /// <summary>
??????? /// 定時器
??????? /// </summary>
??????? /// <param name="sender"></param>
??????? /// <param name="e"></param>
??????? private void timer1_Tick(object sender, EventArgs e)
??????? {
??????????? if (MediaPlay.CurrentStatus == MediaStatus.Running)
??????????? {
??????????????? this.UpdatePlayTime();
??????????? }
??????? }
??????? /// <summary>
??????? /// 播放進度條控制
??????? /// </summary>
??????? /// <param name="sender"></param>
??????? /// <param name="e"></param>
??????? private void trackBarPlay_Scroll(object sender, EventArgs e)
??????? {
??????????? if (MediaPlay.CurrentStatus != MediaStatus.None)
??????????? {
??????????????? MediaPlay.CurrentPosition = MediaPlay.Duration * trackBarPlay.Value / 100;
??????????? }
??????? }
??????? #region play control click events
??????? private void picPlayPause_Click(object sender, EventArgs e)
??????? {
??????????? if (MediaPlay.CurrentStatus == MediaStatus.Running)
??????????? {
??????????????? this.Pause();
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.pause_normal;
??????????? }
??????????? else
??????????? {
??????????????? m_blnNewPlay = false;
??????????????? this.Play();
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_normal;
??????????? }
??????? }
??????? private void picPlayPause_MouseMove(object sender, MouseEventArgs e)
??????? {
??????????? if (MediaPlay.CurrentStatus == MediaStatus.Running)
??????????? {
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.pause_over;
??????????? }
??????????? else
??????????? {
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_over;
??????????? }
??????? }
??????? private void picPlayPause_MouseLeave(object sender, EventArgs e)
??????? {
??????????? if (MediaPlay.CurrentStatus == MediaStatus.Running)
??????????? {
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.pause_normal;
??????????? }
??????????? else
??????????? {
??????????????? picPlayPause.Image = global::MyMp3Player.Properties.Resources.play_normal;
??????????? }
??????? }
??????? private void picStop_Click(object sender, EventArgs e)
??????? {
??????????? this.Stop();
??????? }
??????? private void picStop_MouseMove(object sender, MouseEventArgs e)
??????? {
??????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_over;
??????? }
??????? private void picStop_MouseLeave(object sender, EventArgs e)
??????? {
??????????? picStop.Image = global::MyMp3Player.Properties.Resources.stop_normal;
??????? }
??????? private void picPrevious_Click(object sender, EventArgs e)
??????? {
??????????? this.Previous();
??????? }
??????? private void picPrevious_MouseMove(object sender, MouseEventArgs e)
??????? {
??????????? picPrevious.Image = global::MyMp3Player.Properties.Resources.previous_over;
??????? }
??????? private void picPrevious_MouseLeave(object sender, EventArgs e)
??????? {
??????????? picPrevious.Image = global::MyMp3Player.Properties.Resources.previous_normal;
??????? }
??????? private void picNext_Click(object sender, EventArgs e)
??????? {
??????????? this.Next();
??????? }
??????? private void picNext_MouseMove(object sender, MouseEventArgs e)
??????? {
??????????? picNext.Image = global::MyMp3Player.Properties.Resources.next_over;
??????? }
??????? private void picNext_MouseLeave(object sender, EventArgs e)
??????? {
??????????? picNext.Image = global::MyMp3Player.Properties.Resources.next_normal;
??????? }
??????? #endregion
??????? #region add file/folder click events
??????? private void menuAddFile_Click(object sender, EventArgs e)
??????? {
??????????? this.AddOpenFiles();
??????? }
??????? private void menuAddFolder_Click(object sender, EventArgs e)
??????? {
??????????? this.AddOpenFolder();
??????? }
??????? #endregion
??????? #region delete file/files click events
??????? private void menuDeleteSelected_Click(object sender, EventArgs e)
??????? {
??????????? this.DeleteSelected();
??????? }
??????? private void menuDeleteAll_Click(object sender, EventArgs e)
??????? {
??????????? this.DeleteAll();
??????? }
??????? #endregion
??????? #region play mode click events
??????? private void menuModeSingle_Click(object sender, EventArgs e)
??????? {
??????????? // 更新播放模式的菜單選擇狀態
??????????? m_currentPlayMode = PlayMode.Single;
??????????? this.UpdatePlayModeMenuStatus();?
??????? }
??????? private void menuModeSingleCycle_Click(object sender, EventArgs e)
??????? {
??????????? // 更新播放模式的菜單選擇狀態
??????????? m_currentPlayMode = PlayMode.SingleCycle;
??????????? this.UpdatePlayModeMenuStatus();
??????? }
??????? private void menuModeOrder_Click(object sender, EventArgs e)
??????? {
??????????? // 更新播放模式的菜單選擇狀態
??????????? m_currentPlayMode = PlayMode.Order;
??????????? this.UpdatePlayModeMenuStatus();
??????? }
??????? private void menuModeCycle_Click(object sender, EventArgs e)
??????? {
??????????? // 更新播放模式的菜單選擇狀態
??????????? m_currentPlayMode = PlayMode.Cycle;
??????????? this.UpdatePlayModeMenuStatus();
??????? }
??????? private void menuModeRandom_Click(object sender, EventArgs e)
??????? {
??????????? // 更新播放模式的菜單選擇狀態
??????????? m_currentPlayMode = PlayMode.Random;
??????????? this.UpdatePlayModeMenuStatus();
??????? }
??????? #endregion
??????? /// <summary>
??????? /// 雙擊選中文件并播放
??????? /// </summary>
??????? /// <param name="sender"></param>
??????? /// <param name="e"></param>
??????? private void lsvPlayList_DoubleClick(object sender, EventArgs e)
??????? {
??????????? if (lsvPlayList.Items.Count > 0)
??????????? {
??????????????? m_blnNewPlay = true;
??????????????? m_currentPlayIndex = Utils.StringToInteger(lsvPlayList.SelectedItems[0].SubItems[0].Text) - 1;
??????????????? this.Play();
??????????? }
??????? }
??? }
}
?
2、MediaPlayCore.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuartzTypeLib;
namespace MyMp3Player
{
??? class MediaPlayCore
??? {
??????? #region member fields
??????? private FilgraphManager m_objFilterGraph = null;
??????? private IBasicAudio m_objBasicAudio = null;
??????? private IMediaEvent m_objMediaEvent = null;
??????? private IMediaEventEx m_objMediaEventEx = null;
??????? private IMediaPosition m_objMediaPosition = null;
??????? private IMediaControl m_objMediaControl = null;
??????? private MediaStatus m_currentStatus = MediaStatus.None;
??????? #endregion
??????? #region public properties
??????? public IMediaEventEx MediaEventEx
??????? {
??????????? get { return m_objMediaEventEx; }
??????? }
??????? public MediaStatus CurrentStatus
??????? {
??????????? get { return m_currentStatus; }
??????????? set { m_currentStatus = value; }
??????? }
??????? public double Duration
??????? {
??????????? get
??????????? {
??????????????? if (m_objMediaPosition != null)
??????????????? {
??????????????????? return m_objMediaPosition.Duration;
??????????????? }
??????????????? else
??????????????? {
??????????????????? return 0.1;
??????????????? }
??????????? }
??????? }
??????? public double CurrentPosition
??????? {
??????????? get
??????????? {
??????????????? if (m_objMediaPosition != null)
??????????????? {
??????????????????? return m_objMediaPosition.CurrentPosition;
??????????????? }
??????????????? else
??????????????? {
??????????????????? return 0.0;
??????????????? }
??????????? }
??????????? set
??????????? {
??????????????? if (m_objMediaPosition != null)
??????????????? {
??????????????????? m_objMediaPosition.CurrentPosition = value;
??????????????? }
??????????? }
??????? }
??????? #endregion
??????? #region public methods
??????? /// <summary>
??????? /// 初始化播放
??????? /// </summary>
??????? /// <param name="fileName">文件名稱(全路徑)</param>
??????? public void InitMediaPlayer(string fileName)
??????? {
??????????? m_objFilterGraph = new FilgraphManager();
??????????? m_objFilterGraph.RenderFile(fileName);
??????????? m_objBasicAudio = m_objFilterGraph as IBasicAudio;
??????????? m_objMediaEvent = m_objFilterGraph as IMediaEvent;
??????????? m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;
??????????? m_objMediaPosition = m_objFilterGraph as IMediaPosition;
??????????? m_objMediaControl = m_objFilterGraph as IMediaControl;
??????? }
??????? /// <summary>
??????? /// 播放
??????? /// </summary>
??????? public void Play()
??????? {
??????????? m_objMediaControl.Run();
??????????? m_currentStatus = MediaStatus.Running;
??????? }
??????? /// <summary>
??????? /// 暫停
??????? /// </summary>
??????? public void Pause()
??????? {
??????????? m_objMediaControl.Pause();
??????????? m_currentStatus = MediaStatus.Paused;
??????? }
??????? /// <summary>
??????? /// 停止
??????? /// </summary>
??????? public void Stop()
??????? {
??????????? m_objMediaControl.Stop();
??????????? m_objMediaPosition.CurrentPosition = 0;
??????????? m_currentStatus = MediaStatus.Stopped;
??????? }
??????? /// <summary>
??????? /// 獲取文件的播放時長
??????? /// </summary>
??????? /// <param name="fileNameList">文件</param>
??????? /// <returns>播放時長</returns>
??????? public double GetDuration(string fileName)
??????? {
??????????? FilgraphManager filterGraph = new FilgraphManager();
??????????? filterGraph.RenderFile(fileName);
??????????? IMediaPosition mediaPosition = filterGraph as IMediaPosition;
??????????? return mediaPosition.Duration;
??????? }
??????? /// <summary>
??????? /// 清理資源
??????? /// </summary>
??????? public void CleanUp()
??????? {
??????????? if (m_objMediaControl != null)
??????????????? m_objMediaControl.Stop();
??????????? m_currentStatus = MediaStatus.Stopped;
??????????? if (m_objMediaEventEx != null)
??????????????? m_objMediaEventEx.SetNotifyWindow(0, 0, 0);
??????????? if (m_objMediaControl != null) m_objMediaControl = null;
??????????? if (m_objMediaPosition != null) m_objMediaPosition = null;
??????????? if (m_objMediaEventEx != null) m_objMediaEventEx = null;
??????????? if (m_objMediaEvent != null) m_objMediaEvent = null;
??????????? if (m_objBasicAudio != null) m_objBasicAudio = null;
??????????? if (m_objFilterGraph != null) m_objFilterGraph = null;
??????? }
??????? #endregion
??? }
}
???
3、MediaFileInfo.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMp3Player
{
??? class MediaFileInfo
??? {
??????? private int m_id;? // 流水號
??????? private string m_title = string.Empty;? // 標題
??????? private string m_length = string.Empty;? // 時長
??????? private string m_size = string.Empty;? // 大小
??????? private string m_path = string.Empty;? // 文件路徑
??????? public int ID
??????? {
??????????? get { return m_id; }
??????????? set { m_id = value; }
??????? }
??????? public string Title
??????? {
??????????? get { return m_title; }
??????????? set { m_title = value; }
??????? }
??????? public string Length
??????? {
??????????? get { return m_length; }
??????????? set { m_length = value; }
??????? }
??????? public string Size
??????? {
??????????? get { return m_size; }
??????????? set { m_size = value; }
??????? }
??????? public string Path
??????? {
??????????? get { return m_path; }
??????????? set { m_path = value; }
??????? }
??? }
}
???
4、Utils.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMp3Player
{
??? class Utils
??? {
??????? /// <summary>
??????? /// 將時長轉換為字符串的時間格式
??????? /// </summary>
??????? /// <param name="duration">時長</param>
??????? /// <returns>字符串的時間格式</returns>
??????? public static string ConvertTimeToString(double duration)
??????? {
??????????? int s = (int)duration;
??????????? int h = s / 3600;
??????????? int m = (s - (h * 3600)) / 60;
??????????? s = s - (h * 3600 + m * 60);
??????????? return String.Format("{0:D2}:{1:D2}", m, s);
??????? }
??????? /// <summary>
??????? /// 獲取文件名稱
??????? /// </summary>
??????? /// <param name="name"></param>
??????? /// <returns></returns>
??????? public static string GetFileName(string name)
??????? {
??????????? string fileName = name;
??????????? fileName = fileName.Substring(0, fileName.Length - 4);
??????????? if (fileName.IndexOf("&") > 0)
??????????? {
??????????????? fileName = fileName.Replace("&", "&&");
??????????? }
??????????? return fileName;
??????? }
??????? /// <summary>
??????? /// 轉換文件大小
??????? /// </summary>
??????? /// <param name="size">大小(字節數)</param>
??????? /// <returns>轉換后的大小</returns>
??????? public static string GetSizeInfo(long size)
??????? {
??????????? string retval = "";
??????????? if (size < 1024)
??????????? {
??????????????? retval = string.Format("{0:n2} Byte", size);
??????????? }
??????????? else if ((size / 1024) < 1024)
??????????? {
??????????????? retval = string.Format("{0:n2} KB", ((double)size / 1024));
??????????? }
??????????? else if ((size / 1024 / 1024) < 1024)
??????????? {
??????????????? retval = string.Format("{0:n2} MB", ((double)size / 1024 / 1024));
??????????? }
??????????? else if ((size / 1024 / 1024 / 1024) < 1024)
??????????? {
??????????????? retval = string.Format("{0:n2} GB", ((double)size / 1024 / 1024 / 1024));
??????????? }
??????????? return retval;
??????? }
??????? /// <summary>
??????? /// 將字符串數值轉換為整型數值
??????? /// </summary>
??????? /// <param name="s"></param>
??????? /// <returns></returns>
??????? public static int StringToInteger(string s)
??????? {
??????????? int retval = 0;
??????????? if (!string.IsNullOrEmpty(s))
??????????? {
??????????????? retval = Int32.Parse(s);
??????????? }
??????????? return retval;
??????? }
??? }
}
???
5、枚舉
public enum MediaStatus
??? {
??????? None,
??????? Stopped,
??????? Paused,
??????? Running
??? };
??? public enum SortType
??? {
??????? ASC,
??????? DES
??? };
??? public enum PlayMode
??? {
??????? Single,
??????? SingleCycle,
??????? Order,
??????? Cycle,
??????? Random
??? };
?
??? 在測試過程中,仍然發現了一些問題,需要在后續進行完善,敬請期待。
總結
以上是生活随笔為你收集整理的利用DirectShow开发C#版的MP3播放器(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天呐!惊人的Springboot测试.S
- 下一篇: 冬至将临致旅人