资源预览内容
第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
第9页 / 共28页
第10页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
简易音乐播放器,使用第三方库,使用音频引擎FMOD,FMOD可以在如下网址下载: http:/www.fmod.org/index.php/download 本次使用的是Windows 32bit版本,4.30.00 下载完成后,安装到某个目录之下。 使用前,要先配置相关的头文件和库文件。,使用第三方库,在Tools-Options-Projects and Solutions-VC+ Directories-Show directories for: 分别填入路径,如: Include files的路径是:f:developFMOD Programmers API Win32apiinc Library files的路径是:f:developFMOD Programmers API Win32apilib,使用第三方库,当要使用第三方库时,要添加依赖项,添加方法如下: 项目-右键-Properties-Configuration Properties-Linker-Input-Additional Dependencies,在其中填入库文件的名称,如: fmodex_vc.lib 并且在相应的代码中include相应的头文件,如: #include,创建MFC项目,1、创建一个基于对话框的项目,命名为MusicPlayer 2、在MusicPlayer.h的顶端include音频引擎的头文件: #include 3、为MusicPlayer.h添加依赖项: fmod_vc.lib 4、为class CMusicPlayerDlg添加如下的成员: FMOD:System *mSystem; FMOD:Sound *mSound; FMOD:Channel *mChannel; 5、编写音频引擎的初始化代码,/ MusicPlayerDlg.cpp中 BOOL CMusicPlayerDlg:OnInitDialog() 省略 / TODO: 在此添加额外的初始化代码 / 初始化音频引擎系统 FMOD:System_Create( / 除非将焦点设置到控件,否则返回 TRUE ,/ MusicPlayerDlg.h中 / 为class CMusicPlayerDlg添加一个成员函数声明: / filename 音乐文件路径 void PlayMusic(const char* filename); / MusicPlayerDlg.cpp中 / 定义PlayMusic函数 void CMusicPlayerDlg:PlayMusic(const char* filename) / 如果有声道正在播放,停止播放 if( mChannel != NULL ) mChannel-stop(); / 如果mSound不为空,释放mSound if( mSound != NULL ) mSound-release(); mSystem-createStream( filename, FMOD_DEFAULT, 0, ,为对话框添加一个Button,并且把其Caption改为“Play 01.mp3”。把一首音乐文件改名为01.mp3后,复制到MusicPlay项目所在的目录下。 双击Play 01.mp3,添加单击响应。 / MusicPlayerDlg.cpp中 void CMusicPlayerDlg:OnBnClickedButtonPlayonemusic() PlayMusic( “01.mp3“ ); ,运行,并且点击一下按钮。,添加一个List Box和一个Button,并且对着控件-右键-属性,修改其属性值。 修改完的值如表所示:,右键List Box-Add Variable,设置如下: Category:Control Variable name:mListBoxMusics,双击名为“Add Music“的Button,添加单击响应: / MusicPlayerDlg.cpp中 void CMusicPlayerDlg:OnBnClickedButtonAdd() mListBoxMusics.AddString(_T(“01.mp3“); 尝试运行,单击按钮,我们的目的: 1、点击Add Music 2、弹出一个打开文件对话框 3、选中文件 4、添加到List Box中去(List Box记录文件的完整路径名),打开或者保存文件对话框可以用 CFileDialog,其构造函数如下: explicit CFileDialog(BOOL bOpenFileDialog, / TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0, BOOL bVistaStyle = TRUE);,修改Add Music Button的单击响应函数 / MusicPlayerDlg.cpp中 void CMusicPlayerDlg:OnBnClickedButtonAdd() CFileDialog dlg( TRUE, / TRUE打开文件,FALSE保存文件 0, / 默认打开的文件的后缀 0, / 默认的文件名,0表示没有默认文件 4|2, / 标志,用默认的4|2就行 _T(“Music File(*.mp3)|*.mp3|“)/ 文件过滤,只保留后缀为mp3的文件 ); if( dlg.DoModal() = IDOK ) / 显示对话框 / 返回文件名 / CString fileName = dlg.GetFileName(); / 返回完整的文件路径 CString fullPath = dlg.GetPathName(); mListBoxMusics.AddString( fullPath ); ,完成后,尝试运行,并且添加mp3文件,List Box-右键-属性-事件-LBN_DBCLICK 添加双击响应事件,当用户双击List Box的音乐文件名时,就播放相应的音乐。 编写响应函数。,void CMusicPlayerDlg:OnLbnDblclkListMusics() / 得到List Box上面列表的个数,为0则表面没有音乐文件 if( mListBoxMusics.GetCount() = 0 ) return; int index = mListBoxMusics.GetCurSel(); if( index = -1 )/ index = -1表示没有选中 return; / 获得当前选中的字符串 CString fileName; mListBoxMusics.GetText( index, fileName ); / 转化成char*字符串 char cstyleFileNameMAX_PATH; WideCharToMultiByte( / 从宽字符到char的转化 CP_ACP, / 转换成ANSI码 0, / 默认为0的标志 fileName.GetBuffer(0), / 原宽字符串 fileName.GetLength()+1, / 字条串长度 cstyleFileName, / 目标的char字符串 MAX_PATH, / 目标字符串最大长度 NULL, / 空 NULL); / 空 PlayMusic( cstyleFileName );/ 播放音乐 ,添加一个进度条Process Control,来控制音乐的播放进度。,修改进度条属性,右键进度条,添加变量,Process Control-右键-属性-事件响应 添加NM_RELEASEDCAPTURE响应,表示拖动进度条,松开时的响应。 进度条用来控件音乐的播放进度。,/ 编写进度条松开响应函数 / MusicPlayerDlg.cpp中 void CMusicPlayerDlg:OnNMReleasedcaptureSliderPosition(NMHDR *pNMHDR, LRESULT *pResult) / 当声道不为空时 if( mChannel != NULL ) / 设置当前播放音乐的位置 / FMOD_TIMEUNIT_MS表示时间的单位是毫秒 mChannel-setPosition( mProcess.GetPos(), FMOD_TIMEUNIT_MS ); ,另外,必须在音乐播放前,设置好进度条的范围。,/ 在PlayMusic函数的最后,添加最后三条语句 mSystem-playSound( FMOD_CHANNEL_FREE, mSound, false, ,运行,播放一首音乐,并且尝试拖动滑动条。顺利的话,可以发现拖动滑动条,可以改变音乐的当前位置。 但是,音乐播放时,滑动条不会动,如何让滑动条跟着音乐也动起来?,可以使用“定时器”函数,定时器是一个函数,但是它每隔一定的时间间隔就执行一次,这个时间间隔可以由我们自已来指定。 添加“定时器”的方法如下:,对着对话框-右键-属性-消息-WM_TIMER- OnTimer,编译器会跳到一个OnTimer函数。OnTimer函数就是一个每隔一定时间间隔就执行一次的函数。为其添加代码如下: / MusicPlayerDlg.cpp中 void CMusicPlayerDlg:OnTimer(UINT_PTR nIDEvent) / TODO: Add your message handler code here and/or call default if( mChannel != NULL ) / 获得音乐当前播放的位置,单位毫秒 unsigned int curPosition; mChannel-getPosition( ,当然,必须要启动定时器才行 / 修改PlayMusic函数 void CMusicPlayerDlg:PlayMusic(const char* filename) / 如果有声道正在播放,停止播放 if( mChannel != NULL ) mChannel-stop(); / 如果mSound不为空,释放mSound if( mSound != NULL ) mSound-release(); mSystem-createStream( filename, FMOD_DEFAULT, 0, ,尝试运行,并且播放音乐。 如何能够显示当前播放的时间进度?,添加一个Static Text。 设置属性 添加变量,/ MusicPlayerDlg.cpp中 / 修改OnTimer函数 void CMusicPlayerDlg:OnTimer(UINT_PTR nIDEvent) if( mChannel != NULL ) / 获得音乐当前播放的位置,单位毫秒 unsigned int curPosition; mChannel-getPosition( ,运行,一个播放器应该有“播放”、“暂停”、“停止”、“下一首“、“上一首”按钮,为每个按钮添加响应。 / MusicPlayerDlg.cpp中 / 播放音乐 void CMusicPlayerDlg:OnBnClickedButtonPlay() if( mChannel != NULL ) mChannel-set
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号