播放wav文件,需要注意什么?

中才德创 2010-06-15 07:17:35
以下代码能播放wav文件了,但没加try catch,会不会有问题?

大家不妨说说个人的观点,谢谢!

//.h
#include <MMSystem.h> //附加依赖库Winmm.lib

CButton m_btnPlay1;
CButton m_btnStop1;
CString m_strWavFile1;
bool m_bIsPlaying1;
MCIDEVICEID m_dwSoundDeviceID1;
afx_msg void OnBnClickedPlay1();
afx_msg void OnBnClickedStop1();
afx_msg LRESULT OnPlayFinish(WPARAM wParam, LPARAM lParam);

CButton m_btnPlay2;
CButton m_btnStop2;
CString m_strWavFile2;
bool m_bIsPlaying2;
MCIDEVICEID m_dwSoundDeviceID2;
afx_msg void OnBnClickedPlay2();
afx_msg void OnBnClickedStop2();

CButton m_btnPlay3;
CButton m_btnStop3;
CString m_strWavFile3;
bool m_bIsPlaying3;
MCIDEVICEID m_dwSoundDeviceID3;
afx_msg void OnBnClickedPlay3();
afx_msg void OnBnClickedStop3();

//.cpp
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
//add begin
, m_strWavFile1(_T(""))
, m_dwSoundDeviceID1(0)
, m_bIsPlaying1(false)
, m_strWavFile2(_T(""))
, m_dwSoundDeviceID2(0)
, m_bIsPlaying2(false)
, m_strWavFile3(_T(""))
, m_dwSoundDeviceID3(0)
, m_bIsPlaying3(false)
//add end
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//add begin
DDX_Control(pDX, IDC_PLAY1, m_btnPlay1);
DDX_Control(pDX, IDC_STOP1, m_btnStop1);
DDX_Control(pDX, IDC_PLAY2, m_btnPlay2);
DDX_Control(pDX, IDC_STOP2, m_btnStop2);
DDX_Control(pDX, IDC_PLAY3, m_btnPlay3);
DDX_Control(pDX, IDC_STOP3, m_btnStop3);
//add end
}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
//add begin
ON_BN_CLICKED(IDC_PLAY1, &CTestDlg::OnBnClickedPlay1)
ON_BN_CLICKED(IDC_STOP1, &CTestDlg::OnBnClickedStop1)
ON_MESSAGE(MM_MCINOTIFY, OnPlayFinish)
ON_BN_CLICKED(IDC_PLAY2, &CTestDlg::OnBnClickedPlay2)
ON_BN_CLICKED(IDC_STOP2, &CTestDlg::OnBnClickedStop2)
ON_BN_CLICKED(IDC_PLAY3, &CTestDlg::OnBnClickedPlay3)
ON_BN_CLICKED(IDC_STOP3, &CTestDlg::OnBnClickedStop3)
//add end
END_MESSAGE_MAP()


// CTestDlg 消息处理程序

BOOL CTestDlg::OnInitDialog()
{
// ...
// TODO: 在此添加额外的初始化代码
//add begin
m_strWavFile1 = ".\\cow.wav";
m_btnPlay1.EnableWindow(TRUE);
m_btnStop1.EnableWindow(FALSE);
m_strWavFile2 = ".\\gameover.wav";
m_btnPlay2.EnableWindow(TRUE);
m_btnStop2.EnableWindow(FALSE);
m_strWavFile3 = ".\\hurry.wav";
m_btnPlay3.EnableWindow(TRUE);
m_btnStop3.EnableWindow(FALSE);
//add end

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

//add begin
void CTestDlg::OnBnClickedPlay1()
{
// TODO: 在此添加控件通知处理程序代码
MCI_OPEN_PARMS mciopenparams;
MCI_PLAY_PARMS mciplayparams;
ZeroMemory(&mciopenparams, sizeof(mciopenparams));
ZeroMemory(&mciplayparams, sizeof(mciplayparams));

mciopenparams.lpstrElementName = m_strWavFile1;
mciopenparams.lpstrDeviceType = NULL;
mciopenparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();

MCIERROR err = ::mciSendCommand(0, MCI_OPEN, MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD_PTR)&mciopenparams);
if (0 == err)
{
//open文件成功
m_dwSoundDeviceID1 = mciopenparams.wDeviceID;
mciplayparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();
::mciSendCommand(m_dwSoundDeviceID1, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciplayparams);
m_bIsPlaying1 = true;
m_btnPlay1.EnableWindow(FALSE);
m_btnStop1.EnableWindow(TRUE);
}
else
{
//open文件失败
char buf[MAXERRORLENGTH] = {0};
::mciGetErrorString(err, buf, MAXERRORLENGTH);
if (MCIERR_DEVICE_OPEN == err)
{
return;
}
else
{
MessageBox("Failed to open the audio file");
}
}
}

void CTestDlg::OnBnClickedStop1()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bIsPlaying1)
{
m_btnPlay1.EnableWindow(TRUE);
m_btnStop1.EnableWindow(FALSE);
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID1, MCI_CLOSE, 0, NULL);
m_bIsPlaying1 = false;
}
}

LRESULT CTestDlg::OnPlayFinish(WPARAM wParam, LPARAM lParam)
{
WPARAM wFlags = wParam;
LONG lDevID = (LONG)lParam;

if (MCI_NOTIFY_SUCCESSFUL == wParam)
{
if (m_bIsPlaying1 && (m_dwSoundDeviceID1==lDevID))
{
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID1, MCI_CLOSE, 0, NULL);
m_bIsPlaying1 = false;
m_btnPlay1.EnableWindow(TRUE);
m_btnStop1.EnableWindow(FALSE);
m_dwSoundDeviceID1 = 0;
}

if (m_bIsPlaying2 && (m_dwSoundDeviceID2==lDevID))
{
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID2, MCI_CLOSE, 0, NULL);
m_bIsPlaying2 = false;
m_btnPlay2.EnableWindow(TRUE);
m_btnStop2.EnableWindow(FALSE);
m_dwSoundDeviceID2 = 0;
}

if (m_bIsPlaying3 && (m_dwSoundDeviceID3==lDevID))
{
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID3, MCI_CLOSE, 0, NULL);
m_bIsPlaying3 = false;
m_btnPlay3.EnableWindow(TRUE);
m_btnStop3.EnableWindow(FALSE);
m_dwSoundDeviceID3 = 0;
}
}

return 0;
}

void CTestDlg::OnBnClickedPlay2()
{
// TODO: 在此添加控件通知处理程序代码
MCI_OPEN_PARMS mciopenparams;
MCI_PLAY_PARMS mciplayparams;
ZeroMemory(&mciopenparams, sizeof(mciopenparams));
ZeroMemory(&mciplayparams, sizeof(mciplayparams));

mciopenparams.lpstrElementName = m_strWavFile2;
mciopenparams.lpstrDeviceType = NULL;
mciopenparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();

MCIERROR err = ::mciSendCommand(0, MCI_OPEN, MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD_PTR)&mciopenparams);
if (0 == err)
{
//open文件成功
m_dwSoundDeviceID2 = mciopenparams.wDeviceID;
mciplayparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();
::mciSendCommand(m_dwSoundDeviceID2, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciplayparams);
m_bIsPlaying2 = true;
m_btnPlay2.EnableWindow(FALSE);
m_btnStop2.EnableWindow(TRUE);
}
else
{
//open文件失败
char buf[MAXERRORLENGTH] = {0};
::mciGetErrorString(err, buf, MAXERRORLENGTH);
if (MCIERR_DEVICE_OPEN == err)
{
return;
}
else
{
MessageBox("Failed to open the audio file");
}
}
}

void CTestDlg::OnBnClickedStop2()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bIsPlaying2)
{
m_btnPlay2.EnableWindow(TRUE);
m_btnStop2.EnableWindow(FALSE);
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID2, MCI_CLOSE, 0, NULL);
m_bIsPlaying2 = false;
}
}

void CTestDlg::OnBnClickedPlay3()
{
// TODO: 在此添加控件通知处理程序代码
MCI_OPEN_PARMS mciopenparams;
MCI_PLAY_PARMS mciplayparams;
ZeroMemory(&mciopenparams, sizeof(mciopenparams));
ZeroMemory(&mciplayparams, sizeof(mciplayparams));

mciopenparams.lpstrElementName = m_strWavFile3;
mciopenparams.lpstrDeviceType = NULL;
mciopenparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();

MCIERROR err = ::mciSendCommand(0, MCI_OPEN, MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD_PTR)&mciopenparams);
if (0 == err)
{
//open文件成功
m_dwSoundDeviceID3 = mciopenparams.wDeviceID;
mciplayparams.dwCallback = (DWORD_PTR)this->GetSafeHwnd();
::mciSendCommand(m_dwSoundDeviceID3, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciplayparams);
m_bIsPlaying3 = true;
m_btnPlay3.EnableWindow(FALSE);
m_btnStop3.EnableWindow(TRUE);
}
else
{
//open文件失败
char buf[MAXERRORLENGTH] = {0};
::mciGetErrorString(err, buf, MAXERRORLENGTH);
if (MCIERR_DEVICE_OPEN == err)
{
return;
}
else
{
MessageBox("Failed to open the audio file");
}
}
}

void CTestDlg::OnBnClickedStop3()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bIsPlaying3)
{
m_btnPlay3.EnableWindow(TRUE);
m_btnStop3.EnableWindow(FALSE);
MCIERROR err = ::mciSendCommand(m_dwSoundDeviceID3, MCI_CLOSE, 0, NULL);
m_bIsPlaying3 = false;
}
}
//add end


...全文
116 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2010-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhangkui 的回复:]
需要注意的是 此文件是不是真正的wav文件
是不是别人直接改了后缀名而来的
[/Quote]MessageBox("Failed to open the audio file");会走到这。
sharp0309 2010-06-15
  • 打赏
  • 举报
回复
不能保证不会出错哦~~!!
周药师 2010-06-15
  • 打赏
  • 举报
回复
需要注意的是 此文件是不是真正的wav文件
是不是别人直接改了后缀名而来的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧