音乐播放器课设报告要点.docx

上传人:b****5 文档编号:8235986 上传时间:2023-01-30 格式:DOCX 页数:25 大小:462.32KB
下载 相关 举报
音乐播放器课设报告要点.docx_第1页
第1页 / 共25页
音乐播放器课设报告要点.docx_第2页
第2页 / 共25页
音乐播放器课设报告要点.docx_第3页
第3页 / 共25页
音乐播放器课设报告要点.docx_第4页
第4页 / 共25页
音乐播放器课设报告要点.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

音乐播放器课设报告要点.docx

《音乐播放器课设报告要点.docx》由会员分享,可在线阅读,更多相关《音乐播放器课设报告要点.docx(25页珍藏版)》请在冰豆网上搜索。

音乐播放器课设报告要点.docx

音乐播放器课设报告要点

音乐播放器

 

音乐播放器

1问题定义和可行性研究2

(1)问题定义3

(2)可行性研究3

2需求分析3

1功能需求3

1.1功能描述3

2性能需求4

3将来可能提出的要求4

4项目描述5

4.1编写目的5

4.2项目背景5

4.3开发工具及环境简介6

3概要设计和详细设计6

3.1概要设计6

3.2详细设计7

3.3音乐编码设计8

5主界面界面介绍9

6系统的实现11

一、主要的对话框11

二、全局变量12

三、初始化函数12

三、播放、暂停功能15

四、添加文件到播放列表18

五、下一首\上一首20

六、停止播放21

七、播放模式21

八、显示时间和播放进度22

九、删除歌曲23

5.2单元测试25

6.总结26

1问题定义和可行性研究

本章分为两部分,问题定义和可行性研究。

问题定义阶段主要研究我们所学的知识能做什么项目,而可行性研究给出了制作音乐播放器的可行性。

(1)问题定义

通过开发音乐播放器,来练习本学期软件工程课程所学知识。

熟悉软件开发的各个阶段,将书本上的知识与实践性的开发活动联系起来。

实现音乐播放器基本的功能。

(2)可行性研究

大一的时候已经学过了基本的C++编程的知识,在这个基础上,有三个星期的时间来学习MFC编程,学习文件的读写操作,以及系统API函数调用等知识。

边学边用,具备开发软件的能力。

2需求分析

本章给出了音乐播放器应该具备的功能,并给出了功能示意图,最后提出了实现该播放器应该具备的条件。

1功能需求

1.1功能描述

本播放器主要有如下功能:

1.对文件进行操作。

2.对按钮的处理

1.对文件的操作

通过文件的读写知识,实现浏览目录以选择文件,添加歌曲到播放列表,删除播放列表中的歌曲,对已经选中的文件进行播放、暂停,以及通过双击播放列表中的歌曲来播放文件。

2.对控件的处理

对各种按钮添加了事件响应函数,可以处理基本的播放,暂停,上一首/下一首,删除,选择播放模式等操作。

功能如下图:

2性能需求

本项目是一个普通的音乐播放器,运行环境为VS2010,项目运行速率正常,可以满足用户需求。

1.时间性能要求:

越低越好。

2.便捷性:

运用了可视化编程,更有助于人机交互,更人性化。

程序的运行,符合正常的操作习惯,程序功能明了简洁!

3将来可能提出的要求

(1)歌曲列表的保存

(2)菜单操作

(3)更换背景图片

(4)提供网络下载功能:

支持通过歌名和歌手名进行歌曲检索和下载功能; 

(5)支持歌词显示和同步播放;

(6)支持歌曲在线播放; 

(7)支持更友好的歌曲检索和下载功能;

(8)提供更良好的操作界面。

 

4项目描述 

4.1编写目的  

设计一个基于windows平台的音乐点播系统,实现音乐库的管理以及播放功能。

 

音乐播放器能够满足音乐的播放功能,实现一款播放器的基本功能。

4.2项目背景 

本项目作为《软件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个软件开发过程。

本次项目的旨在通过不同软件工程设计方法与技术的实践,了解和掌握各种技术、工具平台的特点与局限性,体会协同开发方式。

 

第1阶段:

主要目的是通过对项目需求的分析和理解,通过面向对象的设计方式完成项目前期的准备工作。

 

第2阶段:

我们会根据既定需求,完善设计模式。

 

第3阶段:

在设计文档和需求分析的文档下,完成音乐点播系统原型的开发,并完成整个开发流程的测试报告 

第4阶段:

通过音乐点播系统软件的设计开发,了解软件文档的编写原则,训练掌握软件各类文档写作的技巧,同时在文档的编写过程中提高和增加C++开发的能力和经验。

 

4.3开发工具及环境简介 

操作系统:

windows xp或以上版本 

C++6.0:

VisualC++是一个功能强大的可视化软件开发工具。

自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。

Microsoft Office Word 2003:

经典办公软件,本项目中用于编写文档。

3概要设计和详细设计

3.1概要设计

通过这个阶段的工作将划分出组成系统的物理元素——程序,文件和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。

总体设计的另一项重要任务是设计软件的结构,也就是要确定该软件由哪些模块组成的,以及这些模块之间的关系。

运用传统软件工程方法学的知识将音乐播放器软件的开发分成:

一、MFC的使用以及实现方法

二、文件的读写操作

三、系统API函数的调用

3.2详细设计

根据概要设计所划分的四个模块,该阶段应详细地完成这四个模块的任务:

一、MFC的实现

通过MFC窗口以及函数的使用,创建出播放器的主界面,主界面应包括文件的打开、添加、播放以及线程按键。

另外,还要各种函数应该实现相应组件上的各种事件。

二、文件读写操作的实现

通过以前的学过的文件读写操作知识,实现对音乐文件的读以及写操作。

三、系统API函数的调用

通过调用系统媒体控制接口函数实现对mp3,wav,wma等格式的音乐的播放的功能。

3.3音乐编码设计 

 一、编码原理 

 1. 音乐的十二平均率规定 

(1) 每两个八度音之间的频率相差一倍。

 

(2) 两个八度音之间又可以分为十二个伴音,每两个伴音的频率比为1.059463。

 

(3) 低音6(音名A)的频率是440Hz,音名B到C之间、E到F之间为伴音,其余为全音。

 

2. 乐谱编码 

选取65536Hz为基准频率,以此频率分频得到简谱高音各音调的分频比。

计算公式为N=65536/f。

 

 二、编码参照 

 为了让ROM能够识别各音频的分频系数,需将个音频分频系数按照一定格式转换成十六进制格式。

我们采用8位的ROM,D6D5位表示高中低音,如表1-2所示,11为高音,10为中音,01为低音;用D4D3D2D1D0位表示分频系数,将表1-1的分频系数转换成二进制格式表示;ROM的高位全部补0。

然后转换成十六进制如表1-2所示。

之所以采用高音分频比的二分之一为基准分频系数,是因为ROM的位宽限制,而每两个八度音频率相差一倍,所以我们后面用译码器译成各音频的分频系数输出给分频器,这样由分频器输出到扬声器,扬声器就可发声了。

 

5主界面界面介绍

1、界面图:

2添加歌曲按钮

3、删除歌曲按钮

4、音量的变大变小按钮

5、歌曲时间和进度的显示图像

6、下一首歌按钮

7、上一首歌按钮

8、停止播放按钮

9、播放按钮

10、单曲播放/随机播放/顺序播放按钮

11、空白部分为歌曲的菜单列表

6系统的实现

一、主要的对话框

classCMCIPlayerDlg:

publicCDialogEx

{

//构造

public:

CMCIPlayerDlg(CWnd*pParent=NULL);//标准构造函数

//对话框数据

enum{IDD=IDD_MCIPLAYER_DIALOG};

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//

DDX/DDV支持

//实现

protected:

HICONm_hIcon;

//生成的消息映射函数

virtualBOOLOnInitDialog();

afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);

afx_msgvoidOnPaint();

afx_msgHCURSOROnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

//列表

CListBoxm_list;

afx_msgvoidOnBnClickedOnstart();

afx_msgvoidOnBnClickedOnloadmusic();

voidload(musica);

intisplay;

intindex;

CSliderCtrlvolume;

afx_msgvoidOnNMCustomdrawVolun(NMHDR*pNMHDR,LRESULT

*pResult);

afx_msgvoidOnBnClickedOnnext();

afx_msgvoidOnBnClickedOnper();

afx_msgvoidOnBnClickedOnstop();

LRESULTOnMciNotify(WPARAMwParam,LPARAMlParam);//设置播放

模式

afx_msgvoidOnBnClickedOrder();

afx_msgvoidOnLbnDblClk();

voidOnTimer(UINTnIDEvent);

//进度条

CSliderCtrlm_progress;

afx_msgDWORDgetinfo(DWORDitem);

afx_msgvoidOnBnClickedDeletemusic();

};

二、全局变量

structmusic

{

stringname;

stringmPath;

};

intm_max;//进度条的最大位置变量

inthour,minute,second;//时间变量:

小时、分钟、秒钟

DWORDcdlen;//某个音频文件的总时间长度

DWORDm_count;//设备型号

DWORDcdfrom,cdto;//歌曲的起点和终点

DWORDDeviceID;

listmus;//全局歌曲链表

vectorallpath;//保存已有的歌

三、初始化函数

BOOLCMCIPlayerDlg:

:

OnInitDialog()

{

CDialogEx:

:

OnInitDialog();

//将“关于...”菜单项添加到系统菜单中。

//volume.SetBkColor(RGB(37,38,37));

HBITMAPhBitmap;

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP4));

((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP1));

((CButton*)GetDlgItem(IDC_ONPER))->SetBitmap(hBitmap);

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP2));

((CButton*)GetDlgItem(IDC_ONNEXT))->SetBitmap(hBitmap);

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP5));

((CButton*)GetDlgItem(IDC_ONSTOP))->SetBitmap(hBitmap);

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP7));

((CButton*)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);

SetBackgroundImage(IDB_BITMAP6,BACKGR_TILE,NULL);

isplay=0;//未播放状态

index=-1;

m_list.SetCurSel(0);//设置初始选择位置

volume.SetRange(0,1000);//滑块的移动范围0~1000

volume.SetPos(500);//滑块指针的初始位置设为500代表初始音

量为50

ifstreamrin;//导入原先数据

rin.open("Mylist.txt");

//intrere;

stringstr[2];

if(rin>>setw(50)>>str[0]>>setw(150)>>str[1])

while(!

rin.eof())

{

musicmu;

mu.name=str[0];

mu.mPath=str[1];

CStringname;

for(inti=0;i

{

if(mu.name[i]=='/')

mu.name[i]='';

}

name=mu.name.c_str();

CStringmPath;

for(inti=0;i

{

if(mu.mPath[i]=='/')

mu.mPath[i]='';

}

mPath=mu.mPath.c_str();

intj=m_list.GetCount();//把名字和地址插

入到list控件

m_list.InsertString(j,name);

//CString*p=&mPath;

allpath.push_back(mPath);

rin>>str[0]>>str[1];

}

rin.close();

//IDM_ABOUTBOX必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

BOOLbNameValid;

CStringstrAboutMenu;

bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,

IDM_ABOUTBOX,strAboutMenu);

}

}

//设置此对话框的图标。

当应用程序主窗口不是对话框时,框架将

自动

//执行此操作

SetIcon(m_hIcon,TRUE);//设置大图标

SetIcon(m_hIcon,FALSE);//设置小图标

//TODO:

在此添加额外的初始化代码

returnTRUE;//除非将焦点设置到控件,否则返回TRUE

}

三、播放、暂停功能

voidCMCIPlayerDlg:

:

OnBnClickedOnstart()//开始播放

{

//TODO:

在此添加控件通知处理程序代码

if(isplay==0)

{

//TODO:

在此添加控件通知处理程序代码

if(m_list.GetCurSel()==-1)//判断有没有歌曲被选中,若

没有,则从第一首开始播放-1代表没有被选中

m_list.SetCurSel(0);

if(m_list.GetCurSel()==index)

{

SetTimer(0,1000,NULL);

mciSendCommand(DeviceID,MCI_RESUME,0,0);

HBITMAPhBitmap;

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP3));

((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,"暂停");

isplay=1;

}

else

{

index=m_list.GetCurSel();

CStringdata;

//m_list.GetDlgItemTextA(index,data);

//CStringc=dat

MCI_OPEN_PARMSmciopenparms;//打开

MCI_PLAY_PARMSmciplayparms;//播放

second=0;minute=0;hour=0;

mciopenparms.lpstrElementName=allpath[index];//将音乐文件路

径传给设备

DWORDdwReturn;

if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|

MCI_WAIT,(DWORD)(LPVOID)&mciopenparms))

{

//如果打开文件失败,则将出错信息储存在buffer,并显示

出错警告

charbuffer[256];

mciGetErrorString(dwReturn,buffer,256);

MessageBox(buffer,"出错警告!

",MB_ICONHAND|

MB_ICONERROR|MB_ICONSTOP);

}

DeviceID=mciopenparms.wDeviceID;

mciopenparms.lpstrDeviceType=NULL;//文件类型

m_count=mciopenparms.wDeviceID;//多媒体设备类型编号

mciplayparms.dwFrom=0;//每次播放都是从0开始播放

HWNDhwnd=GetSafeHwnd();

mciplayparms.dwCallback=(DWORD)hwnd;

cdlen=getinfo(MCI_STATUS_LENGTH);

CStringstime;

CClientDCdc(this);

dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观

dc.SetTextColor(RGB(95,180,66));

stime.Format("%02d:

%02d:

%02d",cdlen/3600000,(cdlen

%3600000)/60000,((cdlen%3600000)%60000)/1000);//显示时间进度

dc.TextOut(328,13,stime);

mciSendCommand(DeviceID,MCI_PLAY,/*MCI_FROM|*/MCI_NOTIFY,

(DWORD)(LPVOID)&mciplayparms);

SetTimer(0,1000,NULL);//设置系统计数器,显示歌曲播放的进度

HBITMAPhBitmap;

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP3));

((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,"暂停");

isplay=1;

}

}

else

{

KillTimer(0);

mciSendCommand(DeviceID,MCI_PAUSE,0,0);

HBITMAPhBitmap;

hBitmap=LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP4));

((CButton*)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);

SetDlgItemText(IDC_ONSTART,"播放");

isplay=0;

}

}

四、添加文件到播放列表

voidCMCIPlayerDlg:

:

OnBnClickedOnloadmusic()//导入歌曲

{

//TODO:

在此添加控件通知处理程序代码

CFileDialogdlg(

TRUE,_T("*.*"),NULL,

OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,

_T("mp3文件(*.mp3)|*.mp3|"

"wma文件(*.wma)|*.wma|"

"wav文件(*.wav)|*.wav|"

"所有文件(*.*)|*.*|"),NULL

);//选项图片的约定

dlg.m_ofn.lpstrTitle=_T("打开音乐文件");//打开文件对话框

的标题名

if(dlg.DoModal()!

=IDOK)//判断是否获得图

return;

CStringmPath=dlg.GetPathName();//获取音乐路径

CStringmmpath=mPath;

allpath.push_back(mPath);

inti=mPath.ReverseFind('\\');//从磁盘地址中获取歌曲名字

CStringname;

name=mPath.Right(mPath.GetLength()-1-mPath.ReverseFind('\\'));

intj=m_list.GetCount();//把名字和地址插入到list控件

m_list.InsertString(j,name);

//m_shelllist.SetItemText(j,0,name);

musicmu;

mu.name=name.GetBuffer();

mu.mPath=mPath.GetBuffer();

load(mu);

}

voidCMCIPlayerDlg:

:

load(mus

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1