level 7
MFC音频播放器代码没错,为什么播放不出声音呢?求解释
2013年11月03日 14点11分
1
level 7
//自定义全局变量
HWND m_hwnd; //定义当前窗口句柄
DWORD DeviceID; //指定播放音乐的设备ID
MCI_OPEN_PARMS mciopenparms; //指定打开音乐文件的参数
void Load(HWND hWnd,CString strFilepath)
{
m_hwnd=hWnd;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);
mciopenparms.lpstrElementName=strFilepath;
DWORD dwReturn;
if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms))
{
//如果打开文件失败,则将出错信息存储在buffer中,并显示出错警告
char buffer[256];
mciGetErrorString(dwReturn,buffer,256);
MessageBox(hWnd,buffer,"出错警告!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);
}
DeviceID=mciopenparms.wDeviceID;
//打开文件成功则关联到文件设备
}
void play()
{
MCI_PLAY_PARMS mciplayparms;
mciplayparms.dwCallback=(DWORD)m_hwnd;//
mciplayparms.dwFrom=0;//每一次播放都从0开始
mciSendCommand(DeviceID,MCI_FROM,MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);
}
void pasue()
{
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
}
void resume()
{
mciSendCommand(DeviceID,MCI_RESUME,0,0);
}
void stop()
{
mciSendCommand(DeviceID,MCI_STOP,0,0);
mciSendCommand(DeviceID,MCI_CLOSE,0,0);
//当点击停止按钮时,将所有的信息清空
}
DWORD setvolume(DWORD vol)
{
MCI_DGV_SETAUDIO_PARMS setvolume;//设置音量参数
setvolume.dwCallback=NULL;
setvolume.dwItem=MCI_DGV_SETAUDIO_VOLUME;//动作时设置音量
setvolume.dwValue=0;//音量只为vol
mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VOLUME,(DWORD)(LPVOID)&setvolume);
return 0;
}
2013年11月06日 03点11分
5
level 7
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
m_silder.SetRange(0,1000); //设置音量范围
m_silder.SetPos(500); //初始化位置为500
GetDlgItem(IDC_PLAY)->EnableWindow(false);
GetDlgItem(IDC_PAUSE)->EnableWindow(false);
GetDlgItem(IDC_STOP)->EnableWindow(false);
void CPlayerDlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_int=m_silder.GetPos()/10;
setvolume(m_silder.GetPos());
UpdateData(false);
*pResult = 0;
}
void CPlayerDlg::OnMusicchoice()
{
// TODO: Add your control notification handler code here
char szFileFilter[]="mp3文件(*.mp3)|*.mp3|"
"wma文件(*.wma)|*.wma|"
"wav文件(*.wav)|*.wav|"
"所有文件(*.*)|*.*|";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(IDOK==dlg.DoModal())
{
CString strFilepath=dlg.GetPathName();
CString strFilename=dlg.GetFileName();
SetDlgItemText(IDC_MUSICNAME,strFilename);
Load(this->m_hWnd,strFilepath);
GetDlgItem(IDC_PLAY)->EnableWindow(true);
GetDlgItem(IDC_PAUSE)->EnableWindow(true);
GetDlgItem(IDC_STOP)->EnableWindow(true);
}
}
void CPlayerDlg::OnPlay()
{
// TODO: Add your control notification handler code here
void paly();
SetDlgItemText(IDC_PAUSE,"暂停");
}
void CPlayerDlg::OnPause()
{
// TODO: Add your control notification handler code here
CString strtemp;
GetDlgItemText(IDC_PAUSE,strtemp);//获取按键状态
if(strtemp.Compare("暂停")==0)
{
void pause();
SetDlgItemText(IDC_PAUSE,"恢复");
}
if(strtemp.Compare("恢复")==0)
{
void resume();
SetDlgItemText(IDC_PAUSE,"暂停");
}
}
void CPlayerDlg::OnStop()
{
// TODO: Add your control notification handler code here
void stop();
SetDlgItemText(IDC_PAUSE,"暂停");
GetDlgItem(IDC_PLAY)->EnableWindow(false);
GetDlgItem(IDC_PAUSE)->EnableWindow(false);
}
2013年11月06日 03点11分
6
level 5
这个很难处理的,因为这个API函数是个虚拟的环境,虚拟的环境能让用户以标准化的参数进行设计,但是,我理解到的知识是,它是建立在驱动的基础上的,也就是说windows可以把它分析成相对应硬件设备。
但是,现在的问题是,system.ini中根本就没有加载.drv。不要笑啊!我认为现在的windows根本就没有进行这些转换,极可能连这种想法都没有了。
我是个认死理的人,我试过在system.ini中的[mci]中加载这些设备,但是,失败了,一个无情的事实,这个system.ini,你无论用哪种方法进行修改,都不会成功的。我试过用记事本修改后保存,失败了。试过用sysedit这个工具修改后保存,还是失败了,。这就是不允许修改的。
我对操纵系统的理解还是不够深刻,可能有更好的看法。
我的建议是,你还用meida play这个接口吧!MFC中有这个接口,而且,就我现在所理解到的,windows7中,也只有这个多媒体接口了。
2013年11月06日 13点11分
7
还有,我还试过重装声音驱动程序。
2013年11月06日 13点11分
重装DX11。
2013年11月06日 13点11分
这件事我弄错了。我的想法是错误的。
2013年11月07日 11点11分
真的弄错了。
2013年11月07日 12点11分
level 9
就这样一直复制粘贴,不用多久,我就会升级捞经,当上小管理,出任大吧主,迎娶白富美,走上贴吧巅峰。想想还有点小激动呢
2013年11月07日 23点11分
9
level 1
楼主,我的代码跟你基本一样,也播不出来,但是其他控件都没有问题,功能可以实现,你现在的问题解决了吗,可以分享一下吗
2017年09月03日 11点09分
10
level 1
我的也是
代码:
void open(LPWSTR path, MCIDEVICEID* idd)
{
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrElementName = path;
OpenParms.wDeviceID = 0;
mciSendCommand(NULL, MCI_OPEN, MCI_WAIT, (DWORD)(LPVOID)&OpenParms);
*idd = OpenParms.wDeviceID;
}
void play(MCIDEVICEID id,DWORD pt)
{
MCI_PLAY_PARMS pp;
pp.dwCallback = NULL;
pp.dwFrom = pt;
mciSendCommand(id, MCI_PLAY, MCI_NOTIFY, (DWORD)&pp);
}
void close(MCIDEVICEID id)
{
MCI_GENERIC_PARMS gp;
gp.dwCallback = NULL;
mciSendCommand(id, MCI_CLOSE, MCI_WAIT, (DWORD)&gp);
}
void stop(MCIDEVICEID id)
{
mciSendCommand(id, MCI_STOP, MCI_WAIT, NULL);
}
2020年07月16日 03点07分
11