MP3音乐播放器软件课程设计报告(MFC)
mfc编程mp3

Init();
m_Pause.SetWindowText("暂停");
//
CString filter = "媒体文件(所有类型)|*.cda;*.mid;*.rmi;*.midi;*.asf;*.wm;*.wma; *.asx;*.wax;*.m3u;*.wvx;*.mpeg;*.mpg;*.m1v;*.mp3; *.avi;*.wmv;*.wav;*.snd;*.au;*.aif;*.aifc|";
MCIWndSeek(m_hWnd,pos); // 定位文件到pos 处
MCIWndPlay(m_hWnd); // 播放文件
MCIWndPause(m_hWnd); // 暂停
MCIWndResume(m_hWnd); // 从暂停的地方重新启动
MCIWndStop(m_hWnd); // 停止
mciSendCommand (m_wDeviceID, MCI_PLAY,
MCI_FROM, (DWORD)(LPVOID)
&PlayParms));
---- 4. 暂停
MCI_PLAY_PARMS PlayParms;
mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,
{
m_Music.Close();
m_MusicList.SetCurSel(index);
CString sPath = m_MusicAry.GetAt(index);
m_Music.Open(sPath);
m_Status.SetWindowText(sPath + _T(" 正在播放..."));//在状态条中显示提示信息
安卓音乐播放器实验报告

竭诚为您提供优质文档/双击可除安卓音乐播放器实验报告篇一:音乐播放器实验报告面向对象程序设计课程设计设计说明书音乐播放器(mp3player)起止日期:20XX年5月27日至20XX年6月2日学班学成生姓名级号绩孙见任计算机科学与技术10110408100124指导教师(签字)计算机与通信学院20XX年6月2日目录一、课题的介绍和课题的任务二、设计的要求三、系统的分析和系统中功能的设计四、系统的实现及调试五、系统的使用说明六、总结七、程序主要源代码八、课程设计任务书一、课题的介绍和课题的任务音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。
它涵盖了各种音乐格式的播放工具,比如:mp3播放器,wmA播放器,mp4播放器等。
它们不仅界面美观,而且操作简单,带你进入一个完美的音乐空间。
利用mFc应用程序、媒体控制接口mIc的基本知识,设计一个mp3播放器。
要求能够播放常用windows音频格式的文件;实现播放控制:播放、暂停、清空播放列表、音量增减、添加歌曲、上一曲,下一曲等功能;实现从本地磁盘加入文件,然后对其进行播放。
二、设计的要求系统模块功能图:流程图:二、系统的分析和系统中功能的设计该播放器分为八大功能模块;1、背景图片:音乐播放器的背景图片。
篇二:android手机音乐播放器实训报告final课程名:软件工程综合实践实践项目:基于Android的手机音乐播放器一、课程设计题目基于Android的手机音乐播放器二、课程设计内容(含技术指标)本程序是基于Android开源系统技术,利用Java语言和eclipse编辑工具对播放器进行编写。
程序功能如下:用户可以按照以下规则进行操作:1.音乐播放:界面对歌曲操作有播放、暂停、停止、音量控制、上一首/下一首播放模式:随机播放、顺序播放、单曲循环。
2.音乐管理:音乐列表、专辑:显示全部音乐文件,能直接选择播放歌曲。
艺术家:归类艺术家的音乐文件。
最近播放:记录用户最近播放的音乐文件,方便用户再次使用。
mfc课程设计报告模板

mfc课程设计报告模板一、教学目标本课程的教学目标是使学生掌握MFC(Microsoft Foundation Class)的基本概念和编程技巧,培养学生使用MFC进行Windows应用程序开发的能力。
具体目标如下:1.知识目标:(1)理解MFC的基本概念,如窗口、消息、事件等。
(2)掌握MFC的编程步骤,如创建项目、添加类、编写代码等。
(3)熟悉MFC常用的类和函数,如CCmdTarget、CWnd、AfxMessageBox等。
2.技能目标:(1)能够使用MFC编写简单的Windows应用程序。
(2)能够使用MFC进行窗口布局和界面设计。
(3)能够使用MFC处理消息和事件,实现用户交互。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣和热情。
(2)培养学生解决问题的能力和创新精神。
(3)培养学生团队协作和良好沟通的意识和能力。
二、教学内容本课程的教学内容主要包括MFC的基本概念、编程步骤和常用类及函数。
具体安排如下:1.MFC的基本概念:介绍MFC的起源、发展及其在Windows应用程序开发中的应用。
2.MFC的编程步骤:讲解如何创建MFC项目、添加类、编写代码等。
3.MFC的常用类及函数:介绍MFC的核心类,如CCmdTarget、CWnd等,以及常用的函数,如AfxMessageBox等。
4.窗口布局和界面设计:讲解如何使用MFC进行窗口布局、界面设计以及界面美化。
5.消息和事件处理:讲解MFC如何处理消息和事件,实现用户交互。
6.实战项目:通过实际项目案例,让学生掌握MFC的应用,提高实际编程能力。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:教师讲解MFC的基本概念、编程步骤和常用类及函数。
2.讨论法:教师引导学生进行问题讨论,巩固所学知识。
3.案例分析法:分析实际项目案例,让学生学会运用MFC解决实际问题。
MP3音乐播放器实验报告

河南科技大学课程设计说明书课程名称面向对象程序课程设计题目MP3仿真程序设计院系电子信息工程学院班级计103 班学生姓名指导教师日期 2013.3.3~2013.3.17课程设计任务书任课教师:时间:2013.3.3课程设计报告文档题目:MP3仿真程序设计一.引言1.编写目的:随着多媒体技术的发展,如何简单方便的播放各类媒体已成为人们普遍关注的问题。
本设计就是基于面向对象技术,利用VC++6.0开发制作一个具有自己设计风格的简单的多媒体MP3播放器。
该播放器是基于MFC集成开发环境,利用MCIWnd类,建立了一个MP3播放器,通过调用这个类的函数来实现MP3播放器的暂停,播放,上一首,下一首,快进等基本功能。
它外观简洁,操作简便,系统资源占用少等功能。
通过MP3仿真程序设计,更加深入了解面向对象的编程。
通过本课程设计,巩固面向对象程序设计的基本概念、原理和技术,学会使用C++语言进行简单程序的开发,将理论与实际相结合,并在此基础上强化了实践意识,提高其实际动手能力和创新能力。
2.定义:HWND m_PreAudio,m_Audio;bool m_IsPaused,m_IsOpened;前两个变量用来存储MCIWndCreate返回的窗口句柄,初始值为NULL;后两者分别用来记录文件的播放与暂停状态,初始值分别为true与false;3.参考资料:1.郑秋生、吴庆涛,《C/C++程序设计》,北京:电子工业出版社2.谭浩强《C++程序设计》,北京:清华大学出版社二.任务的描述1.目标:利用C++编写制作一个MP3播放器。
2.功能描述:实现添加音乐,播放音乐,上一首,下一首,暂停,关闭播放,删除音乐,快进控制,循环播放,背景添加等功能。
3.性能描述(1)数据精确度:各种按钮点击之后1秒内都会触发点击事件,其中快进拖动,反应时间在1—2秒。
(2)时间特性:程序2秒内就可以运行。
功能按钮1秒内触发点击事件。
音乐播放器课程设计

音乐播放器课程设计一、课程目标知识目标:1. 学生能够理解音乐播放器的基本原理和功能。
2. 学生掌握音乐播放器界面设计的基本元素和布局。
3. 学生了解音乐播放器中不同音乐格式及其特点。
技能目标:1. 学生能够使用音乐播放器软件进行音乐播放、暂停、停止等基本操作。
2. 学生能够通过音乐播放器软件对音乐进行分类、排序和搜索。
3. 学生能够运用所学知识设计和制作简单的音乐播放器界面。
情感态度价值观目标:1. 培养学生对音乐的热爱和欣赏能力,提高审美情趣。
2. 培养学生团队协作和沟通能力,学会分享和交流音乐心得。
3. 增强学生对科技产品的认识,激发创新意识和探索精神。
课程性质:本课程为信息技术与音乐相结合的综合性课程,注重实践操作和实际应用。
学生特点:六年级学生具有一定的信息技术基础和音乐素养,对新事物充满好奇,喜欢动手实践。
教学要求:结合学生特点,采用任务驱动法,引导学生自主探究和合作学习,注重理论与实践相结合,提高学生的实际操作能力和创新能力。
通过本课程的学习,使学生能够将所学知识应用于实际生活,提升音乐欣赏和信息技术素养。
二、教学内容1. 音乐播放器原理与功能- 了解音乐播放器的基本构成和原理- 掌握音乐播放器的主要功能及操作方法2. 音乐播放器界面设计- 学习音乐播放器界面设计的基本原则- 分析并模仿经典音乐播放器界面布局3. 音乐格式及特点- 介绍常见音乐格式(如MP3、WAV等)及其特点- 了解音乐格式对播放效果和文件大小的影响4. 音乐播放器操作与使用- 学习使用音乐播放器软件进行基本操作(播放、暂停、停止等)- 掌握音乐播放器的高级功能(如音乐分类、排序、搜索等)5. 设计制作音乐播放器界面- 学习运用设计软件制作音乐播放器界面- 结合团队协作,设计并展示个性化的音乐播放器界面教学大纲安排:第一课时:音乐播放器原理与功能第二课时:音乐播放器界面设计第三课时:音乐格式及特点第四课时:音乐播放器操作与使用第五课时:设计制作音乐播放器界面教学内容关联教材章节:《信息技术》六年级上册:第五章 多媒体技术应用,第三节 音乐播放器原理与使用。
音乐播放器实验报告

目录一、课题的介绍和课题的任务二、设计的要求三、系统的分析和系统中功能的设计四、系统的实现及调试五、系统的使用说明六、总结七、程序主要源代码一、课题的介绍和课题的任务音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。
它涵盖了各种音乐格式的播放工具,比如: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();单击播放按钮的单击事件。
MP3音乐播放器软件课程设计报告(MFC)1

MP3音乐播放器软件课程设计报告(MFC)课程设计说明书课程设计名称:软件综合课程设计课程设计题目:音频播放器程序的设计与实现学院名称:信息工程学院电子信息工程专业课程设计任务书正文:目录引言 (5)一、设计程序的目的与要求 (6)目的 (6)要求 (6)二、方案实现与调试 (6)总体设计 (6)1、实现功能 (6)2、功能模块图 (7)详细设计 (7)1、界面布局 (7)2、各模块功能设计 (8)2.1处理“打开”按钮 (9)2.2处理“播放”按钮 (9)2.3处理“暂停”按钮 (9)2.4处理“停止”按钮 (9)2.5处理“音量”按钮 (10)2.6处理“退出”按钮 (10)3 操作步骤 (10)三、课程设计分析与总结 (11)分析 (11)总结 (11)附录 (13)关键程序清单 (13)参考文献 (20)引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。
1.1 MFC简介MFC是Visual C++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard 向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用[1]。
1.2 MCI简介MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。
它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。
MP3播放器课程设计报告

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.对不同的播放模式进行测试,看能否实现音乐的顺序播放,随机播放,单曲循环功能.。
音乐播放器课程设计报告

课程设计报告之阳早格格创做课程安排称呼:音乐播搁器院系:疑息工程教院教死姓名:班级:教号:成绩:指挥西席:开课时间:2016-2017教年 2 教期音乐播搁器一、试验的真质战央供教习WAV要领音频播搁本理、数字音频交心及的相关知识.相识模拟音频旗号战数字音频旗号的观念.掌握编写音频播主要真质搁器的要领.真止音频播搁,小键盘输进收配.本系统要搞一个音乐播搁器,使用通用定时器定时,用比较输出功能,输出乐谱频次的圆波爆收声音,对于 3 尾歌直编码,其收援 WAV 要领音频播搁(上键:久停;左键:上一尾;左键:下一尾).利用硬件ARM 嵌进式开垦仄台、用于ARM7TDMI 的 JTAG 仿真器、PC 机 Pentium100开垦真止真止音频播搁.主要真止:上一尾按键:当面打上一尾按键时,目前播搁歌直的上一尾歌尾被播搁.下一尾按键:当面打下一尾按键时,目前播搁歌直的下一尾歌直即被播搁.当面打停止键时,目前歌直即会被停止. 播搁界里安排:正在歌直举止播搁时,界里应包罗所有的按键,而且要歌直的直目单.二、试验本理WAV播搁器系统央供不妨对于mp3、wav要领的音频文献举止解码,处理起去速度是有央供的,更加是对于320Kbps的MP3要领数据流的处理,必须非常快,才搞真止MP3的流畅播搁,可供采用的八位机有AVR、PIC,可供采用的32位处理器有SAMSUNG、STM32、ATMEL等.采用MCU劣先思量于拥有歉富的RAM,八位机RAM主要靠扩展,内里RAM普遍正在4Kbyte以内,32位机内里,SAMSUNG普遍没有内戴RAM,也要中扩.本真验使用了ARM7处理器,MP3解码不妨有二种要领,一是通过ARM处理器硬解码,通过对于MP3数据要领的剖析真止MP3播搁,二是通过中部解码芯片直交解码.第一种要领正在解码下码率的MP3时,ARM7处理本领吃紧,而且STM32还需要中部DAC去搞音频输出,所以采与第二种要领举止解码.MP3罕睹的解码芯片有VS100X系列战STA01系列,STA01需要中交DAC搞音频输出,而VS1003自戴DAC,且解码的文献要领包罗mp3战wav,其余它还不妨真止录音功能,便当以去举止功能的拓展应用.三、试验步调开机后,先初初化各中设,而后检测字库文献夹是可存留,如果有问题,则提示Error,如果检测无问题,则开初循环播搁 SD卡内MUSIC 文献夹内里的歌直,正在 TFTLCD 上隐现歌直名字、播搁时间、歌直总时间、歌直数目、目前歌直的编号等疑息.KEY0采用下一尾,KEY2 采用上一尾,KEY_UP 统造久停/继承播搁.3.2真验步调1)初初化 WM8978,那个历程包罗硬复位、DAC 树立、输出树立战音量树立等.2)初初化 I2S,此历程主要树立 SPI_I2SCFGR 寄存器,树立 I2S 模式、I2S 尺度、时钟空忙电仄易数据帧少等,末尾开开 I2S TX DMA,使能 I2S 中设. 正在库函数中初初化 I2S 调用的函数为:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef*I2S_InitStruct); 结构体 I2S_InitTypeDef 的定义为:typedef struct{ uint16_t I2S_Mode;uint16_t I2S_Standard;uint16_t I2S_DataFormat;uint16_t I2S_MCLKOutput;uint32_t I2S_AudioFreq;uint16_t I2S_CPOL; }I2S_InitTypeDef;第一个参数用去树立 I2S 的模式,也便是树立 SPI_I2SCFGR 寄存器的 I2SCFG 相关位.不妨摆设为主模式收收 I2S_Mode_MasterTx,主模式交受 I2S_Mode_MasterRx,从模式收收 I2S_Mode_SlaveTx 以及从模式交受 I2S_Mode_SlaveRx 四种模式.第二个参数I2S_Standard 用去树立 I2S 尺度,那个前里已经道解过.不妨树立为:飞利浦尺度I2S_Standard_Phillips,MSB 对于齐尺度 I2S_Standard_MSB,LSB 对于齐尺度I2S_Standard_LSB 以及 PCM 尺度 I2S_Standard_PCMShort. 第三个参数 I2S_DataFormat 用去树立 I2S 的数据通疑要领.那里本质包罗树立 SPI_I2SCFGR 寄存器的 HCLEN 位(通道少度)以及 DATLEN 位(传输的数据少度).当咱们树立为 16 位尺度要领I2S_DataFormat_16b 的时间,本质上传输的数据少度为 16 位,通道少度为 16 位.当咱们树立为其余值的时间,通道少度皆为 32 位.第四个参数 I2S_MCLKOutput用去树立是可使能主时钟输出.咱们真验会使能主时钟输出.第五个参数 I2S_AudioFreq 用去树立 I2S频次.本质根据输进的频次值,会去估计 SPI 预分频寄存器 SPI_I2SPR 的预分频偶数果子以及 I2S 线性预分频器的值.那里收援 10 中频次:#define I2S_AudioFreq_192k ((uint32_t)192000)#define I2S_AudioFreq_96k ((uint32_t)96000)#define I2S_AudioFreq_48k ((uint32_t)48000)#define I2S_AudioFreq_44k ((uint32_t)44100)#define I2S_AudioFreq_32k ((uint32_t)32000)#define I2S_AudioFreq_22k ((uint32_t)22050)#define I2S_AudioFreq_16k ((uint32_t)16000)#define I2S_AudioFreq_11k ((uint32_t)11025)#define I2S_AudioFreq_8k ((uint32_t)8000)#define I2S_AudioFreq_Default ((uint32_t)2)第六个参数 I2S_CPOL 用去树立空忙状态时钟电仄,与值为下电仄 I2S_CPOL_High 以及矮电仄 I2S_CPOL_Low.3)剖析 WAV 文献,获与音频旗号采样率战位数并树立 I2S 时钟分频器那里,要先剖析 WAV 文献,博得音频旗号的采样率(fs)战位数(16 位或者 32 位),根据那二个参数,去树立 I2S 的时钟分频,那里咱们用前里介绍的查表法去树立即可.那是咱们单独写了一个树立频次的函数为 I2S2_SampleRate_Set.4)树立 DMA I2S 播搁音频的时间,普遍皆是通过 DMA 去传输数据的,所以必须摆设 DMA,本章咱们用 I2S2,其 TX是使用的 DMA1 数据流 4 的通道 0 去传输的.而且STM32F4 的 DMA 具备单慢冲体造,那样不妨普及效用,大大便当了咱们的数据传输,本章将 DMA1 数据流 4 树立为:单慢冲循环模式,中设战保存器皆是 16 位宽,并开开 DMA 传输完毕中断(便当弥补数据).5)编写 DMA 传输完毕中断服务函数为了便当弥补音频数据,咱们使用 DMA 传输完毕中断,每当一个慢冲数据收收完后,硬件自动切换为下一个慢冲,共时加进中断服务函数,弥补数据到收收完的那个慢冲.6)开开 DMA 传输,弥补数据末尾,咱们便只需要开开 DMA 传输,而后即时弥补WAV 数据到 DMA 的二个慢存区即可.此时,便不妨正在 WM8978 的耳机战喇叭通道听到所播搁音乐了.收配要领为: DMA_Cmd(DMA1_Stream4,ENABLE);//开开 DMA TX 传输,开初播搁.3.4关键代码I2s.c代码:#include "i2s.h"#include "usart.h"void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat){I2S_InitTypeDef I2S_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //复位SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//中断复位I2S_InitStructure.I2S_Mode=I2S_Mode;//IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS尺度I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IIS数据少度I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;//主时钟输出克制I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;//IIS频次树立I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//空忙状态时钟电仄I2S_Init(SPI2,&I2S_InitStructure);//初初化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMA哀供使能. I2S_Cmd(SPI2,ENABLE);//SPI2 I2S EN使能.}//采样率估计公式:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)]//I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR//普遍HSE=8Mhz//pllm:正在Sys_Clock_Set树立的时间决定,普遍是8//PLLI2SN:普遍是192~432//PLLI2SR:2~7//I2SDIV:2~255//ODD:0/1//I2S分频系数表@pllm=8,HSE=8Mhz,即vco输进频次为1Mhz//表要领:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL[][5]={{800 ,256,5,12,1},//8Khz采样率{1102,429,4,19,0},//11.025Khz采样率{1600,213,2,13,0},//16Khz采样率{3200,213,2, 6,1},//32Khz采样率{4800,258,3, 3,1},//48Khz采样率{9600,344,2, 3,1}, //96Khz采样率{17640,361,2,2,0}, //176.4Khz采样率{19200,393,2,2,0}, //192Khz采样率};//树立IIS的采样率(@MCKEN)//samplerate:采样率,单位:Hz//返回值:0,树立乐成;1,无法树立.u8 I2S2_SampleRate_Set(u32 samplerate){u8 i=0;u32 tempreg=0;samplerate/=10;//缩小10倍for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//瞅瞅改采样率是可不妨收援{if(samplerate==I2S_PSC_TBL[i][0])break;}RCC_PLLI2SCmd(DISABLE);//先关关PLLI2Sif(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找没有到RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//树立I2SxCLK的频次(x=2) 树立PLLI2SN PLLI2SRRCC->CR|=1<<26;//开开I2S时钟while((RCC->CR&1<<27)==0);//等待I2S时钟开开乐成.tempreg=I2S_PSC_TBL[i][3]<<0;//树立I2SDIVtempreg|=I2S_PSC_TBL[i][4]<<8;//树立ODD位tempreg|=1<<9;//使能MCKOE位,输出MCKSPI2->I2SPR=tempreg;//树立I2SPR寄存器return 0;}//I2S2 TX DMA摆设//树立为单慢冲模式,并开开DMA传输完毕中断//buf0:M0AR天面.//buf1:M1AR天面.//num:屡屡传输数据量void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num){NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//等待DMA1_Stream1可摆设/* 摆设 DMA Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道0 SPI2_TX通道DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//中设天面为:(u32)&SPI2->DRDMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA 保存器0天面DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//保存器到中设模式DMA_InitStructure.DMA_BufferSize = num;//数据传输量DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//中设非删量模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//保存器删量模式DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;//中设数据少度:16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//保存器数据少度:16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;//下劣先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //没有使用FIFO模式DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//中设突收单次传输DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//保存器突收单次传输DMA_Init(DMA1_Stream4, &DMA_InitStructure);//初初化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);//单慢冲模式摆设DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//单慢冲模式开开DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//开开传输完毕中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占劣先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子劣先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中部中断通道NVIC_Init(&NVIC_InitStructure);//摆设}//I2S DMA回调函数指针void (*i2s_tx_callback)(void);//TX回调函数//DMA1_Stream4中断服务函数void DMA1_Stream4_IRQHandler(void){if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)==SET)////DMA1_Stream4,传输完毕标记{DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);i2s_tx_callback();//真止回调函数,读与数据等收配正在那内里处理}}//I2S开初播搁void I2S_Play_Start(void){DMA_Cmd(DMA1_Stream4,ENABLE);//开开DMA TX传输,开初播搁}//关关I2S播搁void I2S_Play_Stop(void){DMA_Cmd(DMA1_Stream4,DISABLE);//关关DMA,中断播搁}wm8978代码:#include "wm8978.h"#include "myiic.h"#include "delay.h"static u16 WM8978_REGVAL_TBL[58]={0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000,0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF,0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000,0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9,0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100,0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039,0X0001,0X0001};//WM8978初初化//返回值:0,初初化仄常// 其余,过得代码u8 WM8978_Init(void){u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能中设GPIOB,GPIOC时//PB12/13 复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上推GPIO_Init(GPIOB, &GPIO_InitStructure);//初初化//PC2/PC3/PC6复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上推GPIO_Init(GPIOC, &GPIO_InitStructure);//初初化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCK GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);//PB13,AF5 I2S_SCLKGPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2);//PC3 ,AF5I2S_DACDATAGPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2);//PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2);//PC2 ,AF6I2S_ADCDATA I2S2ext_SD是AF6!!!IIC_Init();//初初化IIC交心res=WM8978_Write_Reg(0,0);//硬复位WM8978if(res)return 1;//收收指令波折,WM8978非常十分//以下为通用树立WM8978_Write_Reg(1,0X1B);//R1,MICEN树立为1(MIC使能),BIASEN树立为1(模拟器处事),VMIDSEL[1:0]树立为:11(5K)WM8978_Write_Reg(2,0X1B0);//R2,ROUT1,LOUT1输出使能(耳机不妨处事),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0X6C);//R3,LOUT2,ROUT2输出使能(喇叭处事),RMIX,LMIX使能WM8978_Write_Reg(6,0);//R6,MCLK由中部提供WM8978_Write_Reg(43,1<<4);//R43,INVROUT2反背,启动喇叭WM8978_Write_Reg(47,1<<8);//R47树立,PGABOOSTL,左通道MIC赢得20倍删益WM8978_Write_Reg(48,1<<8);//R48树立,PGABOOSTR,左通道MIC赢得20倍删益WM8978_Write_Reg(49,1<<1);//R49,TSDEN,开开过热呵护WM8978_Write_Reg(10,1<<3);//R10,SOFTMUTE关关,128x采样,最好SNRWM8978_Write_Reg(14,1<<3);//R14,ADC 128x采样率return 0;}//WM8978写寄存器//reg:寄存器天面//val:要写进寄存器的值//返回值:0,乐成;// 其余,过得代码u8 WM8978_Write_Reg(u8 reg,u16 val){IIC_Start();IIC_Send_Byte((WM8978_ADDR<<1)|0);//收收器件天面+写下令if(IIC_Wait_Ack())return 1;//等待应问(乐成?/波折?)IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//写寄存器天面+数据的最下位if(IIC_Wait_Ack())return 2;//等待应问(乐成?/波折?)IIC_Send_Byte(val&0XFF);//收收数据if(IIC_Wait_Ack())return 3;//等待应问(乐成?/波折?)IIC_Stop();WM8978_REGVAL_TBL[reg]=val;//保存寄存器值到当天return 0;}//WM8978读寄存器//便是读与当天寄存器值慢冲区内的对于应值//reg:寄存器天面//返回值:寄存器值u16 WM8978_Read_Reg(u8 reg){return WM8978_REGVAL_TBL[reg];}//WM8978 DAC/ADC摆设//adcen:adc使能(1)/关关(0)//dacen:dac使能(1)/关关(0)void WM8978_ADDA_Cfg(u8 dacen,u8 adcen){u16 regval;regval=WM8978_Read_Reg(3);//读与R3if(dacen)regval|=3<<0;//R3最矮2个位树立为1,开开DACR&DACL else regval&=~(3<<0);//R3最矮2个位浑整,关关DACR&DACL. WM8978_Write_Reg(3,regval);//树立R3regval=WM8978_Read_Reg(2);//读与R2if(adcen)regval|=3<<0;//R2最矮2个位树立为1,开开ADCR&ADCL else regval&=~(3<<0);//R2最矮2个位浑整,关关ADCR&ADCL. WM8978_Write_Reg(2,regval);//树立R2}//WM8978 输进通道摆设//micen:MIC开开(1)/关关(0)//lineinen:Line In开开(1)/关关(0)//auxen:aux开开(1)/关关(0)void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen){u16 regval;regval=WM8978_Read_Reg(2);//读与R2if(micen)regval|=3<<2;//开开INPPGAENR,INPPGAENL(MIC的PGA搁大)else regval&=~(3<<2);//关关INPPGAENR,INPPGAENL.WM8978_Write_Reg(2,regval);//树立R2regval=WM8978_Read_Reg(44);//读与R44if(micen)regval|=3<<4|3<<0;//开开LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. else regval&=~(3<<4|3<<0);//关关LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. WM8978_Write_Reg(44,regval);//树立R44if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dB删益else WM8978_LINEIN_Gain(0);//关关LINE INif(auxen)WM8978_AUX_Gain(7);//AUX 6dB删益else WM8978_AUX_Gain(0);//关关AUX输进}//WM8978 输出摆设//dacen:DAC输出(搁音)开开(1)/关关(0)//bpsen:Bypass输出(录音,包罗MIC,LINE IN,AUX等)开开(1)/关关(0)void WM8978_Output_Cfg(u8 dacen,u8 bpsen){u16 regval=0;if(dacen)regval|=1<<0;//DAC输出使能if(bpsen){regval|=1<<1;//BYPASS使能regval|=5<<2;//0dB删益}WM8978_Write_Reg(50,regval);//R50树立WM8978_Write_Reg(51,regval);//R51树立}//WM8978 MIC删益树立(没有包罗BOOST的20dB,MIC-->ADC输进部分的删益)void WM8978_MIC_Gain(u8 gain){gain&=0X3F;WM8978_Write_Reg(45,gain);//R45,左通道PGA树立WM8978_Write_Reg(46,gain|1<<8);//R46,左通道PGA树立}//WM8978 L2/R2(也便是Line In)删益树立(L2/R2-->ADC输进部分的删益)//gain:0~7,0表示通道克制,1~7,对于应-12dB~6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读与R47regval&=~(7<<4);//扫除本去的树立WM8978_Write_Reg(47,regval|gain<<4);//树立R47regval=WM8978_Read_Reg(48);//读与R48regval&=~(7<<4);//扫除本去的树立WM8978_Write_Reg(48,regval|gain<<4);//树立R48}//WM8978 AUXR,AUXL(PWM音频部分)删益树立(AUXR/L-->ADC输进部分的删益) //gain:0~7,0表示通道克制,1~7,对于应-12dB~6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读与R47regval&=~(7<<0);//扫除本去的树立WM8978_Write_Reg(47,regval|gain<<0);//树立R47regval=WM8978_Read_Reg(48);//读与R48regval&=~(7<<0);//扫除本去的树立WM8978_Write_Reg(48,regval|gain<<0);//树立R48}//树立I2S处事模式//fmt:0,LSB(左对于齐);1,MSB(左对于齐);2,飞利浦尺度I2S;3,PCM/DSP; //len:0,16位;1,20位;2,24位;3,32位;void WM8978_I2S_Cfg(u8 fmt,u8 len){fmt&=0X03;len&=0X03;//规定范畴WM8978_Write_Reg(4,(fmt<<3)|(len<<5));//R4,WM8978处事模式树立}//树立耳机安排声道音量//voll:左声道音量(0~63)//volr:左声道音量(0~63)void WM8978_HPvol_Set(u8 voll,u8 volr){voll&=0X3F;volr&=0X3F;//规定范畴if(voll==0)voll|=1<<6;//音量为0时,直交muteif(volr==0)volr|=1<<6;//音量为0时,直交muteWM8978_Write_Reg(52,voll);//R52,耳机左声道音量树立WM8978_Write_Reg(53,volr|(1<<8));//R53,耳机左声道音量树立,共步革新(HPVU=1) }//树立喇叭音量//voll:左声道音量(0~63)void WM8978_SPKvol_Set(u8 volx){volx&=0X3F;//规定范畴if(volx==0)volx|=1<<6;//音量为0时,直交muteWM8978_Write_Reg(54,volx);//R54,喇叭左声道音量树立WM8978_Write_Reg(55,volx|(1<<8));//R55,喇叭左声道音量树立,共步革新(SPKVU=1) }//树立3D环绕声//depth:0~15(3D强度,0最强,15最强)void WM8978_3D_Set(u8 depth){depth&=0XF;//规定范畴WM8978_Write_Reg(41,depth);//R41,3D环绕树立}//树立EQ/3D效用目标//dir:0,正在ADC起效用// 1,正在DAC起效用(默认)void WM8978_EQ_3D_Dir(u8 dir){u16 regval;regval=WM8978_Read_Reg(0X12);if(dir)regval|=1<<8;else regval&=~(1<<8);WM8978_Write_Reg(18,regval);//R18,EQ1的第9位统造EQ/3D目标}//树立EQ1//cfreq:停止频次,0~3,分别对于应:80/105/135/175Hz//gain:删益,0~24,对于应-12~+12dBvoid WM8978_EQ1_Set(u8 cfreq,u8 gain){u16 regval;cfreq&=0X3;//规定范畴if(gain>24)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0X100;regval|=cfreq<<5;//树立停止频次regval|=gain;//树立删益WM8978_Write_Reg(18,regval);//R18,EQ1树立}//树立EQ2//cfreq:核心频次,0~3,分别对于应:230/300/385/500Hz //gain:删益,0~24,对于应-12~+12dBvoid WM8978_EQ2_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//规定范畴if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//树立停止频次regval|=gain;//树立删益WM8978_Write_Reg(19,regval);//R19,EQ2树立}//树立EQ3//cfreq:核心频次,0~3,分别对于应:650/850/1100/1400Hz //gain:删益,0~24,对于应-12~+12dBvoid WM8978_EQ3_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//规定范畴if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//树立停止频次regval|=gain;//树立删益WM8978_Write_Reg(20,regval);//R20,EQ3树立}//树立EQ4//cfreq:核心频次,0~3,分别对于应:1800/2400/3200/4100Hz //gain:删益,0~24,对于应-12~+12dBvoid WM8978_EQ4_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//规定范畴if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//树立停止频次regval|=gain;//树立删益WM8978_Write_Reg(21,regval);//R21,EQ4树立}//树立EQ5//cfreq:核心频次,0~3,分别对于应:5300/6900/9000/11700Hz //gain:删益,0~24,对于应-12~+12dBvoid WM8978_EQ5_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//规定范畴if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//树立停止频次regval|=gain;//树立删益WM8978_Write_Reg(22,regval);//R22,EQ5树立}#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "lcd.h"#include "key.h"#include "usmart.h"#include "malloc.h"#include "w25qxx.h"#include "sdio_sdcard.h"#include "ff.h"#include "exfuns.h"#include "fontupd.h"#include "text.h"#include "wm8978.h"#include "audioplay.h"//ALIENTEK 探索者STM32F407开垦板真验43 //音乐播搁器真验 -库函数版本//广州市星翼电子科技有限公司//做家:正面本子 @ALIENTEKint main(void){delay_init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//树立系统中断劣先级分组2 //初初化延时函数uart_init(115200);//初初化串心波特率为115200LED_Init();//初初化LEDusmart_dev.init(84);//初初化USMARTLCD_Init();//LCD初初化KEY_Init();//按键初初化W25QXX_Init();//初初化W25Q128WM8978_Init();//初初化WM8978WM8978_HPvol_Set(40,40);//耳机音量树立WM8978_SPKvol_Set(60);//喇叭音量树立my_mem_init(SRAMIN);//初初化内里内存池my_mem_init(SRAMCCM);//初初化CCM内存池exfuns_init();//为fatfs相关变量申请内存f_mount(fs[0],"0:",1); //挂载SD卡POINT_COLOR=BLACK;while(font_init()) //查看字库{LCD_ShowString(30,50,200,16,16,"Font Error!");delay_ms(200);LCD_Fill(30,50,240,66,WHITE);//扫除隐现delay_ms(200);}POINT_COLOR=BLACK;Show_Str(60,50,200,16,"Explorer STM32F4开垦板",16,0);。
MFC音乐播放器(实验报告)

音乐播放器大型实验报告通过动手制作基于VC++的音乐播放器,了解播放器的原理。
并通过自己动手,在windows 播放器组件的基础上,用自己的算法,去实现自己的界面和自己的播放模式。
二、总体设计(1)在visual c++环境下设计出一个音乐播放器的界面:具有打开音乐文件、播放歌曲,、暂停或恢复、停止、调节音量大小的功能;(2)修改各个控件的属性,并为其添加消息函数; (3)用媒体控制接口MCI 编程为各个消息函数添加代码; (4)对该音乐播放器编译--运行。
音乐播放器打开文件播放歌曲暂停播放停止播放音量控制(一):创建MFC应用程序框架:打开visual c++软件,选择“文件”—“新建”新建一个应用程序文档MFC AppWizard[exe],将工程命名为MFC音乐播放器,选择合适的保存位置,然后“确定”选择基本对话框,完成设置。
(二)编辑对话框:在工作区内,设计出一个音乐播放器的界面,添加按钮控件:浏览、播放、暂停、停止,添加一个滑动条控件,一个静态文本,两个编辑框。
然后,依次修改各控件的属性:1)右击静态文本,选择属性,将标题改为音乐名称:2)右击编辑框,选择属性,将ID改为IDC_filename3) 右击Button1,选择属性,将ID改为IDC_filechoice,将标题改为浏览3)右击Button2,选择属性,将ID改为IDC_play,将标题改为播放4)右击Button3,选择属性,将ID改为IDC_pause,将标题改为暂停5)右击Button4,选择属性,将ID改为IDC_stop,将标题改为停止6)右击滑块,ID改为IDC_SLIDER单击样式,点[P]:选择顶端/左侧,选择打勾标记。
7)右击编辑框,将ID改为IDC_vol音乐播放器的界面已经设计完毕,为:(三)添加代码1)在头文件处添加#include"Mmsystem.h"#include"Digitalv.h"#pragma comment(lib,"Winmm.lib")2)定义全局变量及成员函数。
(mfc)课程设计报告

(mfc)课程设计报告一、教学目标本课程的教学目标是使学生掌握(mfc)的核心概念和实用技能,能够运用(mfc)解决实际问题。
具体来说,知识目标包括理解(mfc)的基本原理、掌握(mfc)的关键技术、了解(mfc)的应用领域;技能目标包括能够使用(mfc)工具进行有效的问题解决、能够设计和实现(mfc)应用程序、能够对(mfc)程序进行调试和优化;情感态度价值观目标包括培养学生的创新意识、培养学生对(mfc)技术的热情和责任感。
二、教学内容本课程的教学内容将根据课程目标进行选择和。
主要内容包括(mfc)的基本原理、关键技术、应用领域等。
具体的教学大纲和进度安排如下:第1周:介绍(mfc)的基本概念和原理,讲解(mfc)的框架和架构。
第2周:讲解(mfc)的关键技术,包括(mfc)的图形界面设计、事件处理、文件操作等。
第3周:介绍(mfc)的应用领域,分析(mfc)在实际问题中的应用和解决方案。
第4周:进行(mfc)编程实践,让学生通过实际操作掌握(mfc)的应用和技巧。
三、教学方法为了达到课程目标,我们将采用多种教学方法,包括讲授法、讨论法、案例分析法、实验法等。
通过多样化的教学方法,激发学生的学习兴趣和主动性,帮助他们更好地理解和掌握(mfc)知识。
四、教学资源我们将选择和准备适当的教学资源,包括教材、参考书、多媒体资料、实验设备等。
教学资源应能够支持教学内容和教学方法的实施,丰富学生的学习体验。
我们将使用权威的教材和参考书,制作精美的多媒体课件,提供丰富的实验设备,以保证教学效果的最大化。
五、教学评估本课程的评估方式将包括平时表现、作业、考试等多种形式,以全面、客观、公正地评估学生的学习成果。
具体来说,平时表现将占课程总评的30%,包括课堂参与度、提问和回答问题的质量等;作业将占课程总评的30%,包括课后练习、小项目等;考试将占课程总评的40%,包括期中和期末考试。
我们将根据学生的表现和成绩,给予及时的反馈和指导,帮助学生不断提高。
音乐播放器课程设计报告

课程设计报告课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指点教师:开课时光:2016-2017学年 2 学期音乐播放器一.实践的内容和请求进修WAV格局音频播放道理.数字音频接口及的相干常识.懂得模仿音频旌旗灯号和数字音频旌旗灯号的概念.控制编写音频播重要内容放器的办法.实现音频播放,小键盘输入操纵.本体系要做一个音乐播放器,运用通用准时器准时,用比较输出功效,输出曲谱频率的方波产生声音,对 3 首歌曲编码, 其支撑 WAV 格局音频播放(上键:暂停;左键:上一首;右键:下一首).运用硬件ARM 嵌入式开辟平台. 用于 ARM7TDMI 的JTAG 仿真器.PC 机 Pentium100开辟实实际现音频播放.重要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放.下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放.当点击停滞键时,当前歌曲即会被停滞.播放界面设计:在歌曲进行播放时, 界面应包含所有的按键, 并且要歌曲的曲目单.二、实践道理WAV播放器体系请求可以或许对mp3.wav格局的音频文件进行解码,处理起来速度是有请求的,尤其是对320Kbps的MP3格局数据流的处理,必须平常快,才干实现MP3的流利播放,可供选择的八位机有AVR.PIC,可供选择的32位处理器有SAMSUNG.STM32.ATMEL等.选择MCU优先斟酌于失去丰硕的RAM,八位机RAM重要靠扩大,内部RAM一般在4Kbyte以内,32位机里面,SAMSUNG一般不内带RAM,也要外扩.本试验运用了ARM7处理器,MP3解码可以有两种办法,一是经由过程ARM处理器软解码,经由过程对MP3数据格局的解析实现MP3播放,二是经由过程外部解码芯片直接解码.第一种办法在解码高码率的MP3时,ARM7处理才能吃紧,并且STM32还须要外部DAC来做音频输出,所以采取第二种办法进行解码.MP3罕有的解码芯片有VS100X系列和STA01系列,STA01须要外接DAC做音频输出,而VS1003自带DAC,且解码的文件格局包含mp3和wav,别的它还可以实现灌音功效,便利以落后行功效的拓展运用.三.实践步调开机后,先初始化各外设,然后检测字库文件夹是否消失,假如有问题,则提醒Error,假如检测无问题,则开端轮回播放 SD卡内MUSIC 文件夹里面的歌曲,在 TFTLCD 上显示歌曲名字.播放时光.歌曲总时光.歌曲数量.当前歌曲的编号等信息.KEY0选择下一首,KEY2 选择上一首,KEY_UP 控制暂停/持续播放.3.2试验步调1)初始化 WM8978,这个进程包含软复位.DAC 设置.输出设置和音量设置等.2)初始化 I2S,此进程重要设置 SPI_I2SCFGR 存放器,设置 I2S 模式.I2S 尺度.时钟余暇电温和数据帧长等,最后开启 I2S TX DMA,使能 I2S 外设. 在库函数中初始化 I2S 挪用的函数为:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); 构造体 I2S_InitTypeDef 的界说为:typedef struct{ uint16_t I2S_Mode;uint16_t I2S_Standard;uint16_t I2S_DataFormat;uint16_t I2S_MCLKOutput;uint32_t I2S_AudioFreq;uint16_t I2S_CPOL; }I2S_InitTypeDef;第一个参数用来设置 I2S 的模式,也就是设置 SPI_I2SCFGR 存放器的 I2SCFG 相干位.可以设置装备摆设为主模式发送 I2S_Mode_MasterTx,主模式接收 I2S_Mode_MasterRx,从模式发送 I2S_Mode_SlaveTx 以及从模式接收 I2S_Mode_SlaveRx 四种模式.第二个参数I2S_Standard 用来设置 I2S 尺度,这个前面已经讲授过.可以设置为:飞利浦尺度I2S_Standard_Phillips,MSB 对齐尺度 I2S_Standard_MSB,LSB 对齐尺度I2S_Standard_LSB 以及 PCM 尺度 I2S_Standard_PCMShort. 第三个参数 I2S_DataFormat 用来设置 I2S 的数据通讯格局.这里实际包含设置 SPI_I2SCFGR 存放器的 HCLEN 位(通道长度)以及 DATLEN 位(传输的数据长度).当我们设置为 16 位尺度格局I2S_DataFormat_16b 的时刻,实际上传输的数据长度为 16 位,通道长度为 16 位.当我们设置为其他值的时刻,通道长度都为 32 位.第四个参数 I2S_MCLKOutput用来设置是否使能主时钟输出.我们试验会使能主时钟输出.第五个参数 I2S_AudioFreq 用来设置 I2S频率.实际依据输入的频率值,会来盘算 SPI 预分频存放器 SPI_I2SPR 的预分频奇数因子以及 I2S 线性预分频器的值.这里支撑 10 中频率:#define I2S_AudioFreq_192k ((uint32_t)192000)#define I2S_AudioFreq_96k ((uint32_t)96000)#define I2S_AudioFreq_48k ((uint32_t)48000)#define I2S_AudioFreq_44k ((uint32_t)44100)#define I2S_AudioFreq_32k ((uint32_t)32000)#define I2S_AudioFreq_22k ((uint32_t)22050)#define I2S_AudioFreq_16k ((uint32_t)16000)#define I2S_AudioFreq_11k ((uint32_t)11025)#define I2S_AudioFreq_8k ((uint32_t)8000)#define I2S_AudioFreq_Default ((uint32_t)2)第六个参数 I2S_CPOL 用来设置余暇状况时钟电平,取值为高电平 I2S_CPOL_High 以及低电平 I2S_CPOL_Low.3)解析 WAV 文件,获取音频旌旗灯号采样率和位数并设置 I2S 时钟分频器这里,要先解析 WAV 文件,取得音频旌旗灯号的采样率(fs)和位数(16 位或 32 位),依据这两个参数,来设置 I2S 的时钟分频,这里我们用前面介绍的查表法来设置即可.这是我们单独写了一个设置频率的函数为 I2S2_SampleRate_Set.4)设置 DMA I2S 播放音频的时刻,一般都是经由过程 DMA 来传输数据的,所以必须设置装备摆设 DMA,本章我们用 I2S2,其 TX是运用的 DMA1 数据流 4 的通道 0 来传输的.并且STM32F4 的 DMA 具有双缓冲机制,如许可以进步效力,大大便利了我们的数据传输,本章将 DMA1 数据流 4 设置为:双缓冲轮回模式,外设和存储器都是 16 位宽,并开启 DMA 传输完成中止(便利填充数据).5)编写 DMA 传输完成中止办事函数为了便利填充音频数据,我们运用 DMA 传输完成中止,每当一个缓冲数据发送完后,硬件主动切换为下一个缓冲,同时进入中止办事函数,填充数据到发送完的这个缓冲.6)开启 DMA 传输,填充数据最后,我们就只须要开启 DMA 传输,然后实时填充 WAV 数据到 DMA 的两个缓存区即可.此时,就可以在 WM8978 的耳机和喇叭通道听到所播放音乐了.操纵办法为: DMA_Cmd(DMA1_Stream4,ENABLE);//开启 DMA TX 传输,开端播放.3.4症结代码I2s.c代码:#include "i2s.h"#include "usart.h"void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat){I2S_InitTypeDef I2S_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //复位SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停滞复位I2S_InitStructure.I2S_Mode=I2S_Mode;//IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS尺度I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IIS数据长度I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;//主时钟输出制止I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;//IIS频率设置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//余暇状况时钟电平I2S_Init(SPI2,&I2S_InitStructure);//初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMA请求使能.I2S_Cmd(SPI2,ENABLE);//SPI2 I2S EN使能.}//采样率盘算公式:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)]//I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR//一般HSE=8Mhz//pllm:在Sys_Clock_Set设置的时刻肯定,一般是8//PLLI2SN:一般是192~432//PLLI2SR:2~7//I2SDIV:2~255//ODD:0/1//I2S分频系数表@pllm=8,HSE=8Mhz,即vco输入频率为1Mhz //表格局:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL[][5]={{800 ,256,5,12,1},//8Khz采样率{1102,429,4,19,0},//11.025Khz采样率{1600,213,2,13,0},//16Khz采样率{3200,213,2, 6,1},//32Khz采样率{4800,258,3, 3,1},//48Khz采样率{9600,344,2, 3,1}, //96Khz采样率{17640,361,2,2,0}, //176.4Khz采样率{19200,393,2,2,0}, //192Khz采样率};//设置IIS的采样率(@MCKEN)//samplerate:采样率,单位:Hz//返回值:0,设置成功;1,无法设置.u8 I2S2_SampleRate_Set(u32 samplerate){u8 i=0;u32 tempreg=0;samplerate/=10;//缩小10倍for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//看看改采样率是否可以支撑{if(samplerate==I2S_PSC_TBL[i][0])break;}RCC_PLLI2SCmd(DISABLE);//先封闭PLLI2Sif(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找不到RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//设置I2SxCLK的频率(x=2) 设置PLLI2SN PLLI2SRRCC->CR|=1<<26;//开启I2S时钟while((RCC->CR&1<<27)==0);//等待I2S时钟开启成功.tempreg=I2S_PSC_TBL[i][3]<<0;//设置I2SDIVtempreg|=I2S_PSC_TBL[i][4]<<8;//设置ODD位tempreg|=1<<9;//使能MCKOE位,输出MCKSPI2->I2SPR=tempreg;//设置I2SPR存放器return 0;}//I2S2 TX DMA设置装备摆设//设置为双缓冲模式,并开启DMA传输完成中止//buf0:M0AR地址.//buf1:M1AR地址.//num:每次传输数据量void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num){NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//等待DMA1_Stream1可设置装备摆设/* 设置装备摆设 DMA Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道0 SPI2_TX通道DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//外设地址为:(u32)&SPI2->DRDMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA 存储器0地址DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式DMA_InitStructure.DMA_BufferSize = num;//数据传输量DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 运用轮回模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //不运用FIFO模式DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输DMA_Init(DMA1_Stream4, &DMA_InitStructure);//初始化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);//双缓冲模式设置装备摆设DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//双缓冲模式开启DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//开启传输完成中止NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中止通道NVIC_Init(&NVIC_InitStructure);//设置装备摆设}//I2S DMA回调函数指针void (*i2s_tx_callback)(void);//TX回调函数//DMA1_Stream4中止办事函数void DMA1_Stream4_IRQHandler(void){if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)==SET)////DMA1_Stream4,传输完成标记{DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);i2s_tx_callback();//履行回调函数,读取数据等操纵在这里面处理}}//I2S开端播放void I2S_Play_Start(void){DMA_Cmd(DMA1_Stream4,ENABLE);//开启DMA TX传输,开端播放}//封闭I2S播放void I2S_Play_Stop(void){DMA_Cmd(DMA1_Stream4,DISABLE);//封闭DMA,停滞播放}wm8978代码:#include "wm8978.h"#include "myiic.h"#include "delay.h"static u16 WM8978_REGVAL_TBL[58]={0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000, 0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF, 0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000, 0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000, 0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9, 0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100, 0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039, 0X0001,0X0001};//WM8978初始化//返回值:0,初始化正常// 其他,错误代码u8 WM8978_Init(void){u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能外设GPIOB,GPIOC时//PB12/13 复用功效输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功效GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化//PC2/PC3/PC6复用功效输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功效GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCKGPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);//PB13,AF5 I2S_SCLKGPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2);//PC3 ,AF5I2S_DACDATAGPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2);//PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2);//PC2 ,AF6I2S_ADCDATA I2S2ext_SD是AF6!!!IIC_Init();//初始化IIC接口res=WM8978_Write_Reg(0,0);//软复位WM8978if(res)return 1;//发送指令掉败,WM8978平常//以下为通用设置WM8978_Write_Reg(1,0X1B);//R1,MICEN设置为1(MIC使能),BIASEN设置为1(模仿器工作),VMIDSEL[1:0]设置为:11(5K)WM8978_Write_Reg(2,0X1B0);//R2,ROUT1,LOUT1输出使能(耳机可以工作),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0X6C);//R3,LOUT2,ROUT2输出使能(喇叭工作),RMIX,LMIX使能WM8978_Write_Reg(6,0);//R6,MCLK由外部供给WM8978_Write_Reg(43,1<<4);//R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47,1<<8);//R47设置,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48,1<<8);//R48设置,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49,1<<1);//R49,TSDEN,开启过热呵护WM8978_Write_Reg(10,1<<3);//R10,SOFTMUTE封闭,128x采样,最佳SNRWM8978_Write_Reg(14,1<<3);//R14,ADC 128x采样率return 0;}//WM8978写存放器//reg:存放器地址//val:要写入存放器的值//返回值:0,成功;// 其他,错误代码u8 WM8978_Write_Reg(u8 reg,u16 val){IIC_Start();IIC_Send_Byte((WM8978_ADDR<<1)|0);//发送器件地址+写敕令if(IIC_Wait_Ack())return 1;//等待应答(成功?/掉败?)IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//写存放器地址+数据的最高位if(IIC_Wait_Ack())return 2;//等待应答(成功?/掉败?)IIC_Send_Byte(val&0XFF);//发送数据if(IIC_Wait_Ack())return 3;//等待应答(成功?/掉败?)IIC_Stop();WM8978_REGVAL_TBL[reg]=val;//保管存放器值到当地return 0;}//WM8978读存放器//就是读取当地存放器值缓冲区内的对应值//reg:存放器地址//返回值:存放器值u16 WM8978_Read_Reg(u8 reg){return WM8978_REGVAL_TBL[reg];}//WM8978 DAC/ADC设置装备摆设//adcen:adc使能(1)/封闭(0)//dacen:dac使能(1)/封闭(0)void WM8978_ADDA_Cfg(u8 dacen,u8 adcen){u16 regval;regval=WM8978_Read_Reg(3);//读取R3if(dacen)regval|=3<<0;//R3最低2个位设置为1,开启DACR&DACLelse regval&=~(3<<0);//R3最低2个位清零,封闭DACR&DACL.WM8978_Write_Reg(3,regval);//设置R3regval=WM8978_Read_Reg(2);//读取R2if(adcen)regval|=3<<0;//R2最低2个位设置为1,开启ADCR&ADCLelse regval&=~(3<<0);//R2最低2个位清零,封闭ADCR&ADCL.WM8978_Write_Reg(2,regval);//设置R2}//WM8978 输入通道设置装备摆设//micen:MIC开启(1)/封闭(0)//lineinen:Line In开启(1)/封闭(0)//auxen:aux开启(1)/封闭(0)void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen){u16 regval;regval=WM8978_Read_Reg(2);//读取R2if(micen)regval|=3<<2;//开启INPPGAENR,INPPGAENL(MIC的PGA放大)else regval&=~(3<<2);//封闭INPPGAENR,INPPGAENL.WM8978_Write_Reg(2,regval);//设置R2regval=WM8978_Read_Reg(44);//读取R44if(micen)regval|=3<<4|3<<0;//开启LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. else regval&=~(3<<4|3<<0);//封闭LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. WM8978_Write_Reg(44,regval);//设置R44if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dB增益else WM8978_LINEIN_Gain(0);//封闭LINE INif(auxen)WM8978_AUX_Gain(7);//AUX 6dB增益else WM8978_AUX_Gain(0);//封闭AUX输入}//WM8978 输出设置装备摆设//dacen:DAC输出(放音)开启(1)/封闭(0)//bpsen:Bypass输出(灌音,包含MIC,LINE IN,AUX等)开启(1)/封闭(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen){u16 regval=0;if(dacen)regval|=1<<0;//DAC输出使能if(bpsen){regval|=1<<1;//BYPASS使能regval|=5<<2;//0dB增益}WM8978_Write_Reg(50,regval);//R50设置WM8978_Write_Reg(51,regval);//R51设置}//WM8978 MIC增益设置(不包含BOOST的20dB,MIC-->ADC输入部分的增益)void WM8978_MIC_Gain(u8 gain){gain&=0X3F;WM8978_Write_Reg(45,gain);//R45,左通道PGA设置WM8978_Write_Reg(46,gain|1<<8);//R46,右通道PGA设置}//WM8978 L2/R2(也就是Line In)增益设置(L2/R2-->ADC输入部分的增益)//gain:0~7,0暗示通道制止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读取R47regval&=~(7<<4);//消除本来的设置WM8978_Write_Reg(47,regval|gain<<4);//设置R47regval=WM8978_Read_Reg(48);//读取R48regval&=~(7<<4);//消除本来的设置WM8978_Write_Reg(48,regval|gain<<4);//设置R48}//WM8978 AUXR,AUXL(PWM音频部分)增益设置(AUXR/L-->ADC输入部分的增益) //gain:0~7,0暗示通道制止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);//读取R47regval&=~(7<<0);//消除本来的设置WM8978_Write_Reg(47,regval|gain<<0);//设置R47regval=WM8978_Read_Reg(48);//读取R48regval&=~(7<<0);//消除本来的设置WM8978_Write_Reg(48,regval|gain<<0);//设置R48}//设置I2S工作模式//fmt:0,LSB(右对齐);1,MSB(左对齐);2,飞利浦尺度I2S;3,PCM/DSP;//len:0,16位;1,20位;2,24位;3,32位;void WM8978_I2S_Cfg(u8 fmt,u8 len){fmt&=0X03;len&=0X03;//限制规模WM8978_Write_Reg(4,(fmt<<3)|(len<<5));//R4,WM8978工作模式设置}//设置耳机阁下声道音量//voll:左声道音量(0~63)//volr:右声道音量(0~63)void WM8978_HPvol_Set(u8 voll,u8 volr){voll&=0X3F;volr&=0X3F;//限制规模if(voll==0)voll|=1<<6;//音量为0时,直接muteif(volr==0)volr|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(52,voll);//R52,耳机左声道音量设置WM8978_Write_Reg(53,volr|(1<<8));//R53,耳机右声道音量设置,同步更新(HPVU=1) }//设置喇叭音量//voll:左声道音量(0~63)void WM8978_SPKvol_Set(u8 volx){volx&=0X3F;//限制规模if(volx==0)volx|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(54,volx);//R54,喇叭左声道音量设置WM8978_Write_Reg(55,volx|(1<<8));//R55,喇叭右声道音量设置,同步更新(SPKVU=1) }//设置3D围绕声//depth:0~15(3D强度,0最弱,15最强)void WM8978_3D_Set(u8 depth){depth&=0XF;//限制规模WM8978_Write_Reg(41,depth);//R41,3D围绕设置}//设置EQ/3D感化偏向//dir:0,在ADC起感化// 1,在DAC起感化(默认)void WM8978_EQ_3D_Dir(u8 dir){u16 regval;regval=WM8978_Read_Reg(0X12);if(dir)regval|=1<<8;else regval&=~(1<<8);WM8978_Write_Reg(18,regval);//R18,EQ1的第9位控制EQ/3D偏向}//设置EQ1//cfreq:截止频率,0~3,分离对应:80/105/135/175Hz//gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ1_Set(u8 cfreq,u8 gain){u16 regval;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0X100;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(18,regval);//R18,EQ1设置}//设置EQ2//cfreq:中间频率,0~3,分离对应:230/300/385/500Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ2_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(19,regval);//R19,EQ2设置}//设置EQ3//cfreq:中间频率,0~3,分离对应:650/850/1100/1400Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ3_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(20,regval);//R20,EQ3设置}//设置EQ4//cfreq:中间频率,0~3,分离对应:1800/2400/3200/4100Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ4_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(21,regval);//R21,EQ4设置}//设置EQ5//cfreq:中间频率,0~3,分离对应:5300/6900/9000/11700Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ5_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限制规模if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5;//设置截止频率regval|=gain;//设置增益WM8978_Write_Reg(22,regval);//R22,EQ5设置}#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "lcd.h"#include "key.h"#include "usmart.h"#include "malloc.h"#include "w25qxx.h"#include "sdio_sdcard.h"#include "ff.h"#include "exfuns.h"#include "fontupd.h"#include "text.h"#include "wm8978.h"#include "audioplay.h"//ALIENTEK 摸索者STM32F407开辟板试验43//音乐播放器试验 -库函数版本//广州市星翼电子科技有限公司//作者:正点原子 @ALIENTEKint main(void){delay_init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置体系中止优先级分组2 //初始化延时函数uart_init(115200);//初始化串口波特率为115200LED_Init();//初始化LEDusmart_dev.init(84);//初始化USMARTLCD_Init();//LCD初始化KEY_Init();//按键初始化W25QXX_Init();//初始化W25Q128WM8978_Init();//初始化WM8978WM8978_HPvol_Set(40,40);//耳机音量设置WM8978_SPKvol_Set(60);//喇叭音量设置my_mem_init(SRAMIN);//初始化内部内存池my_mem_init(SRAMCCM);//初始化CCM内存池exfuns_init();//为fatfs相干变量申请内存f_mount(fs[0],"0:",1); //挂载SD卡POINT_COLOR=BLACK;while(font_init()) //检讨字库{LCD_ShowString(30,50,200,16,16,"Font Error!");delay_ms(200);LCD_Fill(30,50,240,66,WHITE);//消除显示delay_ms(200);}POINT_COLOR=BLACK;Show_Str(60,50,200,16,"Explorer STM32F4开辟板",16,0);。
基于C++的MFC对话框的音乐播放器

表 2-2 MCI 函数
函数名 mciSendCommand mciGetDeviceID mciSendString mciGetErrorString
功
能
发送命令消息
获取MCI设备的ID 发送命令字符串
获取当前MCI错误的字符串描述
类型 命令消息接口函数
命令字符串接口函数 公用函数
MCI 命令消息接口方式利用消息和数据结构来给多媒体设备发送命令和接 收 MCI 设备传来的信息。这种方式的接口函数主要有 3 个,即 mciSendCommand,
5 关键代码附录
//定义三个全局函数 HWND m_hWnd;;//记录当前窗口的句柄 DWORD DeviceID;;//指定播放音乐的设备 ID MCI_OPEN_PARMS mciOpenParms;//指定打开音乐文件的参数
void Load(HWND hWnd,CString strFilePath)//加载设备文件,将文件路径传给 MCI_OPEN_PARMS 类 {
C++面向对象程序设计
报
告
姓名: 专业:电子与通信工程 学号:201622 时间:2016 年 12 月 5 日
基于 C++的 MFC 对话框的音乐播放器
1 设计内容
设计题目:基于 C++的 MFC 对话框的音乐播放器 设计内容:利用 MFC 应用程序、媒体控制接口 MIC 的基本知识,设计一个 MP3 播放器。要求能够播放常用 Windows 音频格式的文件;实现播放控制:播放、 暂停、停止等;实现音量控制:声音放大、减小等功能。 本次作业的意义在于结合 C++语言提供的思想和多样的媒体控制方法,结合 用户对媒体播放器的要求和使用音乐播放器的习惯,设计了一款界面简单明了, 操作简单实用的音乐播放器。
MFC媒体播放器综合设计报告

CStri ngPathName
=m_ActiveMovie.GetFileName();
int strLe ngth = PathName.GetLe ngth()+
1;
char *pValue = new char[strLe ngth];
〜11〜
strn cpy(pValue, PathName, strLe ngth); SetWi ndowText(pValue);
"Wma File(*.wma)|*.wma|"
"Video File(*.dat)|*.dat|"
"Wave File(*.wav)|*.wav|"
"AVI File(*.avi)|*.avi|"
"Movie File(*.mov)|*.mov|"
"Media File(*.mmm)|*.mmm|"
4.系统设计
1.系统架构设计
ttED I A PLAVER
系统调用
返回结果
多媒体播放器的具体功能如下:
(1)打开本地媒体文件(可支持的文件有*.mp3),在打开对话框可以对本地 媒体文件进行查找;
(2)播放控制即可通过面板上按钮
(3)暂停播放媒体文件,继续播放媒体文件;
(4)停止播放媒体文件,播放进度条返回起点;
柄圭寸装类和很多Windows的内建控件和组件的圭寸装类。
(2)MF编程特点
微软基础类(Microsoft Foundation Classes),是微软提供的,用于在C++
环境下编写应用程序的一个框架和引擎,VC+是Win DO下开发人员使用的专业C++ SDK(SDK Standard SoftWare Develop Kit,专业软件开发平台),MF(就
mfc音乐播放器课程设计

mfc音乐播放器 课程设计一、课程目标知识目标:1. 学生能理解MFC音乐播放器的原理,掌握其基本组成和功能。
2. 学生能掌握MFC编程的基本概念,如窗口创建、消息处理等。
3. 学生能了解音频文件格式及其在音乐播放器中的应用。
技能目标:1. 学生能运用MFC编程知识,独立设计并实现一个简单的音乐播放器界面。
2. 学生能通过编程实现音乐播放、暂停、停止、切换歌曲等功能。
3. 学生能通过课程实践,提高解决问题的能力和团队协作能力。
情感态度价值观目标:1. 培养学生对计算机编程的兴趣,激发学习积极性。
2. 培养学生勇于尝试、不断探索的精神,增强自信心。
3. 培养学生团队协作意识,提高沟通能力。
课程性质:本课程为信息技术课程,以实践操作为主,理论讲授为辅。
学生特点:六年级学生具备一定的计算机操作基础,对编程有一定兴趣,但编程技能和理论知识相对薄弱。
教学要求:结合学生特点,课程设计注重实践操作,以项目驱动教学,让学生在动手实践中掌握知识,提高技能。
同时,注重培养学生的情感态度价值观,激发学习兴趣,提高综合素质。
通过分解课程目标,为教学设计和评估提供明确的方向。
1. MFC基础知识:介绍MFC框架、窗口创建、消息映射等基本概念,让学生理解MFC编程的基本原理。
教材章节:第三章《MFC编程基础》内容安排:第1节至第3节2. 音频文件格式:讲解常见的音频文件格式,如MP3、WAV等,以及它们在音乐播放器中的应用。
教材章节:第四章《数字音频处理》内容安排:第1节3. 音乐播放器功能实现:引导学生学习音乐播放器的基本功能,如播放、暂停、停止、切换歌曲等,并通过编程实现。
教材章节:第五章《MFC音乐播放器设计与实现》内容安排:第1节至第4节4. 项目实践:指导学生以小组形式,设计并实现一个具有基本功能的MFC音乐播放器。
教材章节:第六章《项目实践》内容安排:第1节至第3节5. 教学进度:共安排8课时,其中MFC基础知识2课时,音频文件格式1课时,音乐播放器功能实现4课时,项目实践1课时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书课程设计名称:软件综合课程设计课程设计题目:音频播放器程序的设计与实现学院名称:信息工程学院电子信息工程专业课程设计任务书正文:目录引言 (5)一、设计程序的目的与要求 (6)目的 (6)要求 (6)二、方案实现与调试 (6)总体设计 (6)1、实现功能 (6)2、功能模块图 (7)详细设计 (7)1、界面布局 (7)2、各模块功能设计 (8)2.1处理“打开”按钮 (9)2.2处理“播放”按钮 (9)2.3处理“暂停”按钮 (9)2.4处理“停止”按钮 (9)2.5处理“音量”按钮 (10)2.6处理“退出”按钮 (10)3 操作步骤 (10)三、课程设计分析与总结 (11)分析 (11)总结 (11)附录 (13)关键程序清单 (13)参考文献 (20)引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。
1.1 MFC简介MFC是Visual C++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard 向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用[1]。
1.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、目的利用VC++开发一个支持wav、mp3、wma等不同音频格式的媒体播放器。
通过课程设计掌握多媒体编程的基本原理。
2、任务1)编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息的查询与添加等;2)给出程序的总体设计和详细设计,要求程序总体架构图、详细设计的流程图,函数、变量说明等3)给出程序运行、测试的详细结果。
二、方案实现与调试总体设计1 实现功能MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。
2 功能模块图MP3播放器打开文件播放歌曲暂停播放停止播放音量控制图-1 系统功能模块图详细设计1 界面布局设计(1) 创建一个对话框类,类名为Mp3PlayerDlg。
(2) 向对话框中添加Group Box控件、Static Text控件以及按钮控件。
(3) 设置所添加的控件的属性。
系统界面的运行结果图如图-2所示。
图-2 系统界面运行结果图Mp3Player对话框中所用控件的属性描述如表-1所示。
表-1 对话框控件ID及其描述控件ID 描述IDC_STATIC_INFO_WND Group Box控件,用来显示“信息窗口”IDC_STATIC_INFO Static Text控件,用来显示各种信息IDC_STATIC_OPERATION Group Box控件,用来显示“操作面板”IDC_BUTTON_OPEN 按钮控件,单击它用来选择歌曲IDC_BUTTON_PLAY 按钮控件,单击它用来播放歌曲IDC_BUTTON_PAUSE 按钮控件,单击它用来暂停播放歌曲IDC_BUTTON_STOP 按钮控件,单击它用来停止播放歌曲IDC_BUTTON_VOLUME 按钮控件,单击它用来设定音量IDC_BUTTON_QUIT 按钮控件,单击它用来退出程序2 各模块功能设计2.1 处理“打开”按钮单击“打开”按钮后,在OnButtonOpen()函数中,首先对文件类型进行过滤,调用DoModa()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过GetFileName()函数获取文件名后,调用DisplayInfo()函数在Static Text控件上显示“你选择的歌曲是(文件名)”,然后利用GetDlgItem()函数设置“暂停”按钮以及“停止”按钮不可用。
2.2 处理“播放”按钮单击“播放”按钮后,在OnButtonPlay()函数中,通过调用MCIMP3类的MCIOpen()函数获取刚才选择的文件路径以及文件名,调用该类的MCIPlay()函数播放歌曲,此时调用DisplayInfo()函数在Static Text 控件上显示“正在播放的歌曲是(文件名)”,进行歌曲的播放,然后利用GetDlgItem()函数设置“播放”按钮不可用。
2.3 处理“暂停”按钮单击“暂停”按钮后,在OnButtonPause()函数中,首先通过调用MCIMP3类的MCIPause()函数暂停正在播放的歌曲,然后调用DisplayInfo()函数在Static Text控件上显示“暂停播放歌曲(文件名)”,此时的歌曲处于暂停时的进度上,利用GetDlgItem()函数设置“播放”按钮可用。
2.4 处理“停止”按钮单击“停止”按钮后,在OnButtonStop()函数中,首先通过调用MCIMP3类的MCIPause()函数停止正在播放的歌曲,然后调用DisplayInfo()函数在Static Text控件上显示“停止播放歌曲(文件名)”,将停止正在播放歌曲,利用GetDlgItem()函数设置“暂停”按钮和“停止”按钮不可用。
2.5 处理“音量”按钮单击“音量”按钮后,在OnButtonV olume()函数中,首先调用WinExec()函数并且打开C:/WINDOWS/System32/sndvol32.exe,弹出“主音量”对话框,在此对话框内可以对音量进行增大或减小以及静音的设置。
2.6 处理“退出”按钮单击“退出”按钮后,在OnButtonQuit()函数中,调用CDialog 类的OnCancel()函数将退出对话框,结束程序的运行。
3操作步骤1)先在VS环境下建立好一个基于对话框的工程。
2)打开资源视图,在对话框内按照布局图布局,步好后根据表-1来设置属性。
添加相应的变量和函数。
3)进行程序初始化。
4)为各个按钮添加消息处理函数,并添加相应的代码。
5)全部完成后进行测试和调试。
三、课程设计分析与总结分析按照课程设计的要求,我们用C/C++来实现功能,但由于我们在学过面向对象后,我们常用的是Visual Studio 2010版本的VS编辑器。
在分析所要做的播放器时,想到的最基本的功能就是可以播放音乐,其次就是对播放过程中的操作,如:快进或快退、上一曲或下一曲、播放/暂停、音量大小、选择和添加歌曲、播放界面选择……等等功能。
但是,由于学识有限,我们在这一周的时间内没有去考虑这么多功能,所以对于这样一个播放器,还是存在很多的改进方案。
那么只有在以后的探索中慢慢来实现了。
总结经过一周的面向对象程序课程设计,我学到了很多。
在这一周的实际动手学习中,我对VC++这门课程有了更深刻的认识,掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。
这次课程设计我做了MP3播放器的设计,MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。
本次课程设计中虽然可以实现播放、暂停、停止、播放界面美化以及音量等功能,但仍然存在着放多不足,比如进度条功能没有实现、列表管理的功能以及循环播放功能始终无法实现,如果有时间一定会好好研究。
课设是辛苦劳累的,但是收获同样是巨大的,在课设中每解决一个问题,那种成就感是无法言语的,课设中第一次调试程序时出现了很多错误,其中有逻辑错误,编译能通过,运行始终无法通过,后来经过思考,进行了多次修改调试之后得到了运行结果;但是还是存在兼容性问题,电脑版本和系统以及软件的版本之间存在各种兼容性问题,因为之前在程序中几乎没见到过,所以一时不知从何处检查并改进,后来在老师的帮助下,找到了问题,结果换了台电脑,经过改正调试最终达到了目的。
像此类的问题还有很多,不过经过查询资料,咨询老师,与同学探讨最终得到了理想的程序。
此外,我还得到了一个结论,在课程设计中,老师的作用有时是不可或缺的,可以在关键时刻给我们一些重要的提示,从而方便我们解决各种问题。
这就是我对这次软件课程设计的总结。
附录关键程序清单BOOL CMp3PlayerDlg::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 icon// TODO: Add extra initialization hereDisplayInfo(0,_T("欢迎使用Mp3Player!"),_T(""));GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);return TRUE; // return TRUE unless you set the focus to a control}void CMp3PlayerDlg::OnButtonOpen() //打开{// TODO: Add your control notification handler code herechar szFileFilter[]="All Music Files(*.*)|*.*||";CFileDialogFileOpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter/*, this*/);if( FileOpenDlg.DoModal() == IDOK ){m_csPathName = FileOpenDlg.GetPathName();m_csSongName = FileOpenDlg.GetFileName();DisplayInfo(1,_T("你选择的歌曲是:"),m_csSongName);m_bIsOpened = TRUE;m_bIsNoSelectFile = FALSE;}else{m_bIsNoSelectFile = TRUE;}if (m_bIsOpened && m_mcimp3.MCIIsPlaying()){m_mcimp3.MCIClose();m_mcimp3.MCIStop();}if (m_bIsOpened && m_mcimp3.MCIIsPlaying()&& m_bIsNoSelectFile){m_mcimp3.MCIResume();}if (m_bIsOpened && m_bIsPressPauseBtn){m_bIsPauseOpen = TRUE;}BOOL bIsPlayBtnEnabled = GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled();if (!bIsPlayBtnEnabled){GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE);}}void CMp3PlayerDlg::OnButtonPlay() //播放{// TODO: Add your control notification handler code hereif (m_bIsPauseOpen){if (m_bIsNoSelectFile){m_mcimp3.MCIResume();DisplayInfo(1,_T("继续播放歌曲:"),m_csSongName);m_bIsPressPauseBtn = FALSE;}else{m_mcimp3.MCIOpen(m_csPathName);m_mcimp3.MCIPlay();DisplayInfo(1,_T("正在播放的歌曲是:"),m_csSongName);GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE);m_bIsNoSelectFile = TRUE;}}else if (m_bIsOpened && m_bIsPressPauseBtn){m_mcimp3.MCIPlay();DisplayInfo(1,_T("继续播放歌曲:"),m_csSongName);m_bIsPressPauseBtn = FALSE;GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE);}else{if (m_bIsNoSelectFile){DisplayInfo(0,_T("你还没有选择歌曲,点击播放没有意义!"),_T(""));return;}m_mcimp3.MCIOpen(m_csPathName);m_mcimp3.MCIGetLength(&m_dwLen);m_mcimp3.MCIPlay();SetTimer(1, 1000, NULL);DisplayInfo(1,_T("正在播放的歌曲是:"),m_csSongName);m_bIsPressStopBtn = FALSE;GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(FALSE);}BOOL bIsPauseBtnEnabled = GetDlgItem(IDC_BUTTON_PAUSE)->IsWindowEnabled();if (!bIsPauseBtnEnabled){GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(TRUE);}BOOL bIsStopBtnEnabled = GetDlgItem(IDC_BUTTON_STOP)->IsWindowEnabled();if (!bIsStopBtnEnabled){GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);}}void CMp3PlayerDlg::OnButtonPause() //暂停{// TODO: Add your control notification handler code hereBOOL bIsPlaying = m_mcimp3.MCIIsPlaying();if (bIsPlaying){m_mcimp3.MCIPause();DisplayInfo(1,_T("暂停播放歌曲:"),m_csSongName);m_bIsPressPauseBtn = TRUE;}BOOL bIsPlayBtnEnabled = GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled();if (!bIsPlayBtnEnabled){GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE);}}void CMp3PlayerDlg::OnButtonStop() //停止{// TODO: Add your control notification handler code hereif (m_mcimp3.MCIStop()==0) //停止播放{m_bIsPressStopBtn = TRUE;m_bIsPressPauseBtn = FALSE;GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);DisplayInfo(1,_T("停止播放歌曲:"),m_csSongName);m_mcimp3.MCIClose();GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);}BOOL bIsPlayBtnEnabled = GetDlgItem(IDC_BUTTON_PLAY)->IsWindowEnabled();if (!bIsPlayBtnEnabled){GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow(TRUE);}}void CMp3PlayerDlg::OnButtonQuit() //退出{// TODO: Add your control notification handler code hereCDialog::OnCancel();}void CMp3PlayerDlg::OnButtonV olume() //音量{// TODO: Add your control notification handler code hereWinExec( "C:\\WINDOWS\\System32\\sndvol32.exe", SW_NORMAL );}void CMp3PlayerDlg::DisplayInfo(bool bOPInfo,CString csInfo,CString csSongName){if (!bOPInfo){m_csInfo = csInfo;}else{m_csInfo = csInfo;m_csInfo += csSongName;}GetDlgItem(IDC_STATIC_INFO)->SetWindowText(m_csInfo);}void CMp3PlayerDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif ( nIDEvent == 1){if ( 0 == m_dwLen ){KillTimer(1);DisplayInfo(1,_T("已经播放完歌曲:"),m_csSongName);GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);return;}m_dwLen--;}CDialog::OnTimer(nIDEvent);}参考文献[1] 黄维通.Visual C++面向对象编程教程.第三版.北京:清华大学出版社,2011[2] 侯俊杰.深入浅出MFC.第2版.广东:南方出版社,2007[3] 严华峰等.Visual C++课程设计案例精编.北京:中国水利水电出版社,2004[4] 王维玉等.Visual C++高级编程技术精粹.北京:科学出版社,2008[5]陈国建等.Visual C++范例开发大全.北京:清华大学出版社,2010。