简单音乐播放器实验报告 - 副本

合集下载

数电实验报告-音乐播放器

数电实验报告-音乐播放器

实验课题:简易乐曲播放器学院:班级:姓名:学号:班内序号:一、设计课题要求 (2)二、设计思路和总体框图 (2)三、分块电路设计 (4)四、仿真波形 (6)五、源程序 (7)六、功能说明 (20)七、所用元器件情况 (20)八、故障及问题分析 (21)九、总结和结论 (22)十、参考文献 (22)一设计课题的任务要求设计制作一个简易乐曲播放器:1. 播放器内预存3 首乐曲;2. 播放模式:顺序播放、随机播放,并用数码管或LED 显示当前播放模式;顺序播放:按内部给定的顺序依次播放3 首乐曲;随机播放:随机产生一个顺序播放3 首乐曲;3. 用数码管显示当前播放乐曲的顺序号;4. 设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;5. 设置Next 和Previous 键,按Next 键可以听下一首,按Previous 键回到本首开始;6. 选做:用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;7. 选做:自拟其它功能。

二设计思路和总体框图设计思路:组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素。

乐曲的12平均律规定:每2个八度音之间的频率相差1倍。

在2个八度音之间,又可分为12个半音,每两个半音的频率比为2开12次方。

另外,音符A (简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。

由此可以计算出简谱中从低音1至高音1之间每个音符的频率,如下表所示。

产生各音符所需的频率可用分频器实现。

本次实验使用的是MAXⅡ实验板,时钟频率为50MHz,计算出各个音符对应的分频系数,进行50%占空比的分频,即可得到各音符对应的频率。

对于节拍,如果将一拍的长度定为1秒,则1/4拍的时间为1/4秒,为其提供一个4Hz的时钟频率即可产生出1/4拍的效果了。

若需要半拍,只需将该音符记录两次就可以了。

产生节拍时钟也用分频器实现,本次实验中时钟频率为5Hz。

简易音乐播放器报告

简易音乐播放器报告

音乐播放器报告书项目名称:简易音乐播放器小组编号:E小组成员:郭元坤、边东东、牛孟强、邢棕、王超目录第1章项目组详情 (1)第2章系统需求分析 (2)2.1 功能需求 (2)2.1.1 播放器的基本控制需求 (2)2.1.2 功能需求分析 (3)2.2 系统结构图和流程图 (4)2.3 系统界面需求 (4)第3章详细设计 (5)3.1 界面设计 (5)3.1.1 播放器的进入界面 (5)3.1.2 播放器主界面 (7)3.2 功能实现 (10)3.2.1 播放器音轨的实现 (10)3.2.2 播放器播放、暂停等功能 (11)3.2.3 数据共享机制 (14)第4章总结 (16)第1章项目组详情E组:组长:郭元坤组员:边东东、牛孟强、邢棕、王超小组成员分工情况:组长郭元坤主要研究音乐播放器系统的需求分析兼读取SD信息中的.mp3文件开发。

而其它功能实现是由边东东、牛孟强、邢棕、王超来实现的。

其各自的负责的主要分工如下:边东东:音乐播放界面和音乐的播放、暂停、上一曲、下一曲,音轨是由我们和边东东、牛孟强实现的。

牛孟强:把从SD卡中读取到的.mp3文件通过列表的方式显示在主页上,还有菜单功能的实现。

包括退出功能和搜索音乐文件功能邢棕和王超:主要负责音乐播放器系统的“设置”界面和功能实现,包括歌词图片的下载和显示还实现了定时退出的功能。

第2章系统需求分析2.1 功能需求2.1.1播放器的基本控制需求根据项目的目标,我们们可获得项目系统的基本需求,一下从不同的角度来描述系统的需求,并且使用用户用例图来描述,系统的功能需求,我们们分成两部分来概括,即播放器的基本控制需要,播放器友好界面需求。

在播放器正在运行时,用户单击“播放”按钮,播放器将播放选中的播放列表中的音乐,并同时显示当前进度;当歌曲未暂停或停止时,用户单击“暂停”按钮,播放器将进行暂停状态;播放器正在播放或暂停时,用户单击“停止”按钮,播放器将停止播放或暂停时,用户点击“上一首”或者“下一首”按钮,播放器将播放上一首或下一首歌曲。

音乐播放器

音乐播放器

数字电路与逻辑设计综合设计实验报告实验名称:简易音乐播放器姓名:班级:071班内序号:一、摘要本实验主要在理论分析和具体的软硬件实现上,完成一个简易的音乐播放器,可以完成上一曲,下一曲,顺序播放,停止,暂停和液晶显示,同时还增加了单曲循环播放功能。

在理论分析的基础上,用VHDL语言编写源代码,再配合具体电路连接,实现对蜂鸣器振动的控制,以及对各项显示功能的切换控制等。

关键字:频率蜂鸣器显示二、设计任务要求n设计制作一个简易乐曲播放器。

1.播放器内预存3首乐曲;2.播放模式:顺序播放、随机播放,并用数码管或LED显示当前播放模式;3.顺序播放:按内部给定的顺序依次播放3首乐曲;4.随机播放:随机产生一个顺序播放3首乐曲;5.用数码管显示当前播放乐曲的顺序号;6.设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;7.设置Next和Previous键,按Next键可以听下一首,按Previous键回到本首开始;8.选做:用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;9.选做:自拟其它功能。

三、设计思路和总体设计框图1.分频器讲1MHz的时钟频率分成4Hz,便于输出每个音符2.切换控制器接收到上曲和下曲信号后,自动切换输出时钟;如当正在播放曲1时,收到上曲信号后,自动切换到向曲2提供时钟,中断曲1的时钟;3.每首曲目结束后,自动输出一个单脉冲给复位模块,如果此时是顺序播放模式时,复位模块向控制器输出复位信号;如果此时是单曲重复播放模式时,复位模块屏蔽接收的单脉冲,不向控制器输出信号。

4.曲目向数控分频器依次输入各个音符,在数控分频器中与2047相减后,迫使蜂鸣器振动,由于各个音符的频率不同,振动的频率自然不同,蜂鸣器发出的声音也完全不同。

5.当输入暂停信号时,暂停模块用高电平与时钟相或,从而产生中断时钟的效果;当输入停止信号时,原理同上,只是多输出一个复位信号给切换控制器。

音乐播放器的实验报告

音乐播放器的实验报告

音乐播放器的实验报告音乐播放器的实验报告引言:音乐是人们生活中不可或缺的一部分,而音乐播放器作为传播音乐的工具,在现代社会中扮演着重要的角色。

本次实验的目的是研究音乐播放器的功能和性能,以及对音乐播放器的使用体验进行评估。

一、功能分析音乐播放器的功能主要包括音频播放、音频格式支持、播放列表管理、音量控制、音效调节等。

通过实验测试,我们发现该音乐播放器在这些方面表现出色。

首先,它支持多种音频格式,包括MP3、WAV、FLAC等,能够满足用户对不同音频格式的需求。

其次,播放器具备良好的播放列表管理功能,用户可以根据自己的喜好创建、编辑和删除播放列表,方便快捷地管理自己的音乐。

此外,音乐播放器还提供了音量控制和音效调节功能,用户可以根据自己的需求来调整音量大小和音频效果,提升音乐的听感。

二、性能测试为了评估音乐播放器的性能,我们进行了多项测试。

首先是音频播放质量测试,我们选择了不同类型的音频文件进行播放,并对比了不同音频播放器的音质表现。

结果显示,该音乐播放器在音频播放质量方面表现出众,音质清晰、细腻,能够还原音频本身的特点。

其次是播放稳定性测试,我们将大量音频文件添加到播放列表中,并进行循环播放测试。

结果显示,音乐播放器在长时间播放过程中没有出现卡顿、崩溃等问题,表现稳定可靠。

最后是资源占用测试,我们对音乐播放器的内存占用和CPU占用进行了测试。

结果显示,该音乐播放器在资源占用方面表现较好,占用资源较少,对设备性能的影响较小。

三、用户体验评估除了功能和性能,用户体验也是评价音乐播放器的重要指标之一。

为了评估用户体验,我们进行了用户调研和使用测试。

调研结果显示,用户对该音乐播放器的界面设计和操作方式较为满意,认为界面简洁、直观,操作便捷。

在使用测试中,用户对音乐播放器的播放速度、响应速度和界面切换速度进行了评估,结果显示,音乐播放器在这些方面表现良好,能够满足用户对流畅使用的需求。

此外,用户还对音乐播放器的搜索功能、歌词显示和背景音乐设置等进行了评价,认为这些功能丰富了用户体验,提升了音乐播放的乐趣。

音乐播放器实验报告

音乐播放器实验报告

目录一、课题的介绍和课题的任务二、设计的要求三、系统的分析和系统中功能的设计四、系统的实现及调试五、系统的使用说明六、总结七、程序主要源代码一、课题的介绍和课题的任务音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。

它涵盖了各种音乐格式的播放工具,比如:MP3播放器,WMA播放器,MP4播放器等。

它们不仅界面美观,而且操作简单,带你进入一个完美的音乐空间。

利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。

要求能够播放常用Windows 音频格式的文件;实现播放控制:播放、暂停、清空播放列表、音量增减、添加歌曲等功能;实现从本地磁盘加入文件,然后对其进行播放。

二、设计的要求系统模块功能图:流程图:二、系统的分析和系统中功能的设计该播放器分为六大功能模块;1、背景图片:音乐播放器的背景图片。

2序中,将文件进行播放。

3、播放/暂停功能:本地磁盘音乐文件添加完毕,单击播放按钮开始播放音乐,直至播放完毕,单击按钮便可以暂停音乐的播放,再次单击按钮时继续播放。

4、播放列表功能:显示添加的歌曲5、清空播放列表功能:清除播放列表中的全部歌曲。

6、音量功能:控制音量的大小四、系统的实现及调试//说明:主要介绍系统编码的实现以及编码中遇到的问题和解决方法。

界面用动态链接库来实现,播放功能用mciSendCommand函数来实现,用外壳函数数来打开文件选项。

定义三3个类两个对话框类CInfoDlg和CEasyPlayerDlg 一个常用类MCI MCI类用来控制播放功能有以下函数Pause:暂态正在播放的音乐Play:播放Stop:停止播放Load:加载播放的音乐GetMediaString:获取播放的时间进度…CInfoDlg:用于查询歌曲的详细信息CEasyPlayerDlg:用于和用户进行交互他有以下函数:CEasyPlayerDlg::OnBtnPlay();单击播放按钮的单击事件。

简易乐曲播放器-数字电路与逻辑设计报告

简易乐曲播放器-数字电路与逻辑设计报告

数字电路与逻辑设计实验报告简易乐曲播放器一、设计课题的任务要求基本任务:设计制作一个简易乐曲播放器。

1. 播放器内预存3 首乐曲;2. 播放模式:顺序播放、随机播放,并用数码管或LED 显示当前播放模式;顺序播放:按内部给定的顺序依次播放3 首乐曲;随机播放:随机产生一个顺序播放3 首乐曲;3. 用数码管显示当前播放乐曲的顺序号;4. 设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;5. 设置Next 和Previous 键,按Next 键可以听下一首,按Previous 键回到本首开始;提高要求:1.用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;2.自拟其它功能。

二、系统设计(设计思路、总体框图、分块设计)设计思路:由于一般乐曲最短音符为四分音符,则总体设计思路为每次播放一个四分音符,持续时间1/4秒(分频),并依次循环播放每个四分音符,每个四分音符对应音调利用1M分频器分频产生,播放功能则利用蜂鸣器播放当前音调对应频率值即可。

主题设计完成后,加入各控制功能,显示功能。

总体框图:结构框图:方框图:ASM图:暂停暂停MDS图:分块设计:1.分频模块(1)音调:在声乐中,每个音调对应一个频率,而本次实验即应用1M的时钟分频为各个音调所对应的频率,由于每次输出仅有一个频率,则可以在某个四分音符播放时选择分频为哪个音调对应的频率。

由于宏单元使用不够,改为先将1M时钟4分频,再利用4分频后的时钟分为各个音调对应的频率以减小计数器最大计数值。

(2)音长:由于一般乐曲中最短音长为四分音符,并设定全音符音长为1s,四分音符音长为4s,利用每次播放一个四分音符的思路依次播放每个音符(全音符播放4次,半分音符2次)直至有其他控制。

即需对1MHz分频为4Hz。

2.控制模块(1)模式控制A.顺序模式:依次播放每个四分音符,播完3首歌曲后循环B.随机模式:利用异或产生随机数并在播完歌曲后(或按下一首)利用所产生的随机数播放另两首歌曲中的一首C.用户自定义模式:a.顺序播放:依次按1、2、3的顺序播放歌曲并循环b.倒序播放:依次按3、2、1的顺序播放歌曲并循环(2)按键控制A.暂停:在任意播放时刻按下即暂停播放,并记下断点处,蜂鸣器消声,所有彩灯数码管熄灭,一切功能键失效,释放时即从断点处恢复B.下一首:在任意播放时刻按下即按当前模式播放下一首歌曲C.本首重放:在任意播放时刻按下即从播放当前播放乐曲的第一个四分音符处开始播放D.上一首:在任意播放时刻按下即按当前模式播放上一首歌曲3.显示模块(1)彩灯播放某个四个分音符时,根据当前播放音调按七个简谱显示在七个彩灯上(2)数码管第一个数码管显示播放模式:顺序显示0,随机显示8,用户自定义正序显示1,用户自定义倒序显示2第二个数码管显示当前播放曲目序号需要控制两个数码管显示时的时钟分配问题(利用视觉暂留控制1M时钟二分频依次点亮两个数码管)(3)蜂鸣器依次播放所需播放的四分音符三、仿真波形及波形分析本实验仿真着实不易。

电子技术试验之音乐播放器实验报告

电子技术试验之音乐播放器实验报告

电子技术试验之音乐播放器实验报告一、实验目的1、熟练使用MAX+PLUSII软件平台。

2、了解音阶发生原理,学会用硬件描述语言(AHDL)建立音阶发生器模块,并最终编成乐曲,使其可以播放乐曲。

3、下载到JDEE-10试验箱上进行调试和验证音乐播放器的功能。

二、预期功能1、播放一首乐曲。

2、用任意微动开关的按动来控制音乐的播放与停止。

3、数码管两位显示正在播放的音符简谱。

4、点阵模拟五线谱,用十字灯标出正在播放的音符在音阶中的位置。

三、方案设计顶层设计图:模块说明:FREQ**:不同的音高发生器FREQDIVIDER:将高音一分为二产生低音的分频器KEYFORSTOP+stopsign:控制音乐播放与停止的输入端,stopsign为计数器,输出停止与播放的信号counter1:作为音乐节奏的分频器NEW_WORLD:乐曲播放器,曲名为《来自新世界》ED27SEGMENT:数码管控制器,输出显示简谱与高低音counter_disp+DISP:点阵控制器及其输入的扫描时钟信号分频器下面将介绍以上模块的具体实现及功能。

1、分频①音频分频音名与频率的关系:音乐上的十二平均律规定:每两个八度音之间的频率相差一倍。

在这两个八度音之间,分成十二个半音,每两个相领半音的频率比为12√2。

另外还规定,音名A(简谱低音6)的频率为 440Hz。

音名 B 到 C 之间、E 到 F 之间为半音,其余为全音。

这样,可计算得从低音5到高音3之间的每个音名的频率为:(*l表示低音,*h表示高音)∶g:1567.98Hzgl783.99Hzal:880Hz a:1760Hzbl:987.76Hz b:1975.53Hz->2024.77c:1046.50Hz ch:2093Hz->1911.13d:1174.66Hz dh:2349.32Hz->1702.62e:1318.51Hz eh:2637.02Hz->1516.86f:1396.92Hz这些低频信号由高频信号经过分频而得,时钟频率4MHz,而音频ah为1760Hz,则4M/1760=2272,由此设计一个2272进制的计数器,其时钟信号为4MHz,进位信号就是1760Hz。

QT制作简易音乐播放器报告

QT制作简易音乐播放器报告

目录1.课程实习目的 (1)1.1了解QT和QT creator (1)1.2了解Qt phonon的多媒体框架 (1)2.课程实习题目描述和要求 (1)2.1 QT制作音乐播放器 (1)2.2音乐播放器能实现简单的功能 (1)3.课程实习报告内容 (1)3.1实验步骤 (1)3.2程序代码 (2)3.3实现截图 (4)4.总结 (5)5.任务分配 (6)1.课程实习目的1.1了解QT和QT creatorQt Creator是跨平台的Qt IDE,Qt Creator 是Qt 被Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。

此IDE 能够跨平台运行,支持的系统包括Linux(32 位及64 位)、Mac OS X 以及Windows。

根据官方描述,Qt Creator 的设计目标是使开发人员能够利用Qt 这个应用程序框架更加快速及轻易的完成任务。

1.2了解Qt phonon的多媒体框架Phonon是什么?Qt从4.4版本开始提供的一套多媒体框架,提供多媒体回放的功能。

目前在Qt 4.6中实现多媒体播放图形界面主要依赖于phonon框架,其实qt中还有一个Multimedia模块,帮助文档中对它的描述是:实现底层的多媒体播放功能,在一般情况下上层的接口phonon模块更适合实现这些功能。

phonon最初是一个源于KDE的项目,为使用音频和视频的应用程序开发提供的一个框架。

应用程序不用去管多媒体播放是通过什么实现的(如gstreamer、xine),只需调用相应的接口就行,但这中间需要一个中转,被称为backend。

Qt也是通过phonon来实现跨平台的多媒体播放。

2.课程实习题目描述和要求2.1 QT制作音乐播放器通过创建带有Phonon模块的工程,对音乐播放器进行设计,主要用到模块中的MediaObject (管理媒体源) AudioOutput (连接物理设备)SeekSlider(实现进度条)QList (实现播放列表)2.2音乐播放器能实现简单的功能这个软件设计的目的就是制作一个能够播放音频的播放器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多媒体技术教程期末实验报告题目:基于MFC的简单音乐播放器班级:软件工程专业:软件工程姓名:xxx学号:xxxxxxxxxx指导老师:xxxXxxxxxx一、课题描述音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。

利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个功能非常简单易于操作的MP3播放器。

要求能够播放常用Windows音频格式的文件;实现播放控制:播放、暂停、音量增减、添加歌曲等功能;实现从本地磁盘加入文件,然后对其进行播放。

本程序是基于MFC对话框的简单程序实现音乐的简单控制。

二、功能分析MFC简单音乐播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。

利用MCI基本知识实现相关功能。

通过该程序可以实现简单的音乐播放。

核心是让音乐文件和音乐播放设备关联。

三、源代码和截图具体属性和类向导如下:实现后截图:四、实验心得:实现播放时间的控制是我在实验时遇到的难题,通过上网查询资料得以实现。

制作音乐播放器其实是个挺有趣的体验,完成了也有小小成就感。

但这个简易音乐播放器还有许多功能尚未实现,例如同步歌词显示等等,要真正做一个完善的播放器还需要很多努力。

各个控件的函数如下://浏览void CMFCDlg::Onfilechoice(){char szFileFilter[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|""所有文件(*.*)|*.*|";CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);if(dlg.DoModal()==IDOK){CString strFilepath=dlg.GetPathName();CString strFilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strFilename);Load(this->m_hWnd,strFilepath);GetDlgItem(IDC_play)->EnableWindow(true);//文件读取成功时所有按钮变可选的GetDlgItem(IDC_pause)->EnableWindow(true);GetDlgItem(IDC_stop)->EnableWindow(true);m_list.InsertString(m_list.GetCount(),strFilename);m_list.SetCurSel(m_list.GetCount()-1);}}//播放void CMFCDlg::Onplay(){CString strfilename;int index=m_list.GetCurSel();CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);if(index==-1){MessageBox("请添加音乐");return;}m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);stop();Load(this->m_hWnd,strfilename);play();SetTimer(0,1000,NULL);}//暂停void CMFCDlg::Onpause(){CString strtemp;GetDlgItemText(IDC_pause,strtemp);//获取按钮状态if(pare("暂停")==0){pause();SetDlgItemText(IDC_pause,"恢复");KillTimer(0);//取消计数器的显示}if(pare("恢复")==0){resume();SetTimer(0,1000,NULL);SetDlgItemText(IDC_pause,"暂停");}}//停止void CMFCDlg::Onstop(){stop();SetDlgItemText(IDC_pause,"暂停");KillTimer(0);//取消计数器的显示CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用GetDlgItem(IDC_pause)->EnableWindow(false);GetDlgItem(IDC_del)->EnableWindow(false);}//添加void CMFCDlg::Onfileopen(){char filefiler[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|";CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,filefi ler);if (dlg.DoModal()==IDOK){CString strfilepath=dlg.GetPathName();CString strfilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strfilename);CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);Load(this->m_hWnd,strfilepath);GetDlgItem(IDC_play)->EnableWindow(true);GetDlgItem(IDC_pause)->EnableWindow(true);GetDlgItem(IDC_stop)->EnableWindow(true);GetDlgItem(IDC_del)->EnableWindow(true);m_list.InsertString(m_list.GetCount(),strfilename);//获取文件名m_list.SetCurSel(m_list.GetCount()-1);}}//删除void CMFCDlg::Ondel(){// TODO: Add your control notification handler code hereUpdateData(TRUE);int index=m_list.GetCurSel();stop();SetDlgItemText(IDC_filename,"");KillTimer(0);hour=0;minute=0;second=0;if(index!=CB_ERR){m_list.DeleteString(index);}}void CMFCDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCString mtime;second++;CClientDC dc(this);dc.SetBkColor(RGB(124,252,0));dc.SetTextColor(RGB(255,255,203));if(second==60){minute++;second=0;}if(minute==60){hour++;minute=0;}mtime.Format("%02d:%02d:%02d",hour,minute,second);dc.TextOut(320,85,mtime);DWORD cdf=getinformation(MCI_STATUS_POSITION);DWORD cdfrom;cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAME(cdf));UpdateData(false);CDialog::OnTimer(nIDEvent);}//双击列表void CMFCDlg::OnDblclkList(){CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);CString strfilename;int index=m_list.GetCurSel();m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);stop();Load(this->m_hWnd,strfilename);play();SetTimer(0,1000,NULL);}//上一首void CMFCDlg::Onprevious(){int index;index=m_list.GetCurSel();index-=1;if(index<0){MessageBox("亲,没有上一首了哟~");return;}m_list.SetCurSel(index);Onplay();}//下一首void CMFCDlg::Onnext(){CString filename;CString temp;int index;index=m_list.GetCurSel();index+=1;if(index==m_list.GetCount()){MessageBox("已经是最后一首了,亲^.^");return;}m_list.SetCurSel(index);Onplay();}//退出软件void CMFCDlg::Onexitbt(){CDialog::OnCancel();}==========================MFC音乐播放器Dlg.cpp================================ // MFC音乐播放器Dlg.cpp : implementation file//#include "stdafx.h"#include "MFC音乐播放器.h"#include "MFC音乐播放器Dlg.h"#include "Mmsystem.h"#include "Digitalv.h"#pragma comment(lib,"Winmm.lib")#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifHWND m_hWnd;DWORD DeviceID;MCI_OPEN_PARMS mciopenparms;int hour,minute,second;void Load(HWND hWnd,CString strFilepath){m_hWnd=hWnd;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备mciopenparms.lpstrElementName=strFilepath;//将音乐文件路径传给设备DWORD dwReturn;if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(L PVOID)&mciopenparms)){//如果打开文件失败,则将出错信息储存在buffer,并显示出错警告char buffer[256];mciGetErrorString(dwReturn,buffer,256);MessageBox(hWnd,buffer,"出错警告!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);}DeviceID=mciopenparms.wDeviceID;//打开文件成功就关联文件到设备}DWORD getinformation(DWORD item){MCI_STATUS_PARMS mcistatusparms;mcistatusparms.dwItem=item;mcistatusparms.dwReturn=0;mciSendCommand(DeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);return mcistatusparms.dwReturn;}void play(){MCI_PLAY_PARMS mciplayparms;mciplayparms.dwCallback=(DWORD)m_hWnd;mciplayparms.dwFrom=0;//每次播放都是从0开始播放mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplaypa rms);}void pause(){mciSendCommand(DeviceID,MCI_PAUSE,0,0);}void resume(){mciSendCommand(DeviceID,MCI_RESUME,0,0);}void stop(){mciSendCommand(DeviceID,MCI_STOP,0,0);mciSendCommand(DeviceID,MCI_CLOSE,0,0);//当点击停止按钮时,将所有的信息都清除掉}DWORD setvolume(DWORD vol){MCI_DGV_SETAUDIO_PARMS setvolume;//这是设置音量的参数数据结构setvolume.dwCallback=NULL;setvolume.dwItem=MCI_DGV_SETAUDIO_VOLUME;//动作是设置音量setvolume.dwValue=vol;//音量值是volmciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO _VALUE,(DWORD)(LPVOID)&setvolume);return 0;}/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMFCDlg dialogCMFCDlg::CMFCDlg(CWnd* pParent /*=NULL*/): CDialog(CMFCDlg::IDD, pParent){//{{AFX_DATA_INIT(CMFCDlg)m_int = 0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);hour=0;minute=0;second=0;}void CMFCDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMFCDlg)DDX_Control(pDX, IDC_LIST, m_list);DDX_Control(pDX, IDC_SLIDER, m_slider);DDX_Text(pDX, IDC_vol, m_int);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMFCDlg, CDialog)//{{AFX_MSG_MAP(CMFCDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_about, Onabout)ON_BN_CLICKED(IDC_exitbt, Onexitbt)ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER, OnCustomdrawSlider)ON_BN_CLICKED(IDC_filechoice, Onfilechoice)ON_BN_CLICKED(IDC_play, Onplay)ON_BN_CLICKED(IDC_pause, Onpause)ON_BN_CLICKED(IDC_stop, Onstop)ON_BN_CLICKED(IDC_fileopen, Onfileopen)ON_BN_CLICKED(IDC_del, Ondel)ON_WM_TIMER()ON_LBN_DBLCLK(IDC_LIST, OnDblclkList)ON_BN_CLICKED(IDC_previous, Onprevious)ON_BN_CLICKED(IDC_next, Onnext)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMFCDlg message handlersBOOL CMFCDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small iconm_slider.SetRange(0,1000);//滑块的移动范围0~1000m_slider.SetPos(500);//滑块指针的初始位置设为500代表初始音量为50GetDlgItem(IDC_play)->EnableWindow(false);//文件没有读取时所有按钮应该是不可选的GetDlgItem(IDC_pause)->EnableWindow(false);GetDlgItem(IDC_stop)->EnableWindow(false);return TRUE; // return TRUE unless you set the focus to a control}void CMFCDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CMFCDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{//CDialog::OnPaint();CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP5);BITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeig ht,SRCCOPY);}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CMFCDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMFCDlg::Onabout(){CAboutDlg dlg;dlg.DoModal();}void CMFCDlg::Onexitbt(){CDialog::OnCancel();}void CMFCDlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult){UpdateData(true);m_int=m_slider.GetPos()/10;setvolume(m_slider.GetPos());UpdateData(false);*pResult = 0;}void CMFCDlg::Onfilechoice(){char szFileFilter[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|""所有文件(*.*)|*.*|";CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);if(dlg.DoModal()==IDOK){CString strFilepath=dlg.GetPathName();CString strFilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strFilename);Load(this->m_hWnd,strFilepath);GetDlgItem(IDC_play)->EnableWindow(true);//文件读取成功时所有按钮变可选的GetDlgItem(IDC_pause)->EnableWindow(true);GetDlgItem(IDC_stop)->EnableWindow(true);m_list.InsertString(m_list.GetCount(),strFilename);m_list.SetCurSel(m_list.GetCount()-1);}}void CMFCDlg::Onplay(){CString strfilename;int index=m_list.GetCurSel();CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);if(index==-1){MessageBox("请添加音乐");return;}m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);stop();Load(this->m_hWnd,strfilename);play();SetTimer(0,1000,NULL);}void CMFCDlg::Onpause(){CString strtemp;GetDlgItemText(IDC_pause,strtemp);//获取按钮状态if(pare("暂停")==0){pause();SetDlgItemText(IDC_pause,"恢复");KillTimer(0);//取消计数器的显示}if(pare("恢复")==0){resume();SetTimer(0,1000,NULL);SetDlgItemText(IDC_pause,"暂停");}}void CMFCDlg::Onstop(){stop();SetDlgItemText(IDC_pause,"暂停");KillTimer(0);//取消计数器的显示CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用GetDlgItem(IDC_pause)->EnableWindow(false);GetDlgItem(IDC_del)->EnableWindow(false);}void CMFCDlg::Onfileopen(){char filefiler[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|";CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,filefi ler);if (dlg.DoModal()==IDOK){CString strfilepath=dlg.GetPathName();CString strfilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strfilename);CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);Load(this->m_hWnd,strfilepath);GetDlgItem(IDC_play)->EnableWindow(true);GetDlgItem(IDC_pause)->EnableWindow(true);GetDlgItem(IDC_stop)->EnableWindow(true);GetDlgItem(IDC_del)->EnableWindow(true);m_list.InsertString(m_list.GetCount(),strfilename);//获取文件名m_list.SetCurSel(m_list.GetCount()-1);}}void CMFCDlg::Ondel(){// TODO: Add your control notification handler code hereUpdateData(TRUE);int index=m_list.GetCurSel();stop();SetDlgItemText(IDC_filename,"");KillTimer(0);hour=0;minute=0;second=0;if(index!=CB_ERR){m_list.DeleteString(index);}}void CMFCDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCString mtime;second++;CClientDC dc(this);dc.SetBkColor(RGB(124,252,0));dc.SetTextColor(RGB(255,255,203));if(second==60){minute++;second=0;}if(minute==60){hour++;minute=0;}mtime.Format("%02d:%02d:%02d",hour,minute,second);dc.TextOut(320,85,mtime);DWORD cdf=getinformation(MCI_STATUS_POSITION);DWORD cdfrom;cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRA ME(cdf));UpdateData(false);CDialog::OnTimer(nIDEvent);}void CMFCDlg::OnDblclkList(){CString mtime;CClientDC dc(this);hour=0;minute=0;second=0;dc.SetBkColor(RGB(124,252,0));//设置放置计数器区域的外观dc.SetTextColor(RGB(255,255,203));//设置数字显示的颜色mtime.Format("%02d:%02d:%02d",hour,minute,second);//显示时间进度dc.TextOut(320,85,mtime);CString strfilename;int index=m_list.GetCurSel();m_list.GetText(index,strfilename);SetDlgItemText(IDC_filename,strfilename);stop();Load(this->m_hWnd,strfilename);play();SetTimer(0,1000,NULL);}void CMFCDlg::Onprevious(){int index;index=m_list.GetCurSel();index-=1;if(index<0){MessageBox("亲,没有上一首了哟~");return;}m_list.SetCurSel(index);Onplay();}void CMFCDlg::Onnext(){CString filename;CString temp;int index;index=m_list.GetCurSel();index+=1;if(index==m_list.GetCount()){MessageBox("已经是最后一首了,亲^.^");return;}m_list.SetCurSel(index);Onplay();}。

相关文档
最新文档