null简易音乐播放器简易音乐播放器null使用第三方库使用音频引擎FMOD,FMOD可以在如下网址下载:
http://www.fmod.org/index.php/download
本次使用的是Windows 32bit版本,4.30.00
下载完成后,安装到某个目录之下。
使用前,要先配置相关的头文件和库文件。null使用第三方库在Tools->Options->Projects and Solutions->VC++ Directories->Show directories for:
分别填入路径,如:
Include files的路径是:f:\develop\FMOD Programmers API Win32\api\inc\
Library files的路径是:f:\develop\FMOD Programmers API Win32\api\lib\null使用第三方库当要使用第三方库时,要添加依赖项,添加方法如下:
项目->右键->Properties->Configuration Properties->Linker->Input->Additional Dependencies,在其中填入库文件的名称,如:
fmodex_vc.lib
并且在相应的代码中include相应的头文件,如:
#include
null创建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( &mSystem );
mSystem->init( 200, FMOD_INIT_NORMAL, 0 );
mSound = NULL;
mChannel = NULL;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}null// MusicPlayerDlg.h中
// 为class CMusicPlayerDlg添加一个成员
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
声明:
// 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, &mSound );
mSystem->playSound( FMOD_CHANNEL_FREE, mSound, false, &mChannel );
}null为对话框添加一个Button,并且把其Caption改为“Play 01.mp3”。把一首音乐文件改名为01.mp3后,复制到MusicPlay项目所在的目录下。
双击Play 01.mp3,添加单击响应。
// MusicPlayerDlg.cpp中
void CMusicPlayerDlg::OnBnClickedButtonPlayonemusic()
{
PlayMusic( "01.mp3" );
}运行,并且点击一下按钮。null添加一个List Box和一个Button,并且对着控件->右键->属性,修改其属性值。
修改完的值如
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
所示:null右键List Box->Add Variable,设置如下:
Category:Control
Variable name:mListBoxMusicsnull双击名为"Add Music"的Button,添加单击响应:
// MusicPlayerDlg.cpp中
void CMusicPlayerDlg::OnBnClickedButtonAdd()
{
mListBoxMusics.AddString(_T("01.mp3"));
}
尝试运行,单击按钮我们的目的:
1、点击Add Music
2、弹出一个打开文件对话框
3、选中文件
4、添加到List Box中去(List Box记录文件的完整路径名)null打开或者保存文件对话框可以用
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);null修改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文件nullList Box->右键->属性->事件->LBN_DBCLICK
添加双击响应事件,当用户双击List Box的音乐文件名时,就播放相应的音乐。
编写响应函数。nullvoid 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 cstyleFileName[MAX_PATH];
WideCharToMultiByte( // 从宽字符到char的转化
CP_ACP, // 转换成ANSI码
0, // 默认为0的标志
fileName.GetBuffer(0), // 原宽字符串
fileName.GetLength()+1, // 字条串长度
cstyleFileName, // 目标的char字符串
MAX_PATH, // 目标字符串最大长度
NULL, // 空
NULL); // 空
PlayMusic( cstyleFileName );// 播放音乐
}null添加一个进度条Process Control,来控制音乐的播放进度。修改进度条属性右键进度条,添加变量nullProcess Control->右键->属性->事件响应
添加NM_RELEASEDCAPTURE响应,表示拖动进度条,松开时的响应。
进度条用来控件音乐的播放进度。null// 编写进度条松开响应函数
// 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, &mChannel );
unsigned int maxLength;
mSound->getLength( &maxLength, FMOD_TIMEUNIT_MS );
mProcess.SetRange( 0, maxLength );null运行,播放一首音乐,并且尝试拖动滑动条。顺利的话,可以发现拖动滑动条,可以改变音乐的当前位置。
但是,音乐播放时,滑动条不会动,如何让滑动条跟着音乐也动起来?null可以使用“定时器”函数,定时器是一个函数,但是它每隔一定的时间间隔就执行一次,这个时间间隔可以由我们自已来指定。
添加“定时器”的方法如下:对着对话框->右键->属性->消息->WM_TIMER-> OnTimernull编译器会跳到一个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( &curPosition, FMOD_TIMEUNIT_MS );
// 设置滑动条的位置
mProcess.SetPos( curPosition );
}
CDialog::OnTimer(nIDEvent);
}null当然,必须要启动定时器才行
// 修改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, &mSound );
mSystem->playSound( FMOD_CHANNEL_FREE, mSound, false, &mChannel );
unsigned int maxLength;
mSound->getLength( &maxLength, FMOD_TIMEUNIT_MS );
mProcess.SetRange( 0, maxLength );
// 杀死以前的定时器
KillTimer( 0 );
// 重新开一个定时器
SetTimer( 0, 1000, NULL );
}null尝试运行,并且播放音乐。
如何能够显示当前播放的时间进度?null添加一个Static Text。
设置属性
添加变量null// MusicPlayerDlg.cpp中
// 修改OnTimer函数
void CMusicPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
if( mChannel != NULL )
{
// 获得音乐当前播放的位置,单位毫秒
unsigned int curPosition;
mChannel->getPosition( &curPosition, FMOD_TIMEUNIT_MS );
// 设置滑动条的位置
mProcess.SetPos( curPosition );
unsigned int second = curPosition/1000%60;
unsigned int minute = curPosition/1000/60%60;
CString strTime;
strTime.Format( _T("%d:%d"), minute, second );
mStaticTime.SetWindowText( strTime );
}
CDialog::OnTimer(nIDEvent);
}运行……null一个播放器应该有“播放”、“暂停”、“停止”、"下一首"、“上一首”按钮null为每个按钮添加响应。
// MusicPlayerDlg.cpp中
// 播放音乐
void CMusicPlayerDlg::OnBnClickedButtonPlay()
{
if( mChannel != NULL )
mChannel->setPaused( false );
}
// 暂停音乐
void CMusicPlayerDlg::OnBnClickedButtonPause()
{
if( mChannel != NULL )
mChannel->setPaused( true );
}
// 停止音乐
void CMusicPlayerDlg::OnBnClickedButtonStop()
{
if( mChannel != NULL )
mChannel->stop();
}null// 下一首
void CMusicPlayerDlg::OnBnClickedButtonNext()
{
int index = mListBoxMusics.GetCurSel();
if( index == -1 || index + 1 >= mListBoxMusics.GetCount() )
return;
index++;
CString fileName;
mListBoxMusics.GetText( index, fileName );
mListBoxMusics.SetCurSel( index );
// 转化成char*字符串
char cstyleFileName[MAX_PATH];
WideCharToMultiByte( // 从宽字符到char的转化
CP_ACP, // 转换成ANSI码
0, // 默认为0的标志
fileName.GetBuffer(0), // 原宽字符串
fileName.GetLength()+1, // 字条串长度
cstyleFileName, // 目标的char字符串
MAX_PATH, // 目标字符串最大长度
NULL, // 空
NULL); // 空
PlayMusic( cstyleFileName );// 播放音乐
}null// 上一首
void CMusicPlayerDlg::OnBnClickedButtonPreview()
{
……自己完成
}音乐播放器的功能还有保存列表、载入列表的功能。可以尝试自已完成。另外,列表中的字符串是完整的文件路径,非常难看,有什么
办法
鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载
可以只在列表中只显示文件名,但又可以播放到相应的文件呢?
提示:可以使用std::map来实现。
std::map的具体用法可以自已查找。