mciSendCommand 音频播放
MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。
//打开音频文件
bool OpenSoundFile(const QString & strFilePath)
{
musicClose();
//打开
MCI_OPEN_PARMS mciopenparms;
WCHAR wsz[64];
swprintf(wsz, L"%S", strFilePath.toStdString().c_str());
LPCWSTR m_szFilename = wsz;
//(LPCWSTR)strFilePath.toStdString().c_str();//播放路径,文件为mid格式
mciopenparms.lpstrElementName = m_szFilename;
//文件类型
mciopenparms.lpstrDeviceType = NULL;
//向MCI设备发送命令消息MCI_DEVTYPE_WAVEFORM_AUDIO
MCIERROR ret = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT,
(DWORD)(LPVOID)&mciopenparms);
if (ret != 0)
{
printError(ret);
return false;
}
MCI_SET_PARMS mciSet;
//设置时间单位为毫秒
mciSet.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
ret = mciSendCommand(m_wIDDevioce, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&mciSet);
if (ret != 0)
{
printError(ret);
return false;
}
m_wIDDevioce = mciopenparms.wDeviceID;
return true;
}
//播放
bool MCIPlay()
{
if (m_wIDDevioce < 0)
{
return false;
}
//播放
MCI_PLAY_PARMS mciplayparms;
mciplayparms.dwCallback = (DWORD)m_hwnd;
mciplayparms.dwFrom = 0;
MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)(LPVOID)& mciplayparms);
if (ret != 0)
{
printError(ret);
return false;
}
return true;
}
//暂停和继续播放的切换
bool changeSoundStatus(bool bPause)
{
if (m_wIDDevioce < 0)
{
return false;
}
if (bPause)
{
//暂停
MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PAUSE, 0, NULL);
if (0 != ret)
{
printError(ret);
return false;
}
}
else
{
MCI_PLAY_PARMS mciplayparms;
mciplayparms.dwCallback = (DWORD)m_hwnd;
//继续播放
MCIERROR ret = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)& mciplayparms);
if (0 != ret)
{
printError(ret);
return false;
}
}
return true;
}
//音频长度
DWORD getMusicLength()
{
if (m_wIDDevioce < 0)
{
return false;
}
MCI_STATUS_PARMS mciStatus;
mciStatus.dwItem = MCI_STATUS_LENGTH;
DWORD staReturn = mciSendCommand(m_wIDDevioce, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus);
//音频总时间
DWORD music_alltime = mciStatus.dwReturn / 1000;
return music_alltime;
}
//获取音频当前播放的时间
DWORD getMusicPos()
{
if (m_wIDDevioce < 0)
{
return false;
}
MCI_STATUS_PARMS mciStatus;
mciStatus.dwItem = MCI_STATUS_POSITION;
DWORD sta1Return = mciSendCommand(m_wIDDevioce, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus);
//当前播放时间
DWORD music_timeing = mciStatus.dwReturn / 1000;
if (sta1Return != 0)
{
printError(sta1Return);
return 0;
}
return music_timeing;
}
//指定从多少时间开始播放
bool setMusicPos(DWORD dwPos)
{
if (m_wIDDevioce < 0)
{
return false;
}
MCI_PLAY_PARMS PlayParms;
// 指定从什么地方(时间)播放
PlayParms.dwFrom = dwPos * 1000;
DWORD ret1 = mciSendCommand(m_wIDDevioce, MCI_PLAY, MCI_FROM , (DWORD)(LPVOID)&PlayParms);
if (0 != ret1)
{
printError(ret1);
return false;
}
return true;
}
//关闭音频播放
bool CPlayWnd::musicClose()
{
if (m_wIDDevioce < 0)
{
return false;
}
DWORD retclose = mciSendCommand(m_wIDDevioce, MCI_CLOSE, NULL, NULL);
if (0 != retclose)
{
printError(retclose);
return false;
}
return true;
}
//改变音量大小
DWORD setVolume(DWORD dwVol)
{
if (m_wIDDevioce < 0)
{
return false;
}
MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;
mciSetAudioPara.dwCallback = NULL;
mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;
//音量大小 (0--1000)
mciSetAudioPara.dwValue = dwVol;
DWORD dwReturn = mciSendCommand(m_wIDDevioce, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD)(LPVOID)&mciSetAudioPara);
return dwReturn;
}