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;
}
MckInfoParent.fccType = mmioFOURCC('W','A','V','E');
mRes = mmioDescend(hmmio,&MckInfoParent,0,MMIO_FINDRIFF);
ASSERT(mRes == MMSYSERR_NOERROR );
if(mRes != MMSYSERR_NOERROR)
return FALSE;
MckInfoChild.ckid = mmioFOURCC('f','m','t',' ');
mRes = mmioDescend(hmmio,&MckInfoChild,&MckInfoParent,MMIO_FINDCHUNK);
ASSERT(mRes == MMSYSERR_NOERROR );
if ( mRes != MMSYSERR_NOERROR )
return FALSE;
LONG lByteFormat = mmioRead(hmmio,(LPSTR)&WaveRecord,MckInfoChild.cksize);
if(lByteFormat == 0)
return FALSE;
mRes = mmioAscend(hmmio,&MckInfoChild,0);
ASSERT(mRes == MMSYSERR_NOERROR);
if(mRes != MMSYSERR_NOERROR)
return FALSE;
MckDataInfo.ckid = mmioFOURCC ( 'd', 'a', 't', 'a' ) ;
mRes = mmioDescend ( hmmio, &MckDataInfo, &MckInfoParent, MMIO_FINDCHUNK );
ASSERT(mRes == MMSYSERR_NOERROR );
if (mRes != MMSYSERR_NOERROR )
return FALSE;
datasize = MckDataInfo.cksize;
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");
}
m_pWaveHdr = new WAVEHDR;
ZeroMemory((void*) m_pWaveHdr, sizeof(WAVEHDR));
m_pWaveHdr->lpData = pWaveDataBlock;
m_pWaveHdr->dwBufferLength = datasize;
m_pWaveHdr->dwUser = (DWORD)loop;
if(waveOutPrepareHeader(m_PlayWaveOut,m_pWaveHdr, sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
return NULL;
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)
{
switch(uMsg)
{
case WOM_DONE: 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);
}
Please help me.
Thanks and regards,
rammohan