MP3播放器程序课程设计书
- 格式:doc
- 大小:209.00 KB
- 文档页数:29
《微型计算机系统原理与应用》课程设计报告设计题目:音乐播放器姓名:学号:指导老师:日期:课程设计任务书目录第一章课程设计的任务和目的31.1 课程设计任务31.2 课程设计目的3第二章课程设计基础知识42.1 定时/计数器8253A (4)2.2 8253A部结构42.3 8253A外部引脚52.4 计数器部结构62.5 8253A端口地址72.6 8253A功能72.7 8253A控制字82.8 8253A工作方式8第三章详细设计103.1 硬件设计103.2 软件设计13第四章程序调试14第五章总结14第六章参考文献15第七章附录167.1 源代码167.2 各个音符的对应频率18第一章课程设计的任务和目的1.1 课程设计任务本课程设计题目是:设计并实现一个音乐播放器。
1.自己选用芯片和其它的硬件。
2.自行设计电路并使用汇编语言编写程序完成音乐播放器功能。
3.利用8253作为音阶频率发生器,对一段音乐进行编码后存入音符表,程序中可调用音符表自动播放音乐,从中了解音乐播放的原理。
4.利用8253A和PC机,设计并实现简易音乐播放器5.使用汇编语言编写音乐播放程序。
6.上机调试程序并联机,利用试验箱提供的扬声器发声。
7.完成实验报告。
1.2课程设计目的本课程设计注重提高学生应用能力、创新能力。
在掌握了基本的实验方法和实验技能且理论教学完成的基础上,要求学生通过一周的集中工作,初步锻炼综合运用所学知识的能力,通过讨论与合作,完成一项完整的设计工作。
更深入的了解微机芯片的用法和程序的完成过程,调试方法与技巧。
通过这个环节来加深对《微机原理与接口技术》所学容的理解和融会贯通。
设计音乐播放器主要目的:➢通过D/A装换器产生模拟信号,在实验平台上实现简易音乐播放器。
➢了解利用数模转换器产生音乐的基本方法。
➢掌握定时/计数器8253A 的使用。
第二章课程设计基础知识2.1 定时/计数器8253A在微机与控制系统中,经常要用到定时信号。
课程设计说明书课程设计名称:嵌入式系统课程设计课程设计题目:音乐播放器学院名称:信息工程学院专业:计算机科学与技术班级:090451 学号:09045102 :评分:教师:2012年11月30 日摘要: (1)第一章课程设计要求和容 (2)1.1设计目标和要求 (2)1.2 设计容 (2)第二章开发工具介绍 (3)第三章系统设计与实现 (5)3.1 宿主机开发环境配置 (5)3.2功能分析与方案论证 (5)3.2.1 功能分析 (5)3.2.2 可行性分析 (5)3.3 需求分析 (6)3.4详细设计 (6)3.4.1 系统的功能模块设计 (6)3.4.2 界面窗口模块详细设计与实现 (7)3.4.5 MP3 文件播放控制模块详细设计与实现 (10)3.4.6 主要程序文件(代码见附录) (12)第四章调试分析 (12)第五章设计总结 (13)主要参考文献: (13)附录(流程图、源代码): (14)附录1 相关流程图 (14)附录2 系统运行效果 (16)附录3 程序源代码 (17)音乐播放器摘要:随着用户要求的不断提高,越来越多的嵌入式设备使用功能强大、价格低廉的嵌入式Linux作为操作系统并开始采用较为复杂的图形用户界面。
Qt以其强大的功能、良好的可移植性逐渐成为一种被广泛使用的GUI系统。
正是由于嵌入式操作系统及其相应图形用户界面的不断发展,嵌入式软件的开发显得越来越重要,其中嵌入式媒体播放器由于能够满足人们的视听享受已经逐渐成为了系统中不可或缺的重要组成部分,在嵌入式系统上开发媒体播放器已经成为了一个技术热点,当前许多嵌入式产品中都包含媒体播放器。
因此在基于Qt的嵌入式Linux系统中实现媒体播放器具有深刻的意义和实用价值。
本次课程设计运用Qt技术在Linux下进行GUI设计,以一个图形界面为例,运用QT creator软件编程,实现一个简单的音乐播放器。
此播放器能够播放本地的音频文件,在功能方面,它具备一些基本的音乐操作处理功能,如暂停、播放、音量调节、停止等,此外,界面还能显示歌曲信息,比如显示播放列表,播放的时候能够通过按钮来实现歌词显示的功能。
Java程序设计课程设计说明书简单音乐播放器起止日期:2011年12月6日至2012年1月4日学生姓名XXX班级软件工程093班学号09408300310 成绩指导教师计算机与通信学院2011年12 月28日目录一、绪论 (1)1.1 课题背景 (1)1.2 课程设计目的 (1)1.4 课程设计实验环境 (1)1.5 课程设计要求 (1)二、课程系统分析 (3)2.1 系统分析 (3)2.1 功能分析 (3)三、系统设计 (4)3.1 系统功能结构图 (4)3.2 模块功能设计 (4)3.2.1处理“添加”按钮 (4)3.2.2处理“播放”按钮 (4)3.2.3 处理“停止”按钮 (4)3.2.4 处理“单曲循环”按钮 (5)四、系统实现 (6)4.1 系统主界面的实现 (6)4.2 系统主要功能实现 (6)4.2.1系统主界面及关键代码: (6)4.2.2添加文件的界面和代码: (9)4.2.3 播放音乐的界面和代码: (11)4.2.4 单曲循环的界面和代码: (12)五、设计总结 (15)5.1 设计体会及评价 (15)参考文献 (16)致谢 (17)一、绪论1.1 课题背景随着社会电子音乐文件的与日俱增,作为现在最流行的音乐文件*.mp3,*.wav文件的数量和规模也在比以往的任何时候要多,不论是电台DJ需要使用方便而有效地管理自己所使用的音乐文件,还是个人。
在计算机日益普及的今天,若采用一套有效的音乐播放器。
将自己所收藏的大量的音乐文件能随时随地的播放,这将方便于众用户听音乐的需求。
通过使用本音乐播放器能为音乐爱好者带来意想不到的收获。
1.2 课程设计目的《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
《嵌入式系统原理》课程设计说明书题目:利用STM32实现MP3播放器院(系):信息与电气工程学院STM32芯片应用实验设计任务书第一种方案是简易声波播放器,仅使用STM103V100评估板,令计时器TIM4工作在PWM模式下,将wav格式的声波文件从SD卡中读出,由TIM4产生不同频率的方波通过低通滤波器和放大器送喇叭,如图1所示;第二种方案则是简易MP3播放器,还需要使用额外的解码芯片,将MP3格式的文件从SD卡读出,然后送解码芯片解码播放,如图2所示。
本节将先介绍SD卡、FAT16文件格式、VS1003编解码器等关键部分,然后再分别给出两种设计方案的软件设计。
图1 简易声波播放器方案图2 简易MP3 Player方案1 SD卡的结构及读写方法STM103V100评估板有SD连接器,其使用SPI总线与STM32处理器连接,如图3所示。
图3 SD连接器与STM32处理器SPI连接图SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。
本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD 卡,可以参考相关资料。
SD卡内部结构及引脚如图4所示。
图4 SD卡内部结构及引脚SD卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz 之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率;CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。
SD卡以命令形式来控制SD卡的读写等操作。
可根据命令对多块或单块进行读写操作。
python课程设计音乐播放器一、教学目标本课程的目标是让学生掌握Python编程语言的基本知识,学会使用Python编写简单的音乐播放器程序。
通过本课程的学习,学生将能够:1.理解Python编程语言的基本语法和结构;2.掌握使用Python编写控制流程、函数和模块的基本方法;3.学会使用Python的音频处理库,如pygame,实现音乐播放功能;4.培养学生的编程思维和问题解决能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.Python编程语言基本语法和结构;2.Python控制流程、函数和模块的使用;3.Pygame音频处理库的介绍和应用;4.音乐播放器程序的设计与实现。
具体的教学内容安排如下:第一课时:Python编程语言基本语法和结构第二课时:Python控制流程、函数和模块的使用第三课时:Pygame音频处理库的介绍和应用第四课时:音乐播放器程序的设计与实现三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法和实验法等。
具体教学方法安排如下:1.讲授法:用于讲解Python编程语言基本语法和结构、Python控制流程、函数和模块的使用、Pygame音频处理库的介绍等理论知识;2.讨论法:在讲解案例和实验过程中,引导学生进行讨论,培养学生的编程思维和问题解决能力;3.案例分析法:通过分析实际的音乐播放器程序案例,让学生理解程序设计的过程和方法;4.实验法:让学生动手编写音乐播放器程序,巩固所学知识,提高实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《Python编程:从入门到实践》或《Python核心编程》;2.参考书:Python官方文档、Pygame官方文档等相关资料;3.多媒体资料:教学PPT、视频教程等;4.实验设备:计算机、音响等。
通过以上教学资源的支持,学生将能够更好地完成本课程的学习任务,提高自己的编程能力。
VB课程设计报告报告名称 MP3播放器详细设计报告年级 10级学院计算机学院专业计算机科学与技术专业学号 12101113 姓名张木春任课教师于时飞完成时间 2013.5.31 成绩(报告在给出成绩的同时须由评阅人写出评语)详细设计说明1.引言 (3)1.1编写目的 (3)1.2项目背景 (3)1.3定义 (3)1.4参考资料 (4)2.总体设计 (4)2.1需求概述 (4)2.2软件结构 (4)3.程序描述 (4)3.1功能 (8)3.2性能 (8)3.3输入项目 (8)3.4输出项目 (9)3.5限制条件 (9)3.6测试要点 (9)1.引言1.1编写目的编写本程序的目的是设计一个MP3播放器,能实现,播放,停止,暂停,音量设置,左右声道,音乐添加删除,音乐列表的记忆功能,顺序播放,随机播放,循环播放等功能.通过阅读详细设计说明书,我们可以清楚的知道界面上每个控件的功能及每段代码所实现的功能.该说明说适合于所有了解VB语言的读者,可读性强.1.2项目背景本项目是在我们上完Visual Basic 2005 程序设计课和软件工程课之后,王国伟老师为了对我们进行简单考核而提出的课程设计题目.该项目由王国伟老师直接主管,并依托于信息技术学院六楼数学实验室来完成,项目时间为两周.1.3定义1.3定义(1)数据类型:String 字符串Boolean 浮点型Integer 整型(2)常用控件及属性Button 命令按钮控件RadioButton 单选框控件OpenFileDialog 打开文件对话框控件File close()关闭文件函数ListView控件:(属性)Add: 添加列表项SelectedItems():选中的列表项Remove: 删除列表项AxWindowsMediaPlayer控件:(属性)URL:获取多媒体文件的路径及文件名Ctlcontrols: 获取多媒体文件的控制方法CurrentPosition:获取多媒体当前的播放进度TrackBar控件:(属性)Value:获取滑块目前所在的位置1.4参考资料[1] 李捷. Visual Basic 2005—程序设计教程-北京机械工业出版社,2007.7[2] 杨富国. Visual Basic 程序开发案例解析-清华大学出版社,2006.1[3]康祥顺. Visual Basic 案例开发集锦-电子工业出版社,2006.12.总体设计2.1需求概述本项目的开发宗旨是实现Windows Media player 的MP3播放器功能,使用户方便的播放音乐,并根据兴趣添加播放列表.根据系统实现的目的,可以描述出MP3播放器功能,该系统主要包括下列四部分:1.音乐播放功能;2.歌曲列表管理功能;3.音量设置,左右声道设置;4.播放模式更换功能.其中,音乐播放功能包括音乐的播放,暂停,停止, ,是本程序的基本功能.歌曲列表管理功能实现了歌曲列表的添加,删除保存等功能,方便用户使用.音量,声道设置功能可以实现,歌曲音量大小的调节和左右声道模式的转换.播放模式更换功能,可以实现顺序播放,随机播放,单曲循环等不同模式之间的转换,,使播放方式更加人性化.2.2软件结构需求分析---详细设计---调试----改进---再调试3.程序描述1.全局变量声明Public Class Form1'设置全局变量Dim paths() As String'定义打开文件路径数组Dim FileName As String'定义文件名Dim SingName As String'定义歌曲名称Dim i As IntegerDim selIndex As IntegerDim path As StringDim d1, d2 As Integer2.‘添加按纽事件Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim sfile As String'定义歌曲名称Dim j As Integer'定义循环变量Dim count As Integer'定义已有歌曲数目With OpenFileDialog1 '打开新文件.Title = "打开mp3文件".Multiselect = True.Filter = "mp3文件(*.mp3)|*.mp3".ShowDialog()paths = .FileNamesEnd Withi = paths.GetUpperBound(0) '获取此次打开文件的数目For j = 0 To icount = ListView1.Items.Countsfile = paths(i - j).Substring(paths(j).LastIndexOf("/") + 1) '获取歌曲名称Dim mitem As New ListViewItem(Str(count + 1), j)mitem.SubItems.Add(sfile)mitem.SubItems.Add(paths(i - j))ListView1.Items.Add(mitem) '把新打开的文件添加到列表控件中NextEnd Sub3.'播放按纽事件Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.ClickselIndex = ListView1.SelectedItems(0).Text - 1FileName = ListView1.SelectedItems.Item(0).SubItems(1).Text '获取歌曲名称 path = ListView1.SelectedItems.Item(0).SubItems(2).TextAxWindowsMediaPlayer1.URL = path '设置播放文件 AxWindowsMediaPlayer1.Ctlcontrols.play() '开始播放Label2.Text = FileNameDim Str As StringLabel2.Text = FileNameTimer1.Enabled = TrueButton2.Enabled = TrueStr = FileName.Substring(stIndexOf("."))FileName = FileName.Remove(FileName.Length - _Str.Length, Str.Length)Label2.Text = FileName '对字符串进行处理,仅获取无后缀歌曲名End Sub4.'停止按纽事件,Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.ClickAxWindowsMediaPlayer1.Ctlcontrols.stop()End Sub5.'退出并保存列表按纽事件Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.ClickFileOpen(1, "d:\xs.txt", OpenMode.Output)Dim i, j As IntegerDim st As String = ""j = ListView1.Items.Count - 1For i = 0 To jst = ListView1.Items(i).SubItems(2).TextPrintLine(1, st)NextFileClose(1)Close()EndEnd Sub6.'计时器事件Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.TickDim m1, m2 As IntegerDim s1, s2 As IntegerDim n As Integerd1 = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition '获取当前播放进度 d2 = AxWindowsMediaPlayer1.currentMedia.duration '获取需要的总时间 TrackBar1.Value = d1TrackBar1.TickFrequency = d2TrackBar1.Maximum = d2m1 = d1 \ 60 : s1 = d1 Mod 60m2 = d2 \ 60 : s2 = d2 Mod 60Label1.Text = "已播放" & m1 & ":" & Format(s1, "00") & "(" & m2 & ":" & Format(s2, "00") & ")"'显示播放进度If m1 = m2 And m1 <> 0 And s1 = s2 ThenIf RadioButton1.Checked = True Thenn = selIndexListView1.Items(n).Selected = Falsen = n + 1If n < ListView1.Items.Count - 1 ThenListView1.Items(n).Selected = Truebf()End IfElseIf RadioButton2.Checked = True Thenn = selIndexListView1.Items(n).Selected = FalseRandomize()n = CInt(Int((ListView1.Items.Count - 1 - 0 + 1) * Rnd()))ListView1.Items(n).Selected = Truebf()Elsebf()End IfEnd IfEnd Sub7 '列表视图控件Private Sub ListView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.DoubleClickDim str As StringselIndex = ListView1.SelectedItems(0).Text - 1FileName = ListView1.SelectedItems.Item(0).SubItems(1).Text '获取歌曲名称 path = ListView1.SelectedItems.Item(0).SubItems(2).Text '获取歌曲路径 AxWindowsMediaPlayer1.URL = path '设置播放文件 AxWindowsMediaPlayer1.Ctlcontrols.play() '开始播放Label2.Text = FileNameTimer1.Enabled = TrueButton2.Enabled = Truestr = FileName.Substring(stIndexOf("."))FileName = FileName.Remove(FileName.Length - str.Length, str.Length)Label2.Text = FileNameEnd Sub8'删除Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.ClickDim INQ As IntegerDim ri As IntegerDim count As IntegerINQ = ListView1.SelectedItems(0).Text - 1ListView1.Items(INQ).Remove()count = ListView1.Items.CountFor ri = 0 To count - 1ListView1.Items(ri).SubItems(0).Text = Str(ri + 1)NextEnd Sub9 '左声道Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.ClickAxWindowsMediaPlayer1.settings.balance = -100End Sub10'右声道Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.ClickAxWindowsMediaPlayer1.settings.balance = 100End Sub11'暂停Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.ClickAxWindowsMediaPlayer1.Ctlcontrols.pause()End SubSub bf()selIndex = ListView1.SelectedItems(0).Text - 1FileName = ListView1.SelectedItems.Item(0).SubItems(1).Text '获取歌曲名称 path = ListView1.SelectedItems.Item(0).SubItems(2).TextAxWindowsMediaPlayer1.URL = path '设置播放文件 AxWindowsMediaPlayer1.Ctlcontrols.play() '开始播放Label2.Text = FileNameEnd SubEnd Class3.1功能1.音乐播放功能;2.歌曲列表管理功能;3.音量设置,左右声道设置;4.播放模式更换功能.3.2性能本播放器结构简单,性能良好,操作简单,适合于大众人群的使用.3.3输入项目对该播放器的播放列表添加想要播放的歌曲,播放器就能按要求播放音乐.3.4输出项目3.5限制条件硬件条件:普通的计算机和工作站软件条件:运行环境需安装Visual Basic 2005软件3.6测试要点对播放器的每个功能都需要逐一测试,具体要求是:1.对播放功能的各个控件功能进行测试2.对歌曲列表管理功能进行测试3.对音量设置功能进行测试,包括音量测试,和左右声道功能测试4.对不同的播放模式进行测试,看能否实现音乐的顺序播放,随机播放,单曲循环功能.。
androidmp3课程设计一、课程目标知识目标:1. 学生能理解Android系统中MP3播放器的基本原理和功能。
2. 学生能掌握在Android平台上开发MP3播放器的关键技术和步骤。
3. 学生能了解MP3文件格式和相关音频处理知识。
技能目标:1. 学生能够运用Android Studio开发环境,独立设计和编写具有基本功能的MP3播放器应用程序。
2. 学生能够通过调试和测试,优化MP3播放器性能,解决常见问题。
3. 学生能够运用所学的编程知识,为MP3播放器添加自定义功能和界面设计。
情感态度价值观目标:1. 学生培养对编程和移动应用开发的兴趣,提高信息技术素养。
2. 学生树立团队协作意识,学会与他人共同解决问题,提高沟通能力。
3. 学生养成自主学习和持续探究的习惯,勇于面对挑战,克服困难。
课程性质:本课程为信息技术课程,以实践操作为主,理论讲解为辅。
学生特点:学生具备一定的编程基础,对Android系统有一定了解,具有较强的学习能力和动手能力。
教学要求:教师应注重培养学生的实际操作能力,鼓励学生自主探究和团队协作,关注学生个体差异,提供有针对性的指导。
教学过程中,将目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. Android系统简介:Android平台的发展历程、系统架构及特点。
- 教材章节:第一章 Android概述2. MP3文件格式与处理:MP3文件的结构、编码原理及音频处理技术。
- 教材章节:第二章 音频技术基础3. Android音频播放框架:MediaPlayer类的使用、音频焦点管理、通知栏控制等。
- 教材章节:第三章 Android音频播放4. Android Studio开发环境配置:安装Android Studio、配置模拟器及真机调试。
- 教材章节:第四章 Android开发工具与环境5. MP3播放器界面设计:UI布局、控件使用、自定义控件。
- 教材章节:第五章 Android界面设计6. 编写MP3播放器代码:初始化MediaPlayer、播放/暂停/停止功能、进度条更新、列表播放等。
成绩评定表课程设计任务书目录1目的及基本要求 02 MP3播放器设计原理 02.1 MP3播放器原理 02.2 流程图 02.3 设计步骤 03 MP3播放器设计和仿真 (1)3.1 总体程序设计 (1)3.2 各功能模块详细设计 (3)4 结果及性能分析 (4)4.1 运行结果 (4)4.2 性能分析 (5)参考文献 (6)1 目的及基本要求熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器原理、设计方法和实现技巧,运用专业课程中的基本理论和实践知识,采用LabVIEW开发工具,实现MP3播放器的设计和仿真。
基本要求:基于LabVIEW的MP3播放器设计,主要利用labview的Activex, 属性节点,调用节点,Event structure等控制实现的, MP3音乐播放器界面包括播放歌曲名字,播放路径以及停止按钮。
能熟练运用LabVIEW开发环境完成其他一些项目程序。
2 MP3播放器的设计原理MP3播放器,主要用于播放已存储计算机磁盘中的音乐文件。
它是将播放器的系统装入计算机,以通用的计算机硬件及操作系统为依托,实现音乐功能的。
VI程序设计里,默认容易识别的格式为WAV格式,所以在设计MP3时采取调用的方法,本系统主要利用labview的Activex, 属性节点,调用节点,Event structure 等控制实现的。
2.1 MP3播放器工作原理MP3的工作原理:从存中取出并读取存储器上的信号→到解码芯片对信号进行解码→通过数模转换器将解出来的数字信号转换成模拟信号→再把转换后的模拟音频放大→低通滤波后到耳机输出口,输出后就是我们所听到的音乐了。
2.2 流程设计程序流程设计:设定路径,判定路径是否有效→无效报错;有效,执行下一阶段程序→调用媒体播放器,编写歌名显示和文件路径显示,设置停止功能按钮→程序结束。
本程序主要涉及到一下控件或结构的使用:(1)事件结构:包括一个或多个子程序框图或事件分支,结构执行时,仅有一个子程序框图或分支在执行。
电子综合课程设计报告基于ARM+linux的MP3播放器一、主要指标和要求:1、能够正常的播放音乐2、能够播放自己随意指定的音乐3、播放的是MP3格式的音乐4、能够实现五秒快进和五秒快退5、能够实现正常退出二、方案选择及工作原理:1、MP3解码原理:MP3文件解码流程对于一个MP3文件的解码,本质上就是循环地对每一个Frame进行解码,直到完成所有Frame的解码,或者中途出现错误而中止。
MP3文件的解码流程如图l所示bj。
而对于每一帧的解码,首先是要获取每一帧的同步字符和帧头信息,从而获得相应的参数,并根据对帧头信息的分析进而得到实际一帧的音频数据;然后读取主要数据并获得缩放因子数据和霍夫曼码字,接着进行霍夫曼解码;其次进行反量化,并根据帧头的立体声信息对反量化结果进行立体声处理;最后通过混迭处理、IMDCT和合成滤波器重建数字音频信号的解码,生成PCM数据。
然后将PCM数据写入声卡设备,即可实现音频文件的播放。
2 、MP3播放原理:在linux内核中有已经做好了的声卡驱动程序,所以当我们加载声卡驱动后我们就会在文件系统的/dev/下看到/dev/dsp 这个声卡文件,根据文件的特性我们只要把我们的解码后的音乐文件不断地读出并写入声卡文件即可实现正常的声音播放,其中我们读文件用read()这个系统调用函数写文件用write()这系统调用,用ioctl()控制声卡文件的某些参数。
3、实现快进、快退的方案:a:循环读写文件之前创建一个子进程,这个子进程专门负责循环检测getchar()中输入的字符,根据不同的字符做出不同的反应,比如快进、快退、正常退出等,这个方案优点是思路明了,便于接受,但其缺点是进程是属于强占式的不利于进程的执行。
b:在循环读写文件之前,编写一个函数mode(),用来把程序由阻塞同步变为异步模式,这样只要在循环读写中加入getchar()就不会阻塞进程了,该方法实现简单,使程序执行也更合理。
课程设计报告课程设计题目:java音乐播放器学生姓名:专业:XXXXXXXXXXXXX班级:指导教师:20XX年X月X日一、课程设计目的1、编程设计音乐播放软件,使之实现音乐播放的功能。
2、培养学生用程序解决实际问题的能力和兴趣。
3、加深java中对多媒体编程的应用。
二、课程设计的要求利用学到的编程知识和编程技巧,要求学生:1、系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能。
2、编程简练,可用,尽可能的使系统的功能更加完善和全面3、说明书、流程图要清楚。
三、课程设计内容1、课程设计的题目及简介音乐播放软件要求:有图形界面,能播放MP3歌曲,有播放列表,前一首、后一首等常用播放软件功能。
2、设计说明主要运用多媒体编程、图形界面、数组及循环进行设计,从而实现简单的音乐播放。
public MyMusicPlayer():实现窗口的成员方法publi c void run():实现改变歌曲的播放状态的成员方法public AudioClip loadSound(String filename):实现对声音的加载public void mouseClicked(MouseEvent e):实现对按钮的监听public void itemStateChanged(ItemEvent arg0):返回一个AudioClip对象3、程序流程图4、程序清单import java.awt.*;import javax.swing.*;import java.applet.*;import java.awt.event.*;import .*;public class MyMusicPlayer extends Thread implements MouseListener,ItemListener{JFrame MainFrame=new JFrame("MyMusicPlayer"); //定义主窗体JLabel songname=new JLabel(); //用标签显示状态JButton last=new JButton();JButton play=new JButton();JButton next=new JButton();JButton loop=new JButton(); //定义上一曲,播放,下一曲,循环四个按钮JLabel list=new JLabel("播放列表");List songlist=new List(); //显示歌曲列表AudioClip[] song=new AudioClip[10]; //将音频文件放在数组中AudioClip playsong; //当前选定播放的音频文件String[] name={"黄小琥 - 顺其自然.wav","陈奕迅-张氏情歌.wav","黄小琥 _没那么简单.wav","戚薇-如果爱忘了.wav","郭采洁 - 狠狠哭.wav","test.wav"};//将所有文件名存放在字符串数组name中String playname; //当前选定播放的音频名int j=0; //记录当前选定播放的是哪首歌曲,默认为第一首boolean playbutton=true; //记录播放状态,默认为暂停播放boolean loopbutton=false; //记录循环状态,默认为没有循环Thread thread=new Thread("pl");static MyMusicPlayer Yu;public MyMusicPlayer(){MainFrame.setLayout(null);MainFrame.setBounds(300,50,310,500);MainFrame.setVisible(true);MainFrame.setDefaultCloseOperation(3);MainFrame.add(songname);Font sname=new Font("斜体",Font.ITALIC,18);songname.setFont(sname); //设置显示状态的字体为斜体songname.setText("我的音乐播放器");songname.setBounds(10,10,300,40);last.setBounds(10,70,50,40);play.setBounds(70,70,50,40); //设置四个功能键位置和大小next.setBounds(130,70,50,40);loop.setBounds(190,70,50,40);last.setIcon(new ImageIcon("1.png"));play.setIcon(new ImageIcon("2.png"));next.setIcon(new ImageIcon("3.png"));loop.setIcon(new ImageIcon("4.png")); //设置四个功能键的图片last.addMouseListener(this);play.addMouseListener(this);next.addMouseListener(this);loop.addMouseListener(this); //添加按键鼠标监听器MainFrame.add(last);MainFrame.add(play);MainFrame.add(next);MainFrame.add(loop);list.setBounds(10,120,100,30);Font lis=new Font("宋",Font.BOLD,15);list.setFont(lis); //显示“播放列表”MainFrame.add(list);songlist.setBounds(10,150,250,300);songlist.setBackground(Color.GREEN); //设置播放列表的背景色为绿色songlist.setVisible(true);songlist.addItemListener((ItemListener) this); //添加列表监听器MainFrame.add(songlist);for(int i=0;i<name.length;i++){song[i]=loadSound(name[i]); //逐个获取音频文件songlist.add(name[i]); //将歌曲名添加到播放列表}playsong=song[0];}public static void main(String[] args){Yu=new MyMusicPlayer();Yu.start();}public void mouseClicked(MouseEvent e) {JButton btn=(JButton)e.getSource();playsong.stop();if(btn==play){ if(playbutton==false)playbutton=true;elseplaybutton=false; //当按下play后改变播放状态}elseif(btn==last){ j-=1; //当按下last后将上一曲选定if(j<0)j=name.length-1; //若之前选定为第一首,则跳到最后一首playbutton=true;loopbutton=false;}elseif(btn==next){ j+=1; //当按下next后将下一曲选定if(j>=name.length)j=0; //若之前选定为最后一首,则跳到第一首playbutton=true;loopbutton=false;}elseif(btn==loop){ if(loopbutton==false){loopbutton=true;playbutton=true;}else{ //按下loop后,改变循环状态和播放状态loopbutton=false;playbutton=false;}}if(playbutton==true)Yu.run();else{songname.setText("暂停播放:"+playname); //暂停播放歌曲play.setIcon(new ImageIcon("2.png"));}}public void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stub}public void mousePressed(MouseEvent arg0) {// TODO Auto-generated method stub}public void mouseReleased(MouseEvent arg0) {// TODO Auto-generated method stub}public void itemStateChanged(ItemEvent arg0) {String str=songlist.getSelectedItem();playsong.stop();for(int i=0;i<name.length;i++)if(str==name[i]){j=i;break;}Yu.run();}public void run(){playsong=song[j]; //播放状态为播放时playsong.play(); //播放选定歌曲playname=name[j];if(loopbutton==true){playsong.loop(); //循环播放选定歌曲songname.setText("循环播放:"+playname);}elsesongname.setText("正在播放:"+playname);songlist.select(j); //播放列表中选定播放歌曲项目play.setIcon(new ImageIcon("5.png"));}public AudioClip loadSound(String filename){ //返回一个AudioClip对象URL url=null;try{url=new URL("file:"+filename);}catch(MalformedURLException e){ }return Applet.newAudioClip(url);}}5、程序运行结果四、课程设计总结经过这几天的Java课程设计,让我知道了做课程设计的一般方法,通过各种努力终于完成了设计要求.这次课程设计基本上含盖了大学一年学习到的Java 语言知识点,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。
中北大学课程设计说明书学生姓名:李衍朋学号:37学院:信息与通讯工程学院专业:信息工程题目:mp3 播放器指导教师:陈平职称:副教授年月日下达任务书日期:2016年5月27日课程设计任务书1.设计目的:经过设计,明确音频机的设计思想和设计过程,扎实掌握VC、C++或 C 语言编程的整体框架和步骤,使学生拥有必定综合剖析问题和解决问题的能力。
2.设计内容和要求(包含原始数据、技术参数、条件、设计要求等):功能说明:拥有播放 MP3音乐的功能。
设计要求:课程设计的目的在于培育学生的综合素质,要修业生做到:(1)依据题目要求查阅有关资料,确立方案,写出设计方案;(2)依据对选题的理解,消化查阅资料,给出有关设计的流程图;(3)在 C语言、 C++或 VC环境下,实现各项功能;(4)对结果进行剖析总结。
3.设计工作任务及工作量的要求〔包含课程设计计算说明书(论文 )、图纸、实物样品等〕:设计工作任务:(1)认识课题背景,掌握基本技术,拟订程序设计框架。
(2)达成设计内容:包含程序流程图和达成实现功能的程序代码,写出设计说明书。
(3)设计辩论。
工作量的要求:(1)经过查阅资料认识与音频播放程序设计有关的基本理论、原理以及背景知识,理解选题意义;(2)掌握与音频播放程序有关的设计思想、原理、设计框架和步骤;(3)达成音频播放程序的功能和程序代码的实现;(4)经过实验考证程序代码的可行性;(5)给出设计总结。
课程设计任务书4.主要参照文件:Visual C++ 课程设计事例精编(第二版)5.设计成就形式及要求:程序运转结果;课程设计说明书。
6.工作计划及进度:2016年 5月 30日 ~ 2016年 6月 1日:查资料2016年 6月 2日 ~2016年 6月 7日:在指导教师指导下设计方案及程序2016年 6月 8日 ~ 2016年6月15日:学生上机调试程序,指导教师指导2016年 6月 16日~2016年 6月 18 日:达成课程设计说明书2016 年 6 月 19 日:辩论系主任审察建议:署名:年月日目录1. 纲要 ---------------------------------------------------11.1 )设计内容 --------------------------------------------11.2 )MCI 简介 --------------------------------------------11.2- ①任务 -----------------------------------------------21.2- ②各模块功能设计 -------------------------------------31.2- ③操作步骤 ------------------------------------------41.2- ④函数代码 ------------------------------------------52. 课程设计剖析与结果 ------------------------------------133. 总结 --------------------------------------------------14参照文件 ------------------------------------------------141.纲要利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。
基于FPGA的MP3音乐播放器设计——预置乐曲播放器设计摘要:本次课程设计的主题是‘基于FPGA的MP3播放器’,这是一个发展空间很大的课题,研究者可以根据自己的能力水平和兴趣爱好自由发展。
我们组实现的功能是‘预置乐曲的播放’。
本次设计是在BASYS2实验开发板上实现,使用xinlinx13.1软件,利用VHDL硬件描述言语设计数控分频器电路,利用数控分频原理设计音乐硬件播放数字电路,将音乐数据存放在程序中,利用时钟驱动音符输出,通过集成运放调节音量,达到了乐曲播放的效果。
程序中存放的音符数据易修改,只要修改程序中所放的的音符数据,将其转换为其他乐曲的音符数据,就可以实现不同乐曲的播放。
关键字:FPGA;xilinx;VHDL;预置音符;音乐播放目录摘要............................................................................................................................- 0 -一、绪论....................................................................................................................- 2 -1.1研究背景......................................................................................................- 2 -1.2基本技术简介..............................................................................................- 2 -1.2.1可编程逻辑器件FPGA .....................................................................- 2 -1.2.2硬件描述语言VHDL.........................................................................- 3 -1.2.3开发软件xilinx .................................................................................- 3 -二、需求分析和研究思路........................................................................................- 4 -2.1需求分析......................................................................................................- 4 -2.2研究思路......................................................................................................- 4 -三、系统设计............................................................................................................- 4 -3.1系统原理......................................................................................................- 4 -3.1.1音调控制...........................................................................................- 5 -3.1.2音长控制...........................................................................................- 6 -3.1.3乐谱发生器.....................................................................................- 6 -3.1.4音量控制...........................................................................................- 6 -3.2系统结构......................................................................................................- 7 -3.2.1各功能模块概述...............................................................................- 7 -3.2.2系统整体原理框图...........................................................................- 8 -四、详细的程序实现和仿真分析............................................................................- 8 -4.1时钟分频模块..............................................................................................- 8 -4.2乐谱码发生模块..........................................................................................- 9 -4.3乐谱码查表模块........................................................................................- 10 -4.4数控分频模块............................................................................................- 10 -4.5音量放大模块............................................................................................- 11 -4.6顶层模块....................................................................................................- 11 -五、结论..................................................................................................................- 11 -六、个人感想..........................................................................................................- 12 -一、绪论1.1研究背景在电子技术的飞速发展的今天,电子产品的种类越来越多,功能越来越强大,体积越来越小,功耗越来越低。
目录一、设计要求 (1)二、设计目的 (1)三、设计的具体实现 (1)3.1 系统概述 (1)3.2单元电路设计 (1)3.2.1 8086中央处理器 (1)3.2.2 74LS373地址锁存电路 (5)3.2.3 74LS138 译码电路 (6)3.2.4 定时/计数器8253A (7)3.3 软件程序设计和调试 (13)四、结论与展望 (17)五、心得体会及建议 (17)六、附录 (18)七、参考文献 (19)电子音乐播放器设计报告一、设计要求利用8253作为音频频率发生器,应先对一段音乐进行编码后存入音符表,并建立好音阶表(只建立一个8度即可,音阶表见附录),音符长度不能少于60个,连续播放3遍后停止。
具体要求如下:1、系统硬件电路设计:根据所选题目和所用的接口电路芯片设计出完整的系统硬件电路,并进行电路连接和调试。
2、程序设计:要求画出程序框图,设计出全部程序并给出程序设计说明和程序注释。
二、设计目的本课程设计培养学生运用该课程的理论知识和技术知识解决工程实际问题的能力,学习微机系统设计的方法;学生通过对实验室系统的实际调试,进一步培养并提高了科学实验的能力。
因此,本课程设计为学生提供一个良好的理论联系实际的机会和场所,有利于为学生树立微机整体的概念,同时加强了学生编制和调试程序的能力,进一步培养学生的独立工作能力。
因此,课程设计是教学计划中必不可少的重要一环。
三、设计的具体实现1.系统概述该音乐播放器通过用8086中央处理器、74LS373地址锁存电路、74LS138译码电路、定时/计数器8253A来实现功能。
8086中央处理器输出地址码A16-A19和数据AD0-AD15,将AD0-AD7输入地址锁存器输出A0-A7,再将A0-A7通过译码器进行译码输出作为8253的片选信号,8253产生不同频率的脉冲来模拟音符,通过时间的长短来模拟音长,从而设计出一个功能完整的音乐播放器。
2.单元电路设计2.1 8086中央处理器8086中央处理器是Intel系列的16位微处理器,有16根数据线和20跟地址线。
c 课程设计音乐播放器一、教学目标本课程的目标是让学生掌握音乐播放器的制作原理和技巧,学会使用C语言进行程序设计,培养学生的编程能力和逻辑思维能力。
具体的学习目标包括:1.知识目标:学生需要了解音乐播放器的基本原理,掌握C语言的基本语法和数据结构,熟悉音乐文件的处理方法和音效控制技术。
2.技能目标:学生能够运用C语言编写音乐播放器程序,进行音频文件的播放、暂停、停止、跳转等操作,调整音量大小和音效效果,实现歌词同步和专辑封面显示等功能。
3.情感态度价值观目标:学生通过制作音乐播放器,培养对编程和音乐的兴趣,提高创新意识和团队合作能力,增强自信心和自我成就感。
二、教学内容根据课程目标,教学内容主要包括以下几个部分:1.音乐播放器的基本原理:介绍音乐播放器的工作原理,包括音频解码、音量控制、音效处理等模块。
2.C语言基础知识:讲解C语言的基本语法、数据类型、运算符、控制结构等,为学生编写音乐播放器程序打下基础。
3.音乐文件处理:介绍音乐文件的常见格式和结构,讲解如何读取、解析和播放音乐文件。
4.音效控制技术:讲解如何在音乐播放器中实现音量调整、音效效果等功能。
5.歌词同步和专辑封面显示:介绍如何实现歌词同步播放和专辑封面显示功能,提高音乐播放器的用户体验。
6.音乐播放器程序设计:引导学生运用所学知识,分组设计和实现一个简单音乐播放器程序。
三、教学方法为了激发学生的学习兴趣和主动性,本课程采用以下教学方法:1.讲授法:讲解音乐播放器的基本原理、C语言基础知识、音乐文件处理方法等,为学生提供理论支持。
2.案例分析法:分析实际的音乐播放器案例,引导学生学会分析问题、解决问题,提高编程能力。
3.实验法:分组进行音乐播放器程序设计,让学生动手实践,培养学生的实际操作能力。
4.讨论法:学生进行小组讨论,分享编程心得和解决问题的方法,促进团队合作和交流。
四、教学资源为了支持教学内容和教学方法的实施,本课程准备以下教学资源:1.教材:选用权威、实用的C语言编程教材,为学生提供系统的学习资料。
目录1程序设计背景 (2)2程序设计思路 (2)2.1程序整体设计思路 (2)2.2程序流程设计 (3)3程序介绍 (3)3.1程序各部分模块结构 (3)3.1.1文件路径判断 (3)3.1.2媒体播放器调用的实现 (4)3.1.3当前播放曲目显示的实现 (5)3.1.4事件结构的设置 (5)3.1.5路径及其转化实现 (6)3.2程序整体结构 (6)4程序改进 (7)5存在的一些问题 (8)6结论 (8)基于LabVIEW的MP3程序设计1程序设计背景MP3是利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率,对高频加大压缩比(甚至忽略信号)对低频信号使用小压缩比,保证信号不失真。
MP3的工作原理:从内存中取出并读取存储器上的信号→到解码芯片对信号进行解码→通过数模转换器将解出来的数字信号转换成模拟信号→再把转换后的模拟音频放大→低通滤波后到耳机输出口,输出后就是我们所听到的音乐了。
经过几年的发展MP3已经走进了千家万户,使用者也遍布各个年龄段和各个文化阶层。
从最初的简单MP3播放器,到现在的手机,平板等便携设备自带的MP3播放器,MP3播放器已经走向大众,并演化为人们生活不可缺少的一部分,车上会有车载MP3,电脑手机平板上的MP3也是必不可少,总之,已经人们时时刻刻都已经在享受着MP3带来的快乐。
2程序设计思路2.1程序整体设计思路该虚拟仪器—MP3播放器,主要用于播放已存储计算机磁盘中的音乐文件。
它是将播放器的系统装入计算机,以通用的计算机硬件及操作系统为依托,实现音乐功能的。
VI程序设计里,默认容易识别的格式为WA V格式,所以在设计MP3时采取调用的方法,本系统主要利用labview的Activex, 属性节点,调用节点,Event structure等控制实现的。
MP3音乐播放器界面包括播放歌曲名字,播放路径以及停止按钮。
西安科技大学《VC++程序设计》课程设计报告题目 MP3播放器院、系(部)计算机学院软件工程系专业及班级软件工程0902 姓名王浩日期09080102241 题目要求要求用所学知识编写mp3播放器来实现mp3播放基本功能2 功能需求Mp3播放器基本的添加歌曲,播放,暂停,暂停恢复,停止,下一首,前一首,播放列表,最小化到托盘等3 总体设计3.1 系统模块3.2 系统业务处理流程4 详细设计1.新建对话框MFC应用程序2.添加基类class MCIMP3在头文件中添加#include<mmsystem.h>#pragma comment(lib,"winmm.lib")类成员public:MCIMP3();virtual ~MCIMP3();DWORD MCIOpen(const CString &strPath);DWORD MCIClose();DWORD MCIPlay();DWORD MCIPause();DWORD MCIResume();DWORD MCIStop();DWORD MCISetMute(BOOL bMute);DWORD MCIGetLength(DWORD *dwReturn);DWORD MCIGetPos(DWORD *dwPos);DWORD MCISeekTo(DWORD dwTo);DWORD MCISeekToStart();DWORD MCISeekToEnd();BOOL MCIIsPlaying();BOOL MCIIsOpened();DWORD m_dwLength;protected:MCIDEVICEID m_wID;在类实现文件MCIMP3.cpp中添加如下代码//构造函数MCIMP3::MCIMP3(){m_wID=NULL;m_dwLength=0;}//析构函数MCIMP3::~MCIMP3(){MCIClose();}//打开MCI设备参数为文件地址DWORD MCIMP3::MCIOpen(const CString &strPath) {MCI_OPEN_PARMS mciOP;DWORD dwReturn;ASSERT(m_wID==NULL);mciOP.lpstrDeviceType=NULL;mciOP.lpstrElementName=strPath;dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT|MCI_O PEN_SHAREABLE,(DWORD)(LPVOID)&mciOP);if (dwReturn==0){m_wID=mciOP.wDeviceID;if(this->MCIGetLength(&m_dwLength)!=0)m_dwLength=0;}elsem_wID=NULL;return dwReturn;}//关闭MCI设备DWORD MCIMP3::MCIClose(){MCI_GENERIC_PARMS mciGP;DWORD dwReturn;dwReturn=mciSendCommand(m_wID,MCI_CLOSE,MCI_NOTIFY|MCI_WAIT, (DWORD)(LPVOID)&mciGP);m_wID=NULL;return dwReturn;}//播放DWORD MCIMP3::MCIPlay(){MCI_PLAY_PARMS mciPP;return mciSendCommand(m_wID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciPP);}//暂停DWORD MCIMP3::MCIPause(){MCI_GENERIC_PARMS mciGP;return mciSendCommand(m_wID,MCI_PAUSE,MCI_NOTIFY|MCI_WAIT, (DWORD)(LPVOID)&mciGP);}//继续(从暂停恢复)DWORD MCIMP3::MCIResume()MCI_GENERIC_PARMS mciGP;return mciSendCommand(m_wID,MCI_RESUME,MCI_NOTIFY|MCI_WAIT, (DWORD)(LPVOID)&mciGP);}//停止播放DWORD MCIMP3::MCIStop(){MCI_GENERIC_PARMS mciGP;return mciSendCommand(m_wID,MCI_STOP,MCI_NOTIFY|MCI_WAIT, (DWORD)(LPVOID)&mciGP);}//到dwTo处DWORD MCIMP3::MCISeekTo(DWORD dwTo){DWORD dwreturn;if (dwTo>0&& dwTo<m_dwLength){MCI_SEEK_PARMS mciSP;mciSP.dwTo=dwTo*1000;dwreturn=mciSendCommand(m_wID,MCI_SEEK,MCI_WAIT|MCI_NOTIFY|MCI_TO, (DWORD)(LPVOID)&mciSP);}else if (dwTo>=m_dwLength)dwreturn=MCISeekToEnd();elsedwreturn=MCISeekToStart();return dwreturn;}//到开始处DWORD MCIMP3::MCISeekToStart(){MCI_SEEK_PARMS mciSP;return mciSendCommand(m_wID,MCI_SEEK,MCI_WAIT|MCI_NOTIFY|MCI_SEEK_TO_START,(DWORD)(LPVOID)&mciSP); }//到结束处DWORD MCIMP3::MCISeekToEnd(){MCI_SEEK_PARMS mciSP;returnmciSendCommand(m_wID,MCI_SEEK,MCI_WAIT|MCI_NOTIFY|MCI_SEEK_TO_END, (DWORD)(LPVOID)&mciSP);}//得到播放文件长度DWORD MCIMP3::MCIGetLength(DWORD *dwLength){MCI_STATUS_PARMS mciSP;mciSP.dwItem=MCI_STATUS_LENGTH;DWORD dwReturn=mciSendCommand(m_wID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciSP);if(dwReturn==0)*dwLength=mciSP.dwReturn/1000;return dwReturn;}//得到当前播放文件播放到的地方DWORD MCIMP3::MCIGetPos(DWORD *dwPos){MCI_STATUS_PARMS mciSP;mciSP.dwItem=MCI_STATUS_POSITION;DWORD dwReturn=mciSendCommand(m_wID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciSP);if(dwReturn==0)*dwPos=mciSP.dwReturn/1000;return dwReturn;}//静音DWORD MCIMP3::MCISetMute(BOOL bMute){MCI_SET_PARMS mciSP;mciSP.dwAudio=MCI_SET_AUDIO_ALL;DWORD dwFlags;if(bMute)dwFlags=MCI_WAIT|MCI_SET_AUDIO|MCI_SET_OFF;elsedwFlags=MCI_WAIT|MCI_SET_AUDIO|MCI_SET_ON;return mciSendCommand(m_wID,MCI_SET,dwFlags,(DWORD)(LPVOID)&mciSP);}//判断是否播放BOOL MCIMP3::MCIIsPlaying(){MCI_STATUS_PARMS mciSP;mciSP.dwItem=MCI_STATUS_MODE;DWORD dwReturn=mciSendCommand(m_wID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciSP);if(dwReturn==0){if(mciSP.dwReturn==MCI_MODE_PLAY)return true;}return false;}//判断是否打开BOOL MCIMP3::MCIIsOpened(){MCI_STATUS_PARMS mciSP;mciSP.dwItem=MCI_STATUS_MODE;DWORD dwReturn=mciSendCommand(m_wID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciSP);if(dwReturn==0){if(mciSP.dwReturn==MCI_MODE_OPEN||mciSP.dwReturn==MCI_MODE_PLAY||mciSP.dwReturn==MCI_MODE_PAUSE||mciSP.dwReturn==MCI_MODE_STOP||mciSP.dwReturn==MCI_MODE_SEEK)return true;}return false;}3.按如图方式添加控件对话框属性改为无边框,列表框属性也为无边框编辑框改为只读无边框控件名控件类型ID 变量类型变量关联正在播放静态文本示例编辑框编辑框ID_NAME CString path示例编辑框编辑框ID_TIME CString m_time列表框IDC_LIST CListBox m_list滑块IDC_SLIDER1 CSliderCrtl m_ctrlSlider4.int flag;int j;int pause;void view();CString str1;CString str;int file1;int play;int time;int nPos;int temp;int i;CString m_Path;MCIMP3 m_mp3player;5.引入背景位图并改ID为IDB_BEIJING和IDB_BEIJINGM在OnPaint函数中else后屏蔽CDialog::OnPaint();在后面添加如下代码if(flag==1){CPaintDC dc(this);CDC memdc;memdc.CreateCompatibleDC(&dc);CBitmap bkg;bkg.LoadBitmap(IDB_BEIJING);BITMAP bkginfo;bkg.GetBitmap(&bkginfo);memdc.SelectObject(&bkg);RECT rect;GetWindowRect(&rect);dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bk ginfo.bmHeight,SRCCOPY);}if(flag==0){CPaintDC dc(this);CDC memdc;memdc.CreateCompatibleDC(&dc) ;CBitmap bkg;bkg.LoadBitmap(IDB_BEIJINGM);BITMAP bkginfo;bkg.GetBitmap(&bkginfo);memdc.SelectObject(&bkg);RECT rect;GetWindowRect(&rect);dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bk ginfo.bmHeight,SRCCOPY);}6.系统托盘实现在CPlayerDlg类中添加函数toTray(bool show)void CPlayerDlg::toTray(bool show){// TODO: Add your control notification handler code hereNOTIFYICONDATA pnid;pnid.cbSize=(DWORD)sizeof(NOT IFYICONDATA);pnid.hIcon=AfxGetApp()->LoadI con(IDR_MAINFRAME);strcpy(pnid.szTip,"MP3播放");pnid.hWnd=m_hWnd;pnid.uCallbackMessage=UM_SHOW WINDOW;pnid.uFlags=NIF_ICON|NIF_MESS AGE|NIF_TIP;pnid.uID=ID_TASKBARICON;pnid.uID=(UINT)m_hIcon;if(show){Shell_NotifyIcon(NIM_ADD,&pni d);ShowWindow(SW_HIDE);}else{Shell_NotifyIcon(NIM_DELETE,& pnid);ShowWindow(SW_SHOW);}}在构造函数中添加ON_MESSAGE(UM_SHOWWINDOW,OnNotif yIcon)到BEGIN_MESSAGE_MAP(CPlayerDlg, CDialog)和END_MESSAGE_MAP()之间添加函数voidCPlayerDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam){switch(lParam){case WM_LBUTTONDBLCLK:toTray(false);break;}}最后对按钮- 添加消息响应函数void CPlayerDlg::OnMin(){// TODO: Add your control notification handler code here toTray(true);}7.实现点击对话框拖动打开classwizard添加WM_LBUTTONDOWNvoidCPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your messagehandler code here and/or calldefaultPostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));CDialog::OnLButtonDown(nFlags, point);}8.初始化变量在构造函数中添加m_time = _T("");path = _T("");i=0;temp=0;nPos=0;play=0;file1=0;pause=0;j=0;flag=0;9.对?按钮添加消息响应函数void CPlayerDlg::OnAbout(){CAboutDlg dlg;dlg.DoModal();}10.对退出按钮添加消息响应函数void CPlayerDlg::OnExit(){exit(0);}11.对添加按钮添加消息响应函数void CPlayerDlg::OnOpen() {CFileDialogfile(TRUE,NULL,NULL,OFN_HIDEREAD ONLY,"MP3 Files (*.mp3)|*.mp3|AVI Files(*.avi)|*.avi|WAVFiles(*.wav)|*.wav|WMAFiles(*.wma)|*.wma");file.DoModal();m_Path=file.GetPathName();intnIndex=m_list.InsertString(-1,m_ Path);m_list.SetCurSel(j);j++;file1=1;}12.对播放按钮添加消息响应函数void CPlayerDlg::OnPlay(){if(play==0&&file1==1){m_ctrlSlider.SetRange(0,100);SetTimer(1,1000,NULL);m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();play=1;path=m_Path;UpdateData(FALSE);}}13.对暂停按钮添加消息响应函数void CPlayerDlg::OnPause(){if(play==1){KillTimer(1);m_mp3player.MCIPause();pause=1;}}14.对继续按钮添加消息响应函数void CPlayerDlg::OnResume() {if(play==1&&pause==1){SetTimer(1,1000,NULL);m_mp3player.MCIResume();}}15.对停止按钮添加消息响应函数void CPlayerDlg::OnStop(){if(play==1){m_mp3player.MCIStop();KillTimer(1);m_ctrlSlider.SetPos(0);// m_mp3player.MCISeekTo(0);m_mp3player.MCIClose();play=0;file1=0;i=0;view();UpdateData(FALSE);}}16.对上一首按钮添加消息响应函数void CPlayerDlg::OnPre(){int n=m_list.GetCurSel();if( play==1 && file1==1 && n-1>=0){CString p;KillTimer(1);m_list.GetText(n-1,p);m_Path=p;i=0;m_list.SetCurSel(n-1);OnStop();file1 = 1;play = 1;m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();path=m_Path;SetTimer(1,1000,NULL);}if(play==1 && file1==1 &&n-1<0){KillTimer(1);m_list.SetCurSel(j-1);CString p;m_list.GetText(j-1,p);m_Path=p;i=0;OnStop();file1 = 1;play = 1;m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();path=m_Path;SetTimer(1,1000,NULL);}}16.对下一首添加消息响应函数void CPlayerDlg::OnNext(){int n=m_list.GetCurSel();if( play==1 && file1==1 && n+1<j){CString p;KillTimer(1);m_list.GetText(n+1,p);m_Path=p;i=0;m_list.SetCurSel(n+1);OnStop();file1 = 1;play = 1;m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();path=m_Path;SetTimer(1,1000,NULL);}if(play==1 && file1==1 && n+1>=j) {n=0;KillTimer(1);m_list.SetCurSel(n);CString p;m_list.GetText(n,p);m_Path=p;i=0;OnStop();file1 = 1;play = 1;m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();path=m_Path;SetTimer(1,1000,NULL);}}17.添加定时器响应滑块的移动在classwizard中添加WM_TIMER消息编辑函数void CPlayerDlg::OnTimer(UINT nIDEvent){if(i<m_mp3player.m_dwLength){i++;temp=i*100/m_mp3player.m_dwLengt h;m_ctrlSlider.SetPos(temp);view();Invalidate(FALSE);}CDialog::OnTimer(nIDEvent);}其中view函数需另行添加在类CPlayerDlg中添加view函数void CPlayerDlg::view(){str.Format("%d",i);zhuanhuan(str);str1.Format("%ld",m_mp3player .m_dwLength);zhuanhuan(str1);m_time=str+'/'+str1;UpdateData(FALSE);}18.给DEL按钮添加消息响应函数void CPlayerDlg::OnDellist() {intnIndex=m_list.GetCurSel();if(nIndex!=LB_ERR){delete(CString*)m_list.GetItemDataPtr (nIndex);m_list.DeleteString(nIndex);UpdateData(FALSE);}}19用classwizard添加WM_HSCROLL水平滚动消息的处理函数void CPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){if(pScrollBar->GetDlgCtrlID() ==IDC_SLIDER1&&play==1){KillTimer(1);nPos=m_ctrlSlider.GetPos();time=nPos*m_mp3player.m_dwLength /100;i=nPos*m_mp3player.m_dwLength/10 0;m_mp3player.MCISeekTo(time);m_mp3player.MCIPlay();SetTimer(1,1000,NULL);}}19.对话框资源选中列表框打开classwizard添加LBN_DBLCLK响应函数代码如下void CPlayerDlg::OnDblclkList() {intnIndex=m_list.GetCurSel();if(nIndex!=LB_ERR||play==1||f ile1==1){CString p;m_list.GetText(nIndex,p);m_Path=p;i=0;OnStop();m_mp3player.MCIOpen(m_Path);m_mp3player.MCIPlay();path=m_Path;SetTimer(1,1000,NULL);play=1;file1=1;}}20.在初始化时定义对话框的大小以及位置在OnInitDialog函数中添加MoveWindow(200,200,444,146);为List按钮添加消息响应函数void CPlayerDlg::OnListbutt() {if(flag==0){for(int i=146;i<=233;i++){Sleep(2);MoveWindow(200,200,444,i);Invalidate(FALSE);}flag=1;}else{for(int i=233;i>=146;i--){Sleep(2);MoveWindow(200,200,444,i);Invalidate(FALSE);}flag=0;}}5 测试与实现主界面打开列表添加列表添加列表项并播放上一首List最小化到托盘停止Del6 总结该程序基本完成了一个播放器需要的基本功能,能显示进度条能通过进度条的拖动到歌曲相应位置,但是不足之处也是很多,首先一些空间在刷过背景图后成了白色的块块影响美观,没有完成连续播放,随机播放,单曲循环等等,没有实现音量的变化,在时间的位置没有把秒转化为分钟:秒的样子,由于时间的原因从原先不会mci到现在懂得了点皮毛并作出了个播放器,我觉得我收获还是挺大的,通过这个程序以及这一周来的时间做的课程设计,我对对话框的编程又有了更深入的认识,明显比上次做计算器要来的熟练的多,希望以后通过程序的制作能提高我的编程能力。
中北大学课程设计说明书学生姓名:李衍朋学号:37 学院:信息与通信工程学院专业:信息工程题目:mp3播放器指导教师职称: 副教授年月日下达任务书日期: 2016 年5 月27 日课程设计任务书课程设计任务书目录1.摘要---------------------------------------------------1 1.1)设计内容--------------------------------------------1 1.2)MCI简介--------------------------------------------1 1.2-①任务-----------------------------------------------2 1.2-②各模块功能设计-------------------------------------3 1.2-③操作步骤------------------------------------------41.2-④函数代码------------------------------------------52.课程设计分析与结果------------------------------------133.总结--------------------------------------------------14 参考文献------------------------------------------------141.摘要利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。
要求能够播放常用Windows音频格式的文件;实现播放控制:播放、暂停、停止等;实现音量控制:静音、声音放大减小;实现播放列表管理:加入文件、加入目录、删除文件等功能关键词:MP3播放器的设计设计目的利用VC++开发一个支持wav、mp3、wma等不同音频格式的媒体播放器。
通过课程设计掌握多媒体编程的基本原理。
1)设计内容MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。
(MFC 简介) MFC是Visual C++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用2)MCI简介MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。
它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。
音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。
音频文件包括多种格式的文件,MP3就是其中的一种。
MP3的全称是Moving Picture Experts Group,Audio Layer Ⅲ,它所使用的技术是在VCD(MPEG-1)的音频压缩技术上发展出的第三代,而不是MPEG-3。
MP3是一种音频压缩的国际技术标准,它一般需要MP3播放器来读取①任务:1)编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息的查询与添加等;2)给出程序的总体设计和详细设计,要求程序总体架构3)图详细设计的流程图说明等表一②各模块功能设计2.1 处理“打开”按钮单击“打开”按钮后,在onfilechoice()函数中,首先对文件类型进行过滤,调用GetSystemMene()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过onfilechoice()函数获取文件名后,调用DisplayInfo()函数在Static Text控件上显示“你选择的歌曲是(文件名)”,然后利用pause()函数设置“暂停”按钮以及“停止”按钮不可用。
2.2 处理“播放”按钮单击“播放”按钮后,在onplay()函数中,通过调用CMP3Dlg类的GetPathName函数获取刚才选择的文件路径以及文件名,调用该类的void play()函数播放歌曲,此时调用GetDlgItemText(IDC_pause,strtemp)获取按钮状态,然后利用SetDlgItemText()函数设置“播放”按钮不可用。
2.3 处理“暂停”按钮单击“暂停”按钮后,在Onstop ()函数中,首先通过调用CMP3Dlg类的pause()函数暂停正在播放的歌曲,GetDlgItem(IDC_play)->EnableWindow(false),当暂停按钮按下时,通过GetDlgItemText(IDC_pause,strtemp)获取按钮状态,此时歌曲处于暂停的进度条上,利用GetDlgItem(IDC_stop)->EnableWindow(true)函数设置“播放”按钮可用。
2.4 处理“停止”按钮单击“停止”按钮后,首先通过调用CMP3Dlg类的stop()函数暂停正在播放的歌曲,GetDlgItem(IDC_play)->EnableWindow(false)当stop按钮按下时,播放和暂停应该均不可用,此时的歌曲处于暂停时的进度上,利用GetDlgItem(IDC_stop)->EnableWindow(true)函数设置“播放”按钮可用。
,10 将停止正在播放歌曲,利用GetDlgItem()函数设置“暂停”按钮和“停止”按钮不可用。
2.5 处理“音量”滑块拉动“音量”滑块后,在m_slider.SetRange(0,1000)中,设置滑块的移动范围为0~1000。
在启动程序时,通过m_slider.SetPos(500)函数设置滑块指针的初始位置设为500且代表初始音量为50 。
2.6 处理“退出”按钮单击“退出”按钮后,在Onexitbt()函数中,调用CDialog类的OnCancel()函数将退出对话框,结束程序的运行③操作步骤1)先在VS环境下建立好一个基于对话框的工程。
2)打开资源视图,在对话框内按照布局图布局,步好后根据表-1来设置属性。
添加相应的变量和函数。
3)进行程序初始化。
4)为各个按钮添加消息处理函数,并添加相应的代码。
5)全部完成后进行测试和调试。
④函数代码/////////////////////////////////////////////////////////////////////////////// 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()///////////////////////////////////////////////////////////////////////////// // CMP3Dlg dialogCMP3Dlg::CMP3Dlg(CWnd* pParent /*=NULL*/): CDialog(CMP3Dlg::IDD, pParent){//{{AFX_DATA_INIT(CMP3Dlg)m_int = 0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);}void CMP3Dlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMP3Dlg)DDX_Control(pDX, IDC_SLIDER, m_slider);DDX_Text(pDX, IDC_vol, m_int);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMP3Dlg, CDialog)//{{AFX_MSG_MAP(CMP3Dlg)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)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMP3Dlg message handlersBOOL CMP3Dlg::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代表初始音量为50 GetDlgItem(IDC_play)->EnableWindow(false);//文件没有读取时所有按钮应该是不可选的GetDlgItem(IDC_pause)->EnableWindow(false);GetDlgItem(IDC_stop)->EnableWindow(false);// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a controlvoid CMP3Dlg::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 bel ow// to draw the icon. For MFC applications using the documentiew model,// this is automatically done for you by the framework.void CMP3Dlg::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();}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CMP3Dlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMP3Dlg::Onabout(){// TODO: Add your control notification handler code hereCAboutDlg dlg;dlg.DoModal();}void CMP3Dlg::Onexitbt(){// TODO: Add your control notification handler code hereCDialog::OnCancel();}void CMP3Dlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereUpdateData(true);m_int=m_slider.GetPos()/10;setvolume(m_slider.GetPos());UpdateData(false);*pResult = 0;}void CMP3Dlg::Onfilechoice(){// TODO: Add your control notification handler code herechar 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);}}void CMP3Dlg::Onplay(){// TODO: Add your control notification handler code hereplay();SetDlgItemText(IDC_pause,"暂停");}void CMP3Dlg::Onpause(){// TODO: Add your control notification handler code hereCString strtemp;GetDlgItemText(IDC_pause,strtemp);//获取按钮状态if(pare("暂停")==0){pause();SetDlgItemText(IDC_pause,"恢复");}if(pare("恢复")==0){resume();SetDlgItemText(IDC_pause,"暂停");}}void CMP3Dlg::Onstop(){// TODO: Add your control notification handler code herestop();SetDlgItemText(IDC_pause,"暂停");GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用GetDlgItem(IDC_pause)->EnableWindow(false);}/ MP3音乐播放器.cpp : Defines the class behaviors for the application. //#include "stdafx.h"#include "MP3音乐播放器.h"#include "MP3音乐播放器Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMP3AppBEGIN_MESSAGE_MAP(CMP3App, CWinApp)//{{AFX_MSG_MAP(CMP3App)// NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMP3App constructionCMP3App::CMP3App(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CMP3App objectCMP3App theApp;/////////////////////////////////////////////////////////////////////////////// CMP3App initializationBOOL CMP3App::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically #endifCMP3Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is// dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is// dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the// application, rather than start the application's message pump.return FALSE;}2. 课程设计分析与结果按照课程设计的要求,我们用C/C++来实现功能,但由于我们在学过面向对象后,我们常用的是Visual Studio 2010版本的VS编辑器。