65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 winmm.dll 和 WPL 文件的音频播放器

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (8投票s)

2006年11月9日

CPOL

3分钟阅读

viewsIcon

126298

downloadIcon

3891

打开 Windows Media 播放列表并播放它

Sample Image - Audio_Player__with_Winmm.jpg

引言

在寻找一个简单且免费的 MP3 播放器之后,我决定自己制作一个。 我基于一个商业软件包,名字就不说了。[让我们说,考虑到它导入了 *winmm.dll*,该软件包的价格昂贵。] 我发现几乎每个使用 *winmm.dll* 播放音频文件[在我的例子中是 MP3]的示例都只有播放/停止功能(有时是暂停)。 这很好,我只是想要更多一点,并且仍然想保持简单。 当然,如果我想要一个功能齐全的 MP3 播放器,我可能会下载众多免费应用程序中的一个。 那不是我的目的。

所以代码非常简单。 它使用 Windows 中的 *winmm.dll* 来播放、停止、暂停等。它还控制左/右声道的音量(如果有多个)。 此外,我很高兴尝试解析 XML,因此该应用程序从 Windows Media 播放列表获取音频文件信息[创建一个很容易,只需使用 Windows Media Player]。

请记住,我不是一名专业的程序员,这是我对 Code Project 的第一次贡献。 我知道我不是在重新发明轮子,只是希望这能帮助到某人。

该项目有几个文件

  • *Player.cs* [它包含所有 *winmm.dll* string 命令]: 更多信息可以在 这里 找到,但我认为有时很难理解。
  • *readPlaylist.cs*:这会打开一个打开对话框窗口,并帮助您选择一个 *.wpl* 文件。
  • *MainPlayer.cs*:基本上是按钮和点击事件等。

Player.cs

我尝试在代码中添加尽可能多的相关注释,就像我写这篇文章一样,而不会过度。

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace MP3player
{
    class Player
    {
        private string Pcommand;
        private bool isOpen;

        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand,
		StringBuilder strReturn, int iReturnLength, int bla);

        /// <SUMMARY>
        /// Not much to construct here
        /// </SUMMARY>
        public Player()
        {
        }

        /// <SUMMARY>
        /// Stops currently playing audio file
        /// </SUMMARY>
        public void Close()
        {
            Pcommand = "close MediaFile";
            mciSendString(Pcommand, null, 0, 0);
            isOpen = false;
        }

        /// <SUMMARY>
        /// Opens audio file to play
        /// </SUMMARY>
        /// This is the audio file's path and filename
        public void Open(string sFileName)
        {
            Pcommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";
            mciSendString(Pcommand, null, 0, 0);
            isOpen = true;
        }

        /// <SUMMARY>
        /// Plays selected audio file
        /// </SUMMARY>
        /// If True,audio file will repeat
        public void Play(bool loop)
        {
            if (isOpen)
            {
                Pcommand = "play MediaFile";
                if (loop)
                    Pcommand += " REPEAT";
                mciSendString(Pcommand, null, 0, 0);
            }
        }

        /// <SUMMARY>
        /// Pauses currently playing audio file
        /// </SUMMARY>
        public void Pause()
        {
            Pcommand = "pause MediaFile";
            mciSendString(Pcommand, null, 0, 0);
        }

        /// <SUMMARY>
        /// Returns the current status player: playing, paused, stopped, etc.
        /// </SUMMARY>
        public string Status()
        {
            int i = 128;
            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(i);
            mciSendString("status MediaFile mode", stringBuilder, i, 0);
            return stringBuilder.ToString();
        }

        /// <SUMMARY>
        /// Get/Set Left Volume Factor
        /// </SUMMARY>
        public int LeftVolume
        {
            get
            {
                return 0; //Guess could be used to return Volume level: I don't need it
            }
            set
            {
                mciSendString(string.Concat
		("setaudio MediaFile left volume to ", value), null, 0, 0);
            }
        }

        /// <SUMMARY>
        /// Get/Set Right Volume Factor
        /// </SUMMARY>
        public int RightVolume
        {
            get
            {
                return 0; //Guess could be used to return Volume level: I don't need it
            }
            set
            {
                mciSendString(string.Concat
		("setaudio MediaFile right volume to ", value), null, 0, 0);
            }
        }

        /// <SUMMARY>
        /// Get/Set Main Volume Factor
        /// </SUMMARY>
        public int MasterVolume
        {
            get
            {
                return 0; //Guess could be used to return Volume level: I don't need it
            }
            set
            {
                mciSendString(string.Concat
		("setaudio MediaFile volume to ", value), null, 0, 0);
            }
        }

        /// <SUMMARY>
        /// Get/Set Bass Volume Factor
        /// </SUMMARY>
        public int Bass
        {
            get
            {
                return 0;
            }
            set
            {
                mciSendString(string.Concat
		("setaudio MediaFile bass to ", value), null, 0, 0);
            }
        }

        /// <SUMMARY>
        /// Get/Set Treble Volume Factor
        /// </SUMMARY>
        public int Treble
        {
            get
            {
                return 0;
            }
            set
            {
                mciSendString(string.Concat
		("setaudio MediaFile treble to ", value), null, 0, 0);
            }
        }
    }
}

现在读取 *.wpl* 文件以获取要播放的 MP3 [或任何其他格式]。

readPlaylist.cs

using System;
using System.Collections;
using System.Text;
using System.Xml;

namespace MP3player
{
    class readPlaylist
    {
        private ArrayList name = new ArrayList();
        private string m_xmlFile;

        /// <SUMMARY>
        /// The Windows Media Playlist Path xxx.wpl file
        /// </SUMMARY>
        public string playListPath
        {
            get
            {
                return m_xmlFile;
            }
            set
            {
                m_xmlFile = value;
                Makeplaylist();
            }
        }

        /// <SUMMARY>
        /// Return an Arraylist of file found in Windows Media Playlist file
        /// </SUMMARY>
        public ArrayList PlayList
        {
            get
            {
                return name;
            }
        }

        /// <SUMMARY>
        /// Fills up an Arraylist with titles found in the
        /// Windows Media Playlist file.
        /// Using XmlTextReader
        /// </SUMMARY>
        private void Makeplaylist()
        {
            XmlTextReader readList = new XmlTextReader(m_xmlFile);
            while (readList.Read())
            {
                if (readList.NodeType == XmlNodeType.Element)
                {
                    if (readList.LocalName.Equals("media"))
                    {
                        name.Add(readList.GetAttribute(0).ToString());
                    }
                }
            }
        }
    }
}

现在让我们使用代码。

这是包含所有点击事件等的文件的一部分。
这是开始,请确保您已获得所有引用...

MediaPlayer.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MP3player
{
    public partial class MainPlayer : Form
    {
        ArrayList nowPlaylist = new ArrayList();
        Player pl = new Player();

        public MainPlayer()
        {
            InitializeComponent();
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            lstBoxPlayList.Items.Clear();
            openPlaylistDialog.ShowDialog();
            readPlaylist readList = new readPlaylist();
            readList.playListPath = openPlaylistDialog.FileName;
            nowPlaylist = readList.PlayList;
            for (int x = 0; x < nowPlaylist.Count; x++)
            {
                lstBoxPlayList.Items.Add(nowPlaylist[x]);
            }
            lstBoxPlayList.SetSelected(0, true);
        }

上面的代码非常简单。 btnOpen_click 事件将打开一个 OpenFileDialog 窗口,获取选定的 *.wpl* 文件并将其发送到 readPlaylist 类,该类将依次解析它,返回一个包含所有文件名及其路径的 Arraylist。 完成后,循环遍历它以显示其内容[在本例中为 listbox]。 现在您已经准备好所有要播放的文件,所需要做的就是选择一个然后按播放。 或者双击它以启动它(我不会在这里展示这部分)。

播放 listbox 中选定的文件

private void btnPlay_Click(object sender, EventArgs e)
{
    if (lstBoxPlayList.Items.Count > 0)
    {
        pl.Open(lstBoxPlayList.SelectedItem.ToString());
        pl.Play(false);
    }
}

这是一种在播放之前检查是否真的选择了文件的简单方法。
除此之外,非常简单。 当然,如果你从来没有做过,那就不是了。 这叫做学习过程。
如上所述,我认为代码中的注释非常好。 有了它和顶部的 MSDN 链接...你应该做得很好。

另外,我还尝试控制 Bass/Treble。 不知道它是否有效,因为我电脑上的扬声器系统不是很好,而且我的听力不好[因此我的扬声器系统很烂]。 但如果我正确阅读了 MSDN,它似乎与音量控制的工作方式相同。

我想就这些了,希望这个小例子能帮助到某人。

历史

  • 2006 年 11 月 9 日:首次发布
© . All rights reserved.