如何停止播放的Wave文件 [英] how to stop a playing wave file
本文介绍了如何停止播放的Wave文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以播放.wav文件,但是当我们要使用waveOutReset()停止该文件时,应用程序将挂起或崩溃.
我正在尝试通过以下代码进行操作:
Hi,
I am able to play a .wav file, but when we want to stop that file using waveOutReset() then application is hanging or crashes.
I am trying through this code as follows:
CPlayWave::CPlayWave()
{
m_PlayWaveOut=0;
}
CPlayWave::~CPlayWave()
{
}
///////////////////////////////////////////////////////////////////////////////////////////////
void CPlayWave::SetFormat()
{
}
BOOL CPlayWave::ReadWaveFile(LPSTR pszFileName)
{
hmmio = mmioOpen(pszFileName,0,MMIO_READ);
if(!hmmio)
{
AfxMessageBox("unable to open the file");
return FALSE;
}
//find parent chunk
MckInfoParent.fccType = mmioFOURCC('W','A','V','E');
mRes = mmioDescend(hmmio,&MckInfoParent,0,MMIO_FINDRIFF);
ASSERT(mRes == MMSYSERR_NOERROR );
if(mRes != MMSYSERR_NOERROR)
return FALSE;
//find child chunk
MckInfoChild.ckid = mmioFOURCC('f','m','t',' ');
mRes = mmioDescend(hmmio,&MckInfoChild,&MckInfoParent,MMIO_FINDCHUNK);
ASSERT(mRes == MMSYSERR_NOERROR );
if ( mRes != MMSYSERR_NOERROR )
return FALSE;
//READ WAVE FILE FORMAT
LONG lByteFormat = mmioRead(hmmio,(LPSTR)&WaveRecord,MckInfoChild.cksize);
if(lByteFormat == 0)
return FALSE;
//move to parent chunk
mRes = mmioAscend(hmmio,&MckInfoChild,0);
ASSERT(mRes == MMSYSERR_NOERROR);
if(mRes != MMSYSERR_NOERROR)
return FALSE;
//Find Data Chunk
MckDataInfo.ckid = mmioFOURCC ( 'd', 'a', 't', 'a' ) ;
mRes = mmioDescend ( hmmio, &MckDataInfo, &MckInfoParent, MMIO_FINDCHUNK );
ASSERT(mRes == MMSYSERR_NOERROR );
if (mRes != MMSYSERR_NOERROR )
return FALSE;
//Get Data Chunk
datasize = MckDataInfo.cksize;
//LPSTR pWaveDataBlock;
pWaveDataBlock = new char[datasize];
LONG lByteRead = mmioRead(hmmio,pWaveDataBlock,datasize);
ASSERT(lByteRead == (long)datasize);
mmioClose(hmmio,0);
}
WAVEHDR* CPlayWave::WavePlay(bool loop)
{
if(waveOutOpen(&m_PlayWaveOut, WAVE_MAPPER, &WaveRecord, (DWORD)waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
{
AfxMessageBox("unable to open the device");
}
//prepare WaveHeader
m_pWaveHdr = new WAVEHDR;
ZeroMemory((void*) m_pWaveHdr, sizeof(WAVEHDR));
m_pWaveHdr->lpData = pWaveDataBlock;
m_pWaveHdr->dwBufferLength = datasize;
//m_pWaveHdr->dwFlags = 0;
m_pWaveHdr->dwUser = (DWORD)loop;
//mRes = waveOutPrepareHeader(m_PlayWaveOut,m_pWaveHdr, sizeof( WAVEHDR));
//
if(waveOutPrepareHeader(m_PlayWaveOut,m_pWaveHdr, sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
return NULL;
//startplayback
if( waveOutWrite(m_PlayWaveOut,m_pWaveHdr,sizeof( WAVEHDR))!=MMSYSERR_NOERROR)
return NULL;
m_bPlay = TRUE;
m_bPause = FALSE;
return m_pWaveHdr;
}
void CPlayWave::waveOutProc(HWAVEOUT m_PlayWaveOut,UINT uMsg ,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
//MMRESULT mmRes;
switch(uMsg)
{
case WOM_DONE: //playback finished
WAVEHDR * m_pWaveHdr = (WAVEHDR*)dwParam1;
if(m_pWaveHdr->dwUser)
waveOutWrite(m_PlayWaveOut,m_pWaveHdr,sizeof( WAVEHDR));
else
{
waveOutUnprepareHeader(m_PlayWaveOut, m_pWaveHdr, sizeof(WAVEHDR));
delete m_pWaveHdr ;
}
break;
}
}
BOOL CPlayWave::Pause()
{
if(m_bPlay)
{
mRes = waveOutPause(m_PlayWaveOut);
if(mRes!=MMSYSERR_NOERROR)
{
switch(mRes)
{
case MMSYSERR_INVALHANDLE:
AfxMessageBox("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
AfxMessageBox("No device driver is present.");
break;
case MMSYSERR_NOMEM:
AfxMessageBox("Unable to allocate or lock memory.");
break;
case MMSYSERR_INVALPARAM:
AfxMessageBox("Invalid Parameter Passed");
break;
case MMSYSERR_NOTSUPPORTED:
AfxMessageBox("Specified device is synchronous and does not support pausing.");
break;
default:
AfxMessageBox("Unspecified Error");
break;
}
m_bPause = FALSE;
return FALSE;
}
else
{
m_bPause = TRUE;
m_bPlay = FALSE;
return TRUE;
}
}
else
{
if(m_bPause)
{
mRes = waveOutRestart(m_PlayWaveOut);
if(mRes!=MMSYSERR_NOERROR)
{
switch(mRes)
{
case MMSYSERR_INVALHANDLE:
AfxMessageBox("Specified device handle is invalid.");
break;
case MMSYSERR_NODRIVER:
AfxMessageBox("No device driver is present.");
break;
case MMSYSERR_NOMEM:
AfxMessageBox("Unable to allocate or lock memory.");
break;
case MMSYSERR_INVALPARAM:
AfxMessageBox("Invalid Parameter Passed");
break;
case MMSYSERR_NOTSUPPORTED:
AfxMessageBox("Specified device is synchronous and does not support pausing.");
break;
default:
AfxMessageBox("Unspecified Error");
break;
}
m_bPause = FALSE;
return FALSE;
}
else
{
m_bPause = FALSE;
m_bPlay = TRUE;
return TRUE;
}
}
else
{
return FALSE;
}
}
}
void CPlayWave::StopPlay()
{
if(m_pWaveHdr)
m_pWaveHdr->dwUser= (DWORD)false;
mRes = waveOutReset(m_PlayWaveOut);
}
请帮帮我.
谢谢和问候,
rammohan
Please help me.
Thanks and regards,
rammohan
推荐答案
请尝试以下方法:
mmioClose(hmmio, 0);
http://msdn.microsoft.com/zh-CN /library/windows/desktop/dd757316(v=vs.85).aspx [
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757316(v=vs.85).aspx[^]
Good luck!
这篇关于如何停止播放的Wave文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文